Android ResultsApi使用

前言

对Android ResultsApi的封装,学无止境,会随时间迭代,使用的必要依赖
//Kotlin ViewModel
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0'

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.0'

implementation "androidx.activity:activity-ktx:1.2.0"

implementation "androidx.fragment:fragment-ktx:1.3.0"
复制代码

正文

/**
 * ResultsApi工具类
 * Created by Priscilla Cheung on 2021/7/20/11:58:25
 * info:通过livedata绑定进行监听
 * 使用说明:
 * 1、在BaseActivity和BaseFragment调用initializeApi()进行初始化
 * 2、调用需要的方法
 * 该类提供的方法:
 * @see startActivity 跳转Activity并请求回调
 * @see startCamera 调用相册
 * @see startTakePhotos 调用相机
 * @see startVideo 调用录屏
 * @see startPermission 获取一个权限
 * @see startPermissions 获取一组权限
 * @see startDocument 调用文件管理获取一个文件
 * @see startDocuments 调用文件管理获取多个文件
 * 使用示例 :
 * startCamera(ResultsApi.CAMERA,permissionError = {
 *      toast("未授予权限")
 *  }){
 *      toast(it.toString())
 *  }
 * startDocuments(arrayOf(ResultsApi.CAMERA)){
 *       toast(it.toString())
 *  }
 */
object ResultsApi {
    //作为Camera的参数使用,意为筛选
    val CAMERA = "image/*"
    val VIDEO = "video/*"

    //-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  初始化
     *  info:建议在BaseActivity中调用并实例化,或在onCreate中调用,未初始化时会导致空指针
     */
    fun AppCompatActivity.initializeApi() {
        //跳转Activity并请求回传
        resultActivityLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                activityResultData.postValue(it)
            }
        //相册
        resultCameraLauncher =
            registerForActivityResult(ActivityResultContracts.GetContent()) {
                imageUrl.postValue(it)
            }
        //相机
        resultTakePhotosLauncher =
            registerForActivityResult(ActivityResultContracts.TakePicture()) {
                takePhotosUrl.postValue(it)
            }
        //录屏
        resultVideoLauncher =
            registerForActivityResult(ActivityResultContracts.TakeVideo()) {
                videoBitmap.postValue(it)
            }
        //单一权限
        resultPermissionLauncher =
            registerForActivityResult(ActivityResultContracts.RequestPermission()) {
                getPermission.postValue(it)
            }
        //一组权限
        resultPermissionsLauncher =
            registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
                getPermissions.postValue(it)
            }
        //选择单个文件
        resultDocumentLauncher =
            registerForActivityResult(ActivityResultContracts.OpenDocument()) {
                documentUrl.postValue(it)
            }
        //选择多个文件
        resultDocumentsLauncher =
            registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) {
                documentsUrl.postValue(it)
            }
    }

    fun Fragment.initializeApi() {
        //跳转Activity并请求回传
        resultActivityLauncher =
            registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                activityResultData.postValue(it)
            }
        //相册
        resultCameraLauncher =
            registerForActivityResult(ActivityResultContracts.GetContent()) {
                imageUrl.postValue(it)
            }
        //相机
        resultTakePhotosLauncher =
            registerForActivityResult(ActivityResultContracts.TakePicture()) {
                takePhotosUrl.postValue(it)
            }
        //录屏
        resultVideoLauncher =
            registerForActivityResult(ActivityResultContracts.TakeVideo()) {
                videoBitmap.postValue(it)
            }
        //单一权限
        resultPermissionLauncher =
            registerForActivityResult(ActivityResultContracts.RequestPermission()) {
                getPermission.postValue(it)
            }
        //一组权限
        resultPermissionsLauncher =
            registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
                getPermissions.postValue(it)
            }
        //选择单个文件
        resultDocumentLauncher =
            registerForActivityResult(ActivityResultContracts.OpenDocument()) {
                documentUrl.postValue(it)
            }
        //选择多个文件
        resultDocumentsLauncher =
            registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) {
                documentsUrl.postValue(it)
            }
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  跳转Activity并请求回调
     */
    private var resultActivityLauncher: ActivityResultLauncher<Intent>? = null

    /**
     * output: 返回一个Uri路径
     */
    val activityResultData: MutableLiveData<ActivityResult> by lazy {
        MutableLiveData<ActivityResult>()
    }

    /**
     * input:
     * @param intent 传入意图
     * @param result 返回的数据
     */
    fun AppCompatActivity.startActivity(intent: Intent,result:(ActivityResult)->Unit) {
        activityResultData.observe(this){
            preventRepeated {
                result.invoke(it)
            }
        }
        resultActivityLauncher!!.launch(intent)
    }
    fun Fragment.startActivity(intent: Intent,result:(ActivityResult)->Unit) {
        activityResultData.observe(this){
            preventRepeated {
                result.invoke(it)
            }
        }
        resultActivityLauncher!!.launch(intent)
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  调用相册
     */
    private var resultCameraLauncher: ActivityResultLauncher<String>? = null

    /**
     * output: 返回一个Uri路径
     */
    val imageUrl: MutableLiveData<Uri> by lazy {
        MutableLiveData<Uri>()
    }

    /**
     * input:
     * @param type 一般传入CAMERA,可以自定义筛选类型
     * @param permissionError 缺少权限时执行的操作
     * @param result 拥有权限时所执行的结果
     */
    fun AppCompatActivity.startCamera(type: String,permissionError:(()->Unit)? = null, result: (Uri) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if(it) {
                imageUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultCameraLauncher!!.launch(type)
            }else permissionError?.invoke()
        }
    }
    fun Fragment.startCamera(type: String,permissionError:(()->Unit)? = null, result: (Uri) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if(it) {
                imageUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultCameraLauncher!!.launch(type)
            }else permissionError?.invoke()
        }
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  调用相机
     */
    private var resultTakePhotosLauncher: ActivityResultLauncher<Uri>? = null

    /**
     * output:返回Boolean,为True表示保存成功,为False表示保存失败
     */
    val takePhotosUrl: MutableLiveData<Boolean> by lazy {
        MutableLiveData<Boolean>()
    }

    /**
     * input:
     * @param context 上下文
     * @param authority Provider的authorities字段
     * @param file 一个文件路径  示例:   File(externalCacheDir, "${System.currentTimeMillis()}priscilla.jpg"))
     * @param permissionError 缺少权限时执行的操作
     * @param result 拥有权限时所执行的结果
     */
    fun AppCompatActivity.startTakePhotos(
        context: Context,
        authority: String,
        file: File,
        permissionError:(()->Unit)? = null,
        result: (Uri, Boolean) -> Unit,
    ) {
        startPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            if (it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!! && it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!!){
                val uri = FileProvider.getUriForFile(
                    context,
                    authority,
                    file)
                takePhotosUrl.observe(this) {
                    preventRepeated {
                        result.invoke(uri, it)
                    }
                }
                resultTakePhotosLauncher!!.launch(uri)
            }  else permissionError?.invoke()
        }
    }

    fun Fragment.startTakePhotos(
        context: Context,
        authority: String,
        file: File,
        permissionError:(()->Unit)? = null,
        result: (Uri, Boolean) -> Unit,
    ) {
        startPermissions(arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            if (it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!! && it[android.Manifest.permission.WRITE_EXTERNAL_STORAGE]!!){
                val uri = FileProvider.getUriForFile(
                    context,
                    authority,
                    file)
                takePhotosUrl.observe(this) {
                    preventRepeated {
                        result.invoke(uri, it)
                    }
                }
                resultTakePhotosLauncher!!.launch(uri)
            }  else permissionError?.invoke()
        }
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  调用录屏
     */
    private var resultVideoLauncher: ActivityResultLauncher<Uri>? = null

    /**
     * output:Bitmap,该bitmap为视频缩略图,视频保存至所传路径
     */
    val videoBitmap: MutableLiveData<Bitmap> by lazy {
        MutableLiveData<Bitmap>()
    }

    /**
     * input:
     * @param context 上下文
     * @param authority Provider的authorities字段
     * @param file 一个文件路径  示例:   File(externalCacheDir, "${System.currentTimeMillis()}priscilla.mp4"))
     * @param videoUrl 返回文件路径和视频缩略图
     */

    fun AppCompatActivity.startVideo(
        context: Context,
        authority: String,
        file: File,
        videoUrl: (Uri, Bitmap) -> Unit,
    ) {
        val uri = FileProvider.getUriForFile(
            context,
            authority,
            file)
        videoBitmap.observe(this) {
            preventRepeated {
                videoUrl.invoke(uri, it)
            }
        }
        resultVideoLauncher!!.launch(uri)
    }

    fun Fragment.startVideo(
        context: Context,
        authority: String,
        file: File,
        videoUrl: (Uri, Bitmap) -> Unit,
    ) {
        val uri = FileProvider.getUriForFile(
            context,
            authority,
            file)
        videoBitmap.observe(this) {
            preventRepeated {
                videoUrl.invoke(uri, it)
            }
        }
        resultVideoLauncher!!.launch(uri)
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     * @author Priscilla
     * 单一权限
     */
    private var resultPermissionLauncher: ActivityResultLauncher<String>? = null

    /**
     * output:返回一个可读写委托,为True时授予成功,为False授予失败
     */
    val getPermission: MutableLiveData<Boolean> by lazy {
        MutableLiveData<Boolean>()
    }

    /**
     * input:
     * @param permission 要请求的权限 示例:android.Manifest.permission.WRITE_EXTERNAL_STORAGE
     */
    fun AppCompatActivity.startPermission(permission: String, havePermission: (Boolean) -> Unit) {
        getPermission.observe(this) {
            preventRepeated {
                havePermission.invoke(it)
            }
        }
        //单一权限请求
        resultPermissionLauncher!!.launch(permission)
    }

    fun Fragment.startPermission(permission: String, havePermission: (Boolean) -> Unit) {
        getPermission.observe(this) {
            preventRepeated {
                havePermission.invoke(it)
            }
        }
        //单一权限请求
        resultPermissionLauncher!!.launch(permission)
    }
//-------------------------------------------------------------------------------------------------//

    //-------------------------------------------------------------------------------------------------//
    /**
     * @author Priscilla
     * 一组权限
     */
    private var resultPermissionsLauncher: ActivityResultLauncher<Array<String>>? = null

    /**
     * output:返回一个可读写委托,为True时授予成功,为False授予失败
     */
    val getPermissions: MutableLiveData<MutableMap<String, Boolean>> by lazy {
        MutableLiveData<MutableMap<String, Boolean>>()
    }

    /**
     * input:
     * @param permission 要请求的权限数组
     */
    fun AppCompatActivity.startPermissions(
        permission: Array<String>,
        havePermission: (MutableMap<String, Boolean>) -> Unit,
    ) {
        //一组权限请求
        getPermissions.observe(this) {
            preventRepeated {
                havePermission.invoke(it)
            }
        }
        //一组权限请求
        resultPermissionsLauncher!!.launch(permission)
    }

    fun Fragment.startPermissions(
        permission: Array<String>,
        havePermission: (MutableMap<String, Boolean>) -> Unit,
    ) {
        //一组权限请求
        getPermissions.observe(this) {
            preventRepeated {
                havePermission.invoke(it)
            }
        }
        //一组权限请求
        resultPermissionsLauncher!!.launch(permission)
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  调用文件
     */
    private var resultDocumentLauncher: ActivityResultLauncher<Array<String>>? = null

    /**
     * output: 返回一个Uri路径
     */
    val documentUrl: MutableLiveData<Uri> by lazy {
        MutableLiveData<Uri>()
    }

    /**
     * input:
     * @param type 筛选类型
     */
    fun AppCompatActivity.startDocument(type: Array<String>, permissionError:(()->Unit)? = null,
                      result: (Uri) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if (it){
                documentUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultDocumentLauncher!!.launch(type)

            }else permissionError?.invoke()
        }
    }
    fun Fragment.startDocument(type: Array<String>, permissionError:(()->Unit)? = null,
                                        result: (Uri) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if (it){
                documentUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultDocumentLauncher!!.launch(type)

            }else permissionError?.invoke()
        }
    }
//-------------------------------------------------------------------------------------------------//

//-------------------------------------------------------------------------------------------------//
    /**
     *  @author Priscilla
     *  调用文件组
     */
    private var resultDocumentsLauncher: ActivityResultLauncher<Array<String>>? = null

    /**
     * output: 返回一个组Uri路径
     */
    val documentsUrl: MutableLiveData<MutableList<Uri>> by lazy {
        MutableLiveData<MutableList<Uri>>()
    }

    /**
     * input:
     * @param type 筛选类型
     */
    fun AppCompatActivity.startDocuments(type: Array<String>, permissionError:(()->Unit)? = null,
                       result: (MutableList<Uri>) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if (it){
                documentsUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultDocumentsLauncher!!.launch(type)
            }else permissionError?.invoke()
        }
    }
    fun Fragment.startDocuments(type: Array<String>, permissionError:(()->Unit)? = null,
                                         result: (MutableList<Uri>) -> Unit,) {
        startPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE){
            if (it){
                documentsUrl.observe(this){
                    preventRepeated {
                        result.invoke(it)
                    }
                }
                resultDocumentsLauncher!!.launch(type)
            }else permissionError?.invoke()
        }
    }
    //-------------------------------------------------------------------------------------------------//
    private var lastClickTime: Long = 0
    fun preventRepeated(click: () -> Unit) {
        val time = System.currentTimeMillis()
        val longTime = time - lastClickTime
        if (0 < longTime && longTime > 500) {
            click.invoke()
        }
        lastClickTime = time
    }
}
复制代码

おすすめ

転載: juejin.im/post/7031422320119906340