我正在开发一个android应用程序,在这个应用程序中,我使用了FileObserver来获取特定文件夹上的数据更改。该文件夹是WhatsApp图像,每当有一个新文件添加到该文件夹时,当触发onEvent of FileObserver时,我将执行进一步的工作。在我设置targetSdkVersion=29之前,一切都很好,但是当我将项目迁移到targetSdkVersion=30时,FileObserver停止了工作。
下面是我的FileObserver代码
import android.os.Environment
import android.os.FileObserver
import android.util.Log
import java.io.File
class WhatsAppImageObserver11(var notify:(msg:String)->Unit) : FileObserver(
File(
Environment.getExternalStorageDirectory().toString(),
Constants.whatsapp_images_path11).toString(), ALL_EVENTS
) {
init {
Log.d("WhatsAppImageObserver11", "start")
}
override fun onEvent(i: Int, str: String?) {
val str2 = "WhatsAppImageObserver11"
if (i == CREATE || i == MOVED_TO && str != ".probe") {
val sb = StringBuilder()
sb.append("create File path--> ")
sb.append(str)
Log.d(str2, sb.toString())
try {
val whatsDeleted = File(
Environment.getExternalStorageDirectory().path,
Constants.whatsapp_reserved_media
)
if(!whatsDeleted.exists()) {
whatsDeleted.mkdirs()
}
val srcFile = File(
Environment.getExternalStorageDirectory(),
Constants.whatsapp_images_path11+str)
val destFile = File(Environment.getExternalStorageDirectory(), Constants.whatsapp_reserved_media+str)
if (srcFile.exists()){
srcFile.copyTo(target = destFile, overwrite = false, bufferSize = DEFAULT_BUFFER_SIZE)
}
} catch (e: Exception) {
val sb2 = StringBuilder()
sb2.append("create error: ")
sb2.append(e.toString())
Log.d(str2, sb2.toString())
}
}
if (i and 512 != 0 || i and 1024 != 0) {
val sb3 = StringBuilder()
sb3.append("dlete File path--> ")
sb3.append(str)
Log.d(str2, sb3.toString())
try {
val whatsDeleted = File(
Environment.getExternalStorageDirectory().path,
Constants.new_whatsapp_deleted_media
)
if(!whatsDeleted.exists()) {
whatsDeleted.mkdirs()
}
val srcFile = File(Environment.getExternalStorageDirectory().path, Constants.whatsapp_reserved_media+str)
val destFile = File(Environment.getExternalStorageDirectory().path, Constants.new_whatsapp_deleted_media+str)
if (srcFile.exists()){
srcFile.copyTo(target = destFile, overwrite = false, bufferSize = DEFAULT_BUFFER_SIZE)
srcFile.delete()
notify(destFile.absolutePath)
}
} catch (e2: Exception) {
val sb4 = StringBuilder()
sb4.append("del error: ")
sb4.append(e2.toString())
Log.d(str2, sb4.toString())
}
}
}
}在此FileObserver中,我将媒体从WhatsApp保留媒体复制到自己的WhatsAppDeleted文件夹中,以实现媒体恢复功能。
我试过什么?
如我所知,Environment.getExternalStorageDirectory()是不受欢迎的,我尝试用mContext.getExternalFilesDir(null).getAbsolutePath()替换它
2-在清单中也使用android:preserveLegacyExternalStorage="true"进行检查。
3-尝试在
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage"/>什么是必需的?
1-路径上的FileObserver "/Android/media/" + WHATSAPP_PKG_NAME + "/WhatsApp/Media/WhatsApp Images/"应该在设置targetSdkVersion-30时触发onEvent
有人能帮帮我吗?任何帮助都将不胜感激。
谢谢
发布于 2022-04-22 20:20:53
如所写的这里
运行在Android11上但目标是Android10 (API级别29)的应用程序仍然可以请求requestLegacyExternalStorage属性。此标志允许应用程序暂时退出与作用域存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。在更新应用程序以针对Android 11之后,系统会忽略requestLegacyExternalStorage标志.。
基本上,您没有权限“侦听”设备中的外部目录,而是只访问您自己的内部/外部目录。
您应该使用MediaStore API来访问已被操作系统扫描的媒体文件(包括WhatsApp的文件)。
您可以使用像JobService这样的组件来注册新媒体被扫描的事件。
尽情享受
https://stackoverflow.com/questions/69793633
复制相似问题