From 47670220de335ea4ff9026db6e8f094153c8ae10 Mon Sep 17 00:00:00 2001
From: Runt <qingingrunt2010@qq.com>
Date: Sun, 05 Apr 2026 10:48:56 +0000
Subject: [PATCH] 音频播放问题修复 反馈图片上传问题修复 版本更新优化
---
libmvi/src/main/java/com/runt/open/mvi/base/BaseActivity.kt | 42 ++++++++++++++++++++++++++++++------------
1 files changed, 30 insertions(+), 12 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 5e1dfb0..bc68f86 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
@@ -1,6 +1,7 @@
package com.runt.open.mvi.base
import android.Manifest
+import android.annotation.SuppressLint
import android.app.ActivityManager
import android.app.UiModeManager
import android.content.ClipData
@@ -40,7 +41,6 @@
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
@@ -183,16 +183,31 @@
//选择文件
fileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult() , object : ActivityResultCallback<ActivityResult?> {
+ @SuppressLint("WrongConstant")
override fun onActivityResult(result : ActivityResult?) {
Log.i(TAG,"fileLauncher ${result!!.data?.data}")
Log.i(TAG,"fileLauncher clipData= ${result!!.data?.clipData}")
fileUriList.clear();
result!!.data?.data?.let{
+ val flags = result!!.data!!.flags and
+ (Intent.FLAG_GRANT_READ_URI_PERMISSION or
+ Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
+
+ // 🔐 持久化权限(核心)
+ contentResolver.takePersistableUriPermission(it, flags)
+ Log.i(TAG , "onRequestFileResult: ${it}")
fileUriList.add(it);
}
result!!.data?.clipData?.let{
val count = it.itemCount
for (i in 0 until count) {
+ val flags = result!!.data!!.flags and
+ (Intent.FLAG_GRANT_READ_URI_PERMISSION or
+ Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
+
+ // 🔐 持久化权限(核心)
+ contentResolver.takePersistableUriPermission(it.getItemAt(i).uri, flags)
+ Log.i(TAG , "onRequestFileResult: ${it.getItemAt(i).uri}")
fileUriList.add(it.getItemAt(i).uri)
}
}
@@ -209,7 +224,7 @@
val cR : ContentResolver = getContentResolver()
val mime = MimeTypeMap.getSingleton()
- var filePath = FileUtils.getFilePathFromUri(fileUriList.get(0)!!);
+ var filePath = fileUriList.get(0)!!.toString()
//文件不存在或读写权限受限
if(filePath == null){
//android 11需要申请权限 //是否有所有问读写权限
@@ -225,15 +240,14 @@
}else{
var filePathes = ArrayList<String>()
for (i in 0 until fileUriList.size) {
- var filePath = FileUtils.getFilePathFromUri(fileUriList.get(i)!!);
- filePathes.add(filePath!!)
+ filePathes.add(fileUriList.get(i)!!.toString())
}
requestFileResult?.onChanged(filePathes)
}
}
@Retention(AnnotationRetention.SOURCE)
- @StringDef(Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_IMAGES)
+ @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<String>>){
@@ -254,9 +268,9 @@
requestPermissions(permissions , object :Observer<String>{
override fun onChanged(value : String) {
if(!value.isEmpty()){
+ var intent = Intent()
when(fileType){
Manifest.permission.READ_MEDIA_VIDEO,Manifest.permission.READ_MEDIA_IMAGES ->{
- var intent = Intent()
intent.action = MediaStore.ACTION_PICK_IMAGES
var type = if(fileType == Manifest.permission.READ_MEDIA_VIDEO) "video/*" else "image/*"
intent.setType(type) // 设置文件类型,可以更具体如"application/pdf"
@@ -266,11 +280,11 @@
//设置最大数量
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxCount);
}
- fileLauncher!!.launch(intent)
}
Manifest.permission.READ_MEDIA_AUDIO ->{
- var intent = Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
- fileLauncher!!.launch(intent)
+ intent = Intent(Intent.ACTION_OPEN_DOCUMENT, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
+ intent.addCategory(Intent.CATEGORY_OPENABLE)
+ intent.putExtra(Intent.EXTRA_MIME_TYPES,arrayOf("audio/*"))
//multipleFileLauncher!!.launch(arrayOf("audio/*"
// "audio/mp3", // MP3
// "audio/m4a", // M4A
@@ -281,6 +295,10 @@
}
else -> {}
}
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
+ intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION)
+ fileLauncher!!.launch(intent)
}else{
requestFileResult?.onChanged(ArrayList())
}
@@ -443,7 +461,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 = "";
@@ -469,10 +487,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