Android Koin 框架业务逻辑模块深度剖析(二)

本人公众号,欢迎点击关注:公众号地址

一、引言

在 Android 开发中,业务逻辑模块是应用程序的核心组成部分,它负责处理各种业务规则和流程,将数据层的数据进行加工和处理,为表现层提供所需的数据和操作。Koin 作为一款轻量级的依赖注入框架,能够帮助开发者更好地管理业务逻辑模块中的依赖关系,提高代码的可维护性、可测试性和可扩展性。本文将深入分析 Android Koin 框架在业务逻辑模块中的应用,从源码级别详细解读其工作原理和使用方法。

二、Koin 框架基础概述

2.1 Koin 简介

Koin 是一个基于 Kotlin 的依赖注入框架,它采用函数式编程的方式来定义和管理依赖关系。与传统的依赖注入框架(如 Dagger)相比,Koin 具有简洁的语法和较低的学习成本。Koin 通过模块(Module)来组织依赖关系,每个模块可以包含多个依赖项的定义。

2.2 Koin 的基本使用

以下是一个简单的 Koin 使用示例,展示如何定义一个模块并注入依赖:

kotlin

java 复制代码
import org.koin.dsl.module

// 定义一个 Koin 模块
val myModule = module {
    // 单例模式提供一个 Service 实例
    single { MyService() }
    // 每次请求时创建一个新的 Presenter 实例
    factory { MyPresenter(get()) }
}

// 定义一个 Service 类
class MyService

// 定义一个 Presenter 类,依赖于 MyService
class MyPresenter(private val service: MyService)

在上述代码中,myModule 是一个 Koin 模块,其中 single 关键字用于定义一个单例依赖,factory 关键字用于定义一个每次请求都会创建新实例的依赖。get() 方法用于获取其他依赖项。

三、业务逻辑模块概述

3.1 业务逻辑模块的职责

业务逻辑模块主要负责以下几个方面的工作:

  • 数据处理:对从数据层获取的数据进行加工和转换,使其符合业务需求。
  • 业务规则执行:根据业务规则对数据进行验证、计算和决策。
  • 与其他模块交互:与数据层、表现层等其他模块进行交互,协调数据的流动和处理。

3.2 业务逻辑模块的组成部分

业务逻辑模块通常由以下几个部分组成:

  • 用例(UseCase) :封装具体的业务逻辑,每个用例负责完成一个特定的业务功能。
  • 业务服务(Business Service) :提供一些通用的业务功能,供多个用例共享使用。
  • 业务规则引擎(Business Rule Engine) :负责执行和管理业务规则。

四、用例模块分析

4.1 用例的概念和作用

用例是业务逻辑模块中的核心概念,它代表了一个特定的业务功能或操作。每个用例通常只负责完成一个单一的业务任务,遵循单一职责原则,这样可以提高代码的可维护性和可测试性。用例接收输入数据,经过一系列的业务处理,最终返回处理结果。

4.2 用例的实现

以下是一个简单的用例实现示例,假设我们要实现一个用户登录的用例:

kotlin

java 复制代码
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

// 定义一个用户登录请求的数据模型
data class LoginRequest(val username: String, val password: String)

// 定义一个用户登录响应的数据模型
data class LoginResponse(val success: Boolean, val message: String)

// 定义一个用户登录的用例接口
interface LoginUseCase {
    // 执行登录操作的方法
    suspend fun execute(request: LoginRequest): LoginResponse
}

// 实现用户登录的用例
class LoginUseCaseImpl(
    private val userService: UserService // 依赖于用户服务
) : LoginUseCase {
    override suspend fun execute(request: LoginRequest): LoginResponse {
        // 调用用户服务的验证方法
        val isValid = userService.validateUser(request.username, request.password)
        return if (isValid) {
            // 如果验证成功,返回登录成功的响应
            LoginResponse(true, "Login successful")
        } else {
            // 如果验证失败,返回登录失败的响应
            LoginResponse(false, "Invalid username or password")
        }
    }
}

// 定义一个用户服务接口
interface UserService {
    // 验证用户的方法
    suspend fun validateUser(username: String, password: String): Boolean
}

// 实现用户服务接口
class UserServiceImpl : UserService {
    override suspend fun validateUser(username: String, password: String): Boolean {
        // 这里简单模拟验证逻辑,实际应用中应该从数据库或网络获取用户信息进行验证
        return username == "admin" && password == "password"
    }
}

在上述代码中,LoginRequestLoginResponse 分别是用户登录请求和响应的数据模型。LoginUseCase 是用户登录用例的接口,定义了执行登录操作的方法。LoginUseCaseImpl 是该用例的实现类,依赖于 UserService 来验证用户信息。UserService 是用户服务的接口,UserServiceImpl 是其实现类,负责验证用户信息。

4.3 在 Koin 中注入用例

以下是如何在 Koin 中注入用例的示例:

kotlin

java 复制代码
import org.koin.dsl.module

// 定义一个 Koin 模块,用于注入用例和服务
val useCaseModule = module {
    // 单例模式提供 UserService 实例
    single { UserServiceImpl() }
    // 每次请求时创建一个新的 LoginUseCase 实例
    factory { LoginUseCaseImpl(get()) }
}

在上述代码中,useCaseModule 是一个 Koin 模块,使用 single 关键字定义了一个单例的 UserService 实例,使用 factory 关键字定义了一个每次请求都会创建新实例的 LoginUseCase 实例。get() 方法用于获取 UserService 实例,作为 LoginUseCaseImpl 构造函数的参数。

4.4 用例的测试

为了保证用例的正确性,需要对其进行单元测试。以下是一个使用 JUnit 和 Mockito 对 LoginUseCaseImpl 进行单元测试的示例:

kotlin

java 复制代码
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations

// 测试 LoginUseCaseImpl 类
@OptIn(ExperimentalCoroutinesApi::class)
class LoginUseCaseImplTest {
    @Mock
    private lateinit var userService: UserService
    private lateinit var loginUseCase: LoginUseCase

    @Before
    fun setUp() {
        // 初始化 Mock 对象
        MockitoAnnotations.openMocks(this)
        // 创建 LoginUseCase 实例
        loginUseCase = LoginUseCaseImpl(userService)
    }

    @Test
    fun `execute should return success response when user is valid`() = runTest {
        // 模拟用户服务验证成功
        Mockito.`when`(userService.validateUser("admin", "password")).thenReturn(true)
        // 创建登录请求
        val request = LoginRequest("admin", "password")
        // 执行登录用例
        val response = loginUseCase.execute(request)
        // 验证登录响应是否为成功
        assert(response.success)
    }

    @Test
    fun `execute should return failure response when user is invalid`() = runTest {
        // 模拟用户服务验证失败
        Mockito.`when`(userService.validateUser("invalid", "password")).thenReturn(false)
        // 创建登录请求
        val request = LoginRequest("invalid", "password")
        // 执行登录用例
        val response = loginUseCase.execute(request)
        // 验证登录响应是否为失败
        assert(!response.success)
    }
}

在上述代码中,使用 Mockito 框架创建了 UserService 的 Mock 对象,并使用 JUnit 进行单元测试。在 setUp 方法中初始化 Mock 对象和 LoginUseCase 实例。在 execute should return success response when user is valid 测试方法中,模拟用户服务验证成功,执行登录用例并验证登录响应是否为成功。在 execute should return failure response when user is invalid 测试方法中,模拟用户服务验证失败,执行登录用例并验证登录响应是否为失败。

五、业务服务模块分析

5.1 业务服务的概念和作用

业务服务是业务逻辑模块中的一个重要组成部分,它提供了一些通用的业务功能,供多个用例共享使用。业务服务可以封装一些复杂的业务逻辑,避免在多个用例中重复编写相同的代码,提高代码的复用性。

5.2 业务服务的实现

以下是一个简单的业务服务实现示例,假设我们要实现一个用户信息管理的业务服务:

kotlin

java 复制代码
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

// 定义一个用户信息的数据模型
data class UserInfo(val id: Int, val username: String, val email: String)

// 定义一个用户信息管理的业务服务接口
interface UserInfoService {
    // 获取用户信息的方法
    suspend fun getUserInfo(userId: Int): UserInfo?
    // 更新用户信息的方法
    suspend fun updateUserInfo(userInfo: UserInfo): Boolean
}

// 实现用户信息管理的业务服务
class UserInfoServiceImpl(
    private val userRepository: UserRepository // 依赖于用户仓库
) : UserInfoService {
    override suspend fun getUserInfo(userId: Int): UserInfo? {
        // 调用用户仓库的获取用户信息方法
        return userRepository.getUserInfo(userId)
    }

    override suspend fun updateUserInfo(userInfo: UserInfo): Boolean {
        // 调用用户仓库的更新用户信息方法
        return userRepository.updateUserInfo(userInfo)
    }
}

// 定义一个用户仓库接口
interface UserRepository {
    // 获取用户信息的方法
    suspend fun getUserInfo(userId: Int): UserInfo?
    // 更新用户信息的方法
    suspend fun updateUserInfo(userInfo: UserInfo): Boolean
}

// 实现用户仓库接口
class UserRepositoryImpl : UserRepository {
    // 模拟用户信息存储
    private val userInfoMap = mutableMapOf<Int, UserInfo>()

    override suspend fun getUserInfo(userId: Int): UserInfo? {
        // 从模拟存储中获取用户信息
        return userInfoMap[userId]
    }

    override suspend fun updateUserInfo(userInfo: UserInfo): Boolean {
        // 更新模拟存储中的用户信息
        userInfoMap[userInfo.id] = userInfo
        return true
    }
}

在上述代码中,UserInfo 是用户信息的数据模型。UserInfoService 是用户信息管理的业务服务接口,定义了获取用户信息和更新用户信息的方法。UserInfoServiceImpl 是该业务服务的实现类,依赖于 UserRepository 来获取和更新用户信息。UserRepository 是用户仓库的接口,UserRepositoryImpl 是其实现类,负责模拟用户信息的存储和操作。

5.3 在 Koin 中注入业务服务

以下是如何在 Koin 中注入业务服务的示例:

kotlin

java 复制代码
import org.koin.dsl.module

// 定义一个 Koin 模块,用于注入业务服务和仓库
val businessServiceModule = module {
    // 单例模式提供 UserRepository 实例
    single { UserRepositoryImpl() }
    // 单例模式提供 UserInfoService 实例
    single { UserInfoServiceImpl(get()) }
}

在上述代码中,businessServiceModule 是一个 Koin 模块,使用 single 关键字定义了一个单例的 UserRepository 实例和一个单例的 UserInfoService 实例。get() 方法用于获取 UserRepository 实例,作为 UserInfoServiceImpl 构造函数的参数。

5.4 业务服务的测试

同样,为了保证业务服务的正确性,需要对其进行单元测试。以下是一个使用 JUnit 和 Mockito 对 UserInfoServiceImpl 进行单元测试的示例:

kotlin

java 复制代码
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations

// 测试 UserInfoServiceImpl 类
@OptIn(ExperimentalCoroutinesApi::class)
class UserInfoServiceImplTest {
    @Mock
    private lateinit var userRepository: UserRepository
    private lateinit var userInfoService: UserInfoService

    @Before
    fun setUp() {
        // 初始化 Mock 对象
        MockitoAnnotations.openMocks(this)
        // 创建 UserInfoService 实例
        userInfoService = UserInfoServiceImpl(userRepository)
    }

    @Test
    fun `getUserInfo should return user info when user exists`() = runTest {
        // 模拟用户仓库返回用户信息
        val userInfo = UserInfo(1, "test", "[email protected]")
        Mockito.`when`(userRepository.getUserInfo(1)).thenReturn(userInfo)
        // 调用业务服务的获取用户信息方法
        val result = userInfoService.getUserInfo(1)
        // 验证返回的用户信息是否正确
        assert(result == userInfo)
    }

    @Test
    fun `updateUserInfo should return true when update is successful`() = runTest {
        // 模拟用户仓库更新用户信息成功
        Mockito.`when`(userRepository.updateUserInfo(any())).thenReturn(true)
        // 创建用户信息
        val userInfo = UserInfo(1, "test", "[email protected]")
        // 调用业务服务的更新用户信息方法
        val result = userInfoService.updateUserInfo(userInfo)
        // 验证更新结果是否为成功
        assert(result)
    }
}

在上述代码中,使用 Mockito 框架创建了 UserRepository 的 Mock 对象,并使用 JUnit 进行单元测试。在 setUp 方法中初始化 Mock 对象和 UserInfoService 实例。在 getUserInfo should return user info when user exists 测试方法中,模拟用户仓库返回用户信息,调用业务服务的获取用户信息方法并验证返回的用户信息是否正确。在 updateUserInfo should return true when update is successful 测试方法中,模拟用户仓库更新用户信息成功,调用业务服务的更新用户信息方法并验证更新结果是否为成功。

六、业务规则引擎模块分析

6.1 业务规则引擎的概念和作用

业务规则引擎是业务逻辑模块中的一个重要组成部分,它负责执行和管理业务规则。业务规则通常是一些条件和操作的组合,根据不同的业务场景和需求进行定义。业务规则引擎可以动态地加载、执行和管理这些规则,提高业务逻辑的灵活性和可维护性。

6.2 业务规则引擎的实现

以下是一个简单的业务规则引擎实现示例,假设我们要实现一个订单折扣计算的业务规则引擎:

kotlin

java 复制代码
import kotlin.reflect.KClass

// 定义一个订单的数据模型
data class Order(val id: Int, val amount: Double)

// 定义一个业务规则接口
interface BusinessRule<T> {
    // 执行规则的方法
    fun execute(data: T): Boolean
}

// 定义一个订单折扣规则
class OrderDiscountRule(private val discountThreshold: Double, private val discountRate: Double) : BusinessRule<Order> {
    override fun execute(data: Order): Boolean {
        // 如果订单金额超过折扣阈值,则应用折扣
        return if (data.amount >= discountThreshold) {
            println("Applying ${discountRate * 100}% discount to order ${data.id}")
            true
        } else {
            false
        }
    }
}

// 定义一个业务规则引擎类
class BusinessRuleEngine<T> {
    // 存储业务规则的列表
    private val rules = mutableListOf<BusinessRule<T>>()

    // 添加业务规则的方法
    fun addRule(rule: BusinessRule<T>) {
        rules.add(rule)
    }

    // 执行所有业务规则的方法
    fun executeRules(data: T) {
        rules.forEach { rule ->
            rule.execute(data)
        }
    }
}

在上述代码中,Order 是订单的数据模型。BusinessRule 是业务规则的接口,定义了执行规则的方法。OrderDiscountRule 是一个具体的订单折扣规则,根据订单金额是否超过折扣阈值来决定是否应用折扣。BusinessRuleEngine 是业务规则引擎类,负责存储和执行业务规则。

6.3 在 Koin 中注入业务规则引擎

以下是如何在 Koin 中注入业务规则引擎的示例:

kotlin

java 复制代码
import org.koin.dsl.module

// 定义一个 Koin 模块,用于注入业务规则引擎和规则
val businessRuleEngineModule = module {
    // 单例模式提供 BusinessRuleEngine 实例
    single { BusinessRuleEngine<Order>() }
    // 单例模式提供 OrderDiscountRule 实例
    single { OrderDiscountRule(100.0, 0.1) }
    // 在 BusinessRuleEngine 实例创建后,添加 OrderDiscountRule 规则
    single {
        val engine = get<BusinessRuleEngine<Order>>()
        val rule = get<OrderDiscountRule>()
        engine.addRule(rule)
        engine
    }
}

在上述代码中,businessRuleEngineModule 是一个 Koin 模块,使用 single 关键字定义了一个单例的 BusinessRuleEngine 实例和一个单例的 OrderDiscountRule 实例。在最后一个 single 定义中,获取 BusinessRuleEngine 实例和 OrderDiscountRule 实例,并将规则添加到引擎中。

6.4 业务规则引擎的测试

为了保证业务规则引擎的正确性,需要对其进行单元测试。以下是一个使用 JUnit 对 BusinessRuleEngine 进行单元测试的示例:

kotlin

java 复制代码
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.MockitoAnnotations

// 测试 BusinessRuleEngine 类
class BusinessRuleEngineTest {
    private lateinit var businessRuleEngine: BusinessRuleEngine<Order>
    @Mock
    private lateinit var orderDiscountRule: OrderDiscountRule

    @Before
    fun setUp() {
        // 初始化 Mock 对象
        MockitoAnnotations.openMocks(this)
        // 创建 BusinessRuleEngine 实例
        businessRuleEngine = BusinessRuleEngine()
        // 添加订单折扣规则
        businessRuleEngine.addRule(orderDiscountRule)
    }

    @Test
    fun `executeRules should call execute on all rules`() {
        // 创建订单
        val order = Order(1, 200.0)
        // 调用业务规则引擎的执行规则方法
        businessRuleEngine.executeRules(order)
        // 验证订单折扣规则的 execute 方法是否被调用
        Mockito.verify(orderDiscountRule).execute(order)
    }
}

在上述代码中,使用 Mockito 框架创建了 OrderDiscountRule 的 Mock 对象,并使用 JUnit 进行单元测试。在 setUp 方法中初始化 Mock 对象和 BusinessRuleEngine 实例,并添加订单折扣规则。在 executeRules should call execute on all rules 测试方法中,创建订单并调用业务规则引擎的执行规则方法,验证订单折扣规则的 execute 方法是否被调用。

七、业务逻辑模块的优化与扩展

7.1 代码复用与抽象

在业务逻辑模块中,为了提高代码的复用性和可维护性,可以对一些通用的业务逻辑进行抽象和封装。例如,可以将一些常用的数据处理方法、验证逻辑等提取到一个工具类中,供多个用例和业务服务共享使用。

以下是一个简单的数据处理工具类示例:

kotlin

java 复制代码
object DataProcessingUtils {
    // 计算平均值的方法
    fun calculateAverage(numbers: List<Double>): Double {
        if (numbers.isEmpty()) {
            return 0.0
        }
        val sum = numbers.sum()
        return sum / numbers.size
    }

    // 验证字符串是否为空的方法
    fun isStringEmpty(str: String?): Boolean {
        return str == null || str.trim().isEmpty()
    }
}

在上述代码中,DataProcessingUtils 是一个工具类,包含了计算平均值和验证字符串是否为空的方法。这些方法可以在多个用例和业务服务中使用,提高了代码的复用性。

7.2 异步处理与并发控制

在业务逻辑模块中,有些业务操作可能会比较耗时,如网络请求、数据库操作等。为了避免阻塞主线程,提高应用的响应性能,需要对这些操作进行异步处理。Kotlin 提供了协程(Coroutine)来实现异步编程,我们可以在业务逻辑中使用协程来处理异步操作。

以下是一个使用协程进行异步处理的示例:

kotlin

java 复制代码
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

// 定义一个异步业务服务接口
interface AsyncBusinessService {
    // 异步执行任务的方法
    fun executeAsync()
}

// 实现异步业务服务接口
class AsyncBusinessServiceImpl : AsyncBusinessService {
    override fun executeAsync() {
        // 创建一个协程作用域
        CoroutineScope(Dispatchers.IO).launch {
            // 模拟一个耗时操作
            Thread.sleep(2000)
            println("Async task completed")
        }
    }
}

在上述代码中,AsyncBusinessService 是一个异步业务服务接口,定义了异步执行任务的方法。AsyncBusinessServiceImpl 是该接口的实现类,使用 CoroutineScopelaunch 方法在 Dispatchers.IO 线程池中启动一个协程,模拟一个耗时操作。

7.3 业务逻辑模块的扩展

随着业务的发展,业务逻辑模块可能需要进行扩展以支持更多的功能。以下是一些常见的扩展方法:

  • 添加新的用例:根据新的业务需求,添加新的用例来处理特定的业务功能。

  • 扩展业务服务:在现有的业务服务中添加新的方法,或者创建新的业务服务来提供更多的业务功能。

  • 更新业务规则:根据业务规则的变化,更新业务规则引擎中的规则。

以下是一个添加新用例的示例:

kotlin

java 复制代码
// 定义一个新的业务需求,用户注册用例
data class RegisterRequest(val username: String, val password: String, val email: String)
data class RegisterResponse(val success: Boolean, val message: String)

interface RegisterUseCase {
    suspend fun execute(request: RegisterRequest): RegisterResponse
}

class RegisterUseCaseImpl(
    private val userService: UserService
) : RegisterUseCase {
    override suspend fun execute(request: RegisterRequest): RegisterResponse {
        // 简单模拟注册逻辑,实际应用中应该调用用户服务进行注册操作
        return if (userService.validateUsername(request.username)) {
            RegisterResponse(true, "Registration successful")
        } else {
            RegisterResponse(false, "Username already exists")
        }
    }
}

// 在 Koin 模块中添加新用例的注入
val extendedUseCaseModule = module {
    single { UserService() }
    factory { RegisterUseCaseImpl(get()) }
}

在上述代码中,定义了一个新的用户注册用例,包括请求和响应的数据模型、用例接口和实现类。然后在 Koin 模块中添加了新用例的注入。

八、总结与展望

8.1 总结

通过对 Android Koin 框架业务逻辑模块的深入分析,我们可以看到 Koin 在业务逻辑模块中的应用能够有效地管理依赖关系,提高代码的可维护性、可测试性和可扩展性。业务逻辑模块主要由用例、业务服务和业务规则引擎组成,每个部分都有其特定的职责和作用。

用例封装了具体的业务逻辑,每个用例负责完成一个特定的业务功能,遵循单一职责原则。业务服务提供了一些通用的业务功能,供多个用例共享使用,提高了代码的复用性。业务规则引擎负责执行和管理业务规则,提高了业务逻辑的灵活性和可维护性。

在 Koin 中,我们可以通过模块来组织和注入业务逻辑模块中的依赖关系,使得代码更加清晰和易于管理。同时,通过单元测试可以保证业务逻辑模块的正确性,提高代码的质量。

8.2 展望

随着 Android 开发技术的不断发展,Koin 框架在业务逻辑模块中的应用也将不断完善和扩展。未来,我们可以期待以下几个方面的发展:

  • 更强大的依赖注入功能:Koin 可能会提供更强大的依赖注入功能,如支持更多的注入方式、更灵活的依赖作用域管理等,以满足不同的业务需求。

  • 与其他框架的深度集成:Koin 可能会更好地与其他 Android 框架(如 MVVM、MVP 等)集成,提供更完整的开发解决方案。

  • 自动化代码生成工具:可能会出现一些基于 Koin 的自动化代码生成工具,帮助开发者更快速地创建和管理业务逻辑模块中的代码。

  • 性能优化和调试工具:为了提高业务逻辑模块的性能和开发效率,Koin 可能会提供一些性能优化和调试工具,如依赖注入分析、性能监测等。

总之,Android Koin 框架在业务逻辑模块中的应用具有很大的潜力,未来的发展前景十分广阔。开发者可以充分利用 Koin 的优势,构建出更加高效、可维护和可扩展的业务逻辑模块。

相关推荐
ŧ榕树先生3 小时前
稳定的Android studio版本安装教程
android·ide·android studio
早上好啊! 树哥3 小时前
常见的文件加密方式之【异或加密】,代入原理看例子,帮助更好的理解。
android·java·junit
沅霖5 小时前
Android: Handler 的用法详解
android
鸿蒙布道师5 小时前
鸿蒙NEXT开发数值工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
Yang-Never6 小时前
Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移
android·开发语言·kotlin·android studio·贴图
粤M温同学6 小时前
使用Android 原生LocationManager获取经纬度
android
stevenzqzq7 小时前
Android Hilt 教程
android
CYRUS_STUDIO7 小时前
Frida Stalker Trace 指令跟踪&寄存器变化监控
android·逆向·汇编语言
bst@微胖子7 小时前
Flutter之设计与主题&字体
android·flutter
深圳之光9 小时前
增加android 禁用相机后摄的接口
android·数码相机