Android 调用系统相册,选择音频视频图片,封装onActivityResult

MainActivity

    private fun selectPhoto() {
        SelectorUtil(this)
            .select(SelectType.IMAGE)
            .result {
                Log.d(TAG, "selectPhoto: $it")
            }
    }
 D/SelectorUtil: SelectorUtil.init(): 
 D/SelectorUtil: SelectorFragment.onCreate(): 
 D/SelectorUtil: SelectorFragment.select(): 
 D/SelectorUtil: SelectorFragment.onActivityResult(): /storage/emulated/0/DCIM/Camera/mishop_export_1598959243646.jpg

SelectorUtil

  • 设计思想同RxPermission,在Fragment中进行操作,封装onActivityResult,并通过回调将结果返回
package com.zhangyu.myapplication

import android.app.Activity.RESULT_OK
import android.content.Intent
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity


private const val REQUEST_CODE_SELECT = 112
private const val TAG = "SelectorUtil"

private lateinit var selectType: SelectType

enum class SelectType(var externalContentUri: Uri, var data: String) {
    AUDIO(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.Audio.Media.DATA),
    VIDEO(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, MediaStore.Video.Media.DATA),
    IMAGE(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, MediaStore.Images.Media.DATA);
}


class SelectorUtil(activity: FragmentActivity) {

    private val fragment = SelectorFragment.newInstance()

    init {
        Log.d(TAG, "SelectorUtil.init(): ")
        activity.supportFragmentManager.beginTransaction()
            .add(fragment, "tag")
            .commitNow()
    }

    fun select(selectTp: SelectType): SelectorUtil {
        selectType = selectTp
        return this
    }

    fun result(res: (path: String) -> Unit) {
        fragment.result = res
        fragment.select(selectType)
    }
}

class SelectorFragment : Fragment() {
    companion object {
        fun newInstance() = SelectorFragment()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(TAG, "SelectorFragment.onCreate(): ")
    }

    var result: (path: String) -> Unit = {}

    fun select(selectType: SelectType) {
        Log.d(TAG, "SelectorFragment.select(): ")
        val i = Intent(Intent.ACTION_PICK, selectType.externalContentUri)
        startActivityForResult(i, REQUEST_CODE_SELECT)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        var path = ""
        if (requestCode == REQUEST_CODE_SELECT && resultCode == RESULT_OK && null != data) {
            val uri = data.data
            val filePathColumn = arrayOf(selectType.data)
            val cursor: Cursor? = activity!!.contentResolver.query(
                uri!!,
                filePathColumn, null, null, null
            )
            cursor?.let {
                cursor.moveToFirst()
                val columnIndex: Int = cursor.getColumnIndex(filePathColumn[0])
                path = cursor.getString(columnIndex)
                cursor.close()
                result.invoke(path)
            }
        }
        Log.d(TAG, "SelectorFragment.onActivityResult(): $path")
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值