From 8b3df98765851e5b6a7f88548330297b34fa1eeb Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Tue, 04 Nov 2025 14:20:11 +0000
Subject: [PATCH] path改 uri

---
 libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt |  107 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 75 insertions(+), 32 deletions(-)

diff --git a/libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt b/libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt
index ff9677e..a1af7d6 100644
--- a/libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt
+++ b/libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt
@@ -32,6 +32,7 @@
 import androidx.activity.result.ActivityResultLauncher
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.annotation.ColorRes
+import androidx.annotation.StringDef
 import androidx.annotation.StringRes
 import androidx.core.content.ContextCompat
 import androidx.lifecycle.Observer
@@ -39,6 +40,7 @@
 import com.runt.open.mvi.R
 import com.runt.open.mvi.base.model.BaseViewModel
 import com.runt.open.mvi.base.model.ViewModelFactory
+import com.runt.open.mvi.utils.FileUtils
 import com.runt.open.mvi.utils.PreferencesUtils
 import java.io.File
 import java.lang.reflect.ParameterizedType
@@ -63,9 +65,10 @@
 
     val PARAMS_TITLE = "title"
 
-    private var requestFileResult:Observer<List<String>>? = null;
+    private var requestFileResult:Observer<List<Uri>>? = null;
 
     private var fileLauncher : ActivityResultLauncher<Intent>? = null //选择文件
+    private var multipleFileLauncher : ActivityResultLauncher<Array<String>>? = null //选择文件
     private var filePermissionLauncher : ActivityResultLauncher<Intent>? = null //文件权限
     private val fileUriList = mutableListOf<Uri>()
 
@@ -99,6 +102,36 @@
         initViews() //初始化UI
         mViewModel!!.onCreate(this  as BaseActivity<LayoutView<BaseViewModel> , BaseViewModel>)
         loadData() //加载数据
+    }
+
+    override fun onPause() {
+        super.onPause()
+        mViewModel!!.onPause()
+        Log.i(TAG , "onPause: ")
+    }
+
+    override fun onResume() {
+        super.onResume()
+        mViewModel!!.onResume()
+        Log.i(TAG , "onResume: ")
+    }
+
+    override fun onStart() {
+        super.onStart()
+        mViewModel!!.onStart()
+        Log.i(TAG , "onStart: ")
+    }
+
+    override fun onStop() {
+        super.onStop()
+        mViewModel!!.onStop()
+        Log.i(TAG , "onStop: ")
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        mViewModel!!.onDestroy()
+        Log.i(TAG , "onDestroy: ")
     }
 
     abstract fun init()
@@ -137,6 +170,17 @@
             Log.i(TAG,"filePermission ${result}")
             onRequestFileResult();
         }
+        multipleFileLauncher = registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris ->
+            fileUriList.clear();
+            fileUriList.addAll(uris);
+            Log.i(TAG,"multipleFileLauncher ${uris}")
+            if(fileUriList.size == 0){
+                requestFileResult?.onChanged(ArrayList())
+            }else{
+                onRequestFileResult();
+            }
+        }
+
         //选择文件
         fileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult() , object : ActivityResultCallback<ActivityResult?> {
             override fun onActivityResult(result : ActivityResult?) {
@@ -165,7 +209,7 @@
 
         val cR : ContentResolver = getContentResolver()
         val mime = MimeTypeMap.getSingleton()
-        var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(0)!!);
+        var filePath = FileUtils.getFilePathFromUri(fileUriList.get(0)!!);
         //文件不存在或读写权限受限
         if(filePath == null){
             //android 11需要申请权限 //是否有所有问读写权限
@@ -179,16 +223,15 @@
             }
             requestFileResult?.onChanged(ArrayList())
         }else{
-            var filePathes = ArrayList<String>()
-            for (i in 0 until fileUriList.size) {
-                var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(i)!!);
-                filePathes.add(filePath!!)
-            }
-            requestFileResult?.onChanged(filePathes)
+            requestFileResult?.onChanged(fileUriList)
         }
     }
 
-    fun requestFile(fileType :String,maxCount:Int = 1,fileResult:Observer<List<String>>){
+    @Retention(AnnotationRetention.SOURCE)
+    @StringDef(Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.READ_EXTERNAL_STORAGE)
+    annotation class ManifestType
+
+    fun requestFile(@ManifestType fileType :String,maxCount:Int = 1,fileResult:Observer<List<Uri>>){
         requestFileResult = fileResult;
         var permissions  = "";
         //android 13 权限申请细化类型
@@ -206,33 +249,33 @@
         requestPermissions(permissions , object :Observer<String>{
             override fun onChanged(value : String) {
                 if(!value.isEmpty()){
-                    var intent = Intent()
-                    // intent.action = Intent.ACTION_PICK
-                    // intent.action = Intent.ACTION_GET_CONTENT
-
-                    //intent.setType("image/*")
                     when(fileType){
-                        Manifest.permission.READ_MEDIA_VIDEO ->{
+                        Manifest.permission.READ_MEDIA_VIDEO,Manifest.permission.READ_MEDIA_IMAGES ->{
+                            var intent = Intent()
                             intent.action = MediaStore.ACTION_PICK_IMAGES
-                            intent.setType("video/*") // 设置文件类型,可以更具体如"application/pdf"
+                            var type = if(fileType == Manifest.permission.READ_MEDIA_VIDEO) "video/*" else "image/*"
+                            intent.setType(type) // 设置文件类型,可以更具体如"application/pdf"
+                            // 设置可多选
+                            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, maxCount > 1);
+                            if(maxCount > 1){
+                                //设置最大数量
+                                intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxCount);
+                            }
+                            fileLauncher!!.launch(intent)
                         }
                         Manifest.permission.READ_MEDIA_AUDIO ->{
-                            intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
-                            intent.setType("audio/*") // 设置文件类型,可以更具体如"application/pdf"
-                        }
-                        Manifest.permission.READ_MEDIA_IMAGES ->{
-                            intent.action = MediaStore.ACTION_PICK_IMAGES
-                            intent.setType("image/*") // 设置文件类型,可以更具体如"application/pdf"
+                            var intent = Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
+                            fileLauncher!!.launch(intent)
+                            //multipleFileLauncher!!.launch(arrayOf("audio/*"
+                            //                                "audio/mp3",   // MP3
+                            //                                "audio/m4a",    // M4A
+                            //                                "audio/aac",    // AAC
+                            //                                "audio/ogg",    // OGG
+                            //                                "audio/wav"     // WAV
+                            //                              ))
                         }
                         else -> {}
                     }
-                    // 设置可多选
-                    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, maxCount > 1);
-                    if(maxCount > 1){
-                        //设置最大数量
-                        intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxCount);
-                    }
-                    fileLauncher!!.launch(intent)
                 }else{
                     requestFileResult?.onChanged(ArrayList())
                 }
@@ -395,7 +438,7 @@
         for (permission in list) {
             if (ContextCompat.checkSelfPermission(this , permission) != PackageManager.PERMISSION_GRANTED) {
                 allGranted = false
-                if (showPop) {
+                if (showPop && !allGranted) {
                     // TODO:
                     var title = ""
                     var message = "";
@@ -421,10 +464,10 @@
                     }*/else if(permissions.contains(Manifest.permission.READ_MEDIA_AUDIO)){
                         title = "申请音频文件权限";
                         message = "     通过音频文件权限后,可将音频文件的声音添加到直播中的音频流中"
-                    }/*else if(permissions.contains(Manifest.permission.POST_NOTIFICATIONS)){
+                    }else if(permissions.contains(Manifest.permission.POST_NOTIFICATIONS)){
                         title = "申请通知栏权限";
                         message = "通过通知栏权限后,可开启后台服务,保证相机、话筒、截屏、扬声器等功能不被系统终止"
-                    }*/
+                    }
                     if(!TextUtils.isEmpty(title)){
                         mViewModel!!.showPopupWindow(title = title, message = message)
                     }

--
Gitblit v1.9.1