android - 如何在 Android 10 中替换 FileObserver?

标签 android android-10.0 storage-access-framework fileobserver

android.os.FileObserver需要 java.io.File发挥作用。
但是在 Android 10 中,由于著名的“存储访问框架”,Google 限制了对除您应用的私有(private)目录之外的所有内容的访问。因此,通过 java.io.File 访问任何内容中断和渲染 FileObserver除非您打算在应用程序的私有(private)目录中使用它,否则无用。但是,我希望在外部存储的某个目录中发生更改时收到通知。我还想避免定期检查更改。
我尝试使用 ContentResolver.registerContentObserver(uri,notifyForDescendants,observer)并遇到了该方法的一些问题:

  • Uri到目前为止我已插入已被接受
  • 它既不会失败也不会通知 Uri不起作用
  • 我找不到任何文档告诉我哪个 Uri s 实际工作

  • 在某种程度上,我唯一得到的工作是以下方法:
    // works, but returns all changes to the external storage
    contentResolver.registerContentObserver(MediaStore.Files.getContentUri("external"), true, contentObserver)
    
    不幸的是,这包括所有外部存储,并且只返回媒体 Uri s 发生变化时 - 例如 content://media/external/file/67226 .
    有没有办法查出是否 Uri指向我的目录?
    或者有没有办法制作registerContentObserver()Uri 合作每当文件夹中的某些内容发生更改时,我都会收到通知?
    我也没有成功尝试与 DocumentsFile 相关的各种 Uris和外部存储Uri s。

    最佳答案

    甚至在尝试使用基本构造函数时,我不断收到错误,如下所示 -

    No direct method <init>(Ljava/util/List;I)V in class Landroid/os/FileObserver; or its super classes (declaration of 'android.os.FileObserver' appears in /system/framework/framework.jar!classes2.dex)
    
    来自对 Detect file change using FileObserver on Android 的评论:

    I saw that message (or something like that) when i was trying to use constructor FileObserver(File). Use of deprecated FileObserver(String) solved my problem.... Original FileObserver has bugs.


    完全披露,我使用的是 Xamarin.Android API;但是,我引用的要点和评论者都在使用 Java。无论如何,确实 - 再次尝试使用对应的 String构造函数,我终于能够制作和使用观察者。磨砺我的齿轮以使用已弃用的 API,但显然他们至少坚持到并包括 Android 12.0.0_r3 ...仍然,更希望支持的构造函数实际工作。也许这里有一些理由来提出问题。

    关于android - 如何在 Android 10 中替换 FileObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58794468/

    相关文章:

    android - 无法从警报对话框和异常错误中的 RatingBar 获取值 (Android)

    android - 如何检查 Google map v2 中已存在具有相同地理坐标的标记?安卓

    android - 通过 ACTION_OPEN_DOCUMENT 的 takePersistableUriPermission 在自定义文档提供程序上失败但仅适用于 API < 26

    android - 如何使用存储访问框架高效地创建子文件夹?

    android - 我可以在 Jetpack Compose 中使用 Remember 来包装 Modifier 吗?

    android - 保存 RecyclerView 列表状态

    java - 无法使用 mkdir 在 Android Q 中创建文件夹

    Android 10 BLE 连接问题

    android - 如何在 Android Q 中拍照并保存?

    java - 给定用户所选目录的 URI,如何根据参数化文件名读取文件?