首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileObserver不使用Android 30

FileObserver不使用Android 30
EN

Stack Overflow用户
提问于 2021-11-01 07:10:29
回答 1查看 441关注 0票数 1

我正在开发一个android应用程序,在这个应用程序中,我使用了FileObserver来获取特定文件夹上的数据更改。该文件夹是WhatsApp图像,每当有一个新文件添加到该文件夹时,当触发onEvent of FileObserver时,我将执行进一步的工作。在我设置targetSdkVersion=29之前,一切都很好,但是当我将项目迁移到targetSdkVersion=30时,FileObserver停止了工作。

下面是我的FileObserver代码

代码语言:javascript
复制
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-尝试在

代码语言:javascript
复制
<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

有人能帮帮我吗?任何帮助都将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-04-22 20:20:53

如所写的这里

运行在Android11上但目标是Android10 (API级别29)的应用程序仍然可以请求requestLegacyExternalStorage属性。此标志允许应用程序暂时退出与作用域存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。在更新应用程序以针对Android 11之后,系统会忽略requestLegacyExternalStorage标志.

基本上,您没有权限“侦听”设备中的外部目录,而是只访问您自己的内部/外部目录。

您应该使用MediaStore API来访问已被操作系统扫描的媒体文件(包括WhatsApp的文件)。

您可以使用像JobService这样的组件来注册新媒体被扫描的事件。

尽情享受

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69793633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档