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