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")
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐