Android 10 中的 FIleObserver NoSuchMethodError

FIleObserver NoSuchMethodError in Android 10

我有一个 FileObserver(File dir) 在 Android11 中完美运行,但在 Android10 中严重崩溃,以下 LogCat 即使我尝试访问自己的APP私密文件夹(外接sdcard):

E/AndroidRuntime(24651): java.lang.NoSuchMethodError: No direct method <init>(Ljava/io/File;)V
      in class Landroid/os/FileObserver; or its super classes (declaration of
      'android.os.FileObserver' appears in /system/framework/framework.jar!classes2.dex)
E/AndroidRuntime(24651):     at com.floritfoto.apps.xvf.FileChooser.<init>(FileChooser.java:570)
E/AndroidRuntime(24651):     at com.floritfoto.apps.xvf.FileChooser.watchdir(FileChooser.java:570)
E/AndroidRuntime(24651):     at com.floritfoto.apps.xvf.FileChooser.access0(FileChooser.java:53)

我的代码很简单:

private void watchdir(final File dir) {
    if (observer != null) {
        observer.stopWatching();
        observer = null;
    }
    observer = new FileObserver(dir) {   // <===== CRASHES HERE
        @Override
        public void onEvent(int event, String path) {
            event &= FileObserver.ALL_EVENTS;
            ....
        }
    };
    observer.startWatching();
}

observer = new FileObserver(dir) 更改为 observer = new FileObserver(dir.getAbsolutePath()) 效果很好,但 FileObserver(String path)deprecated

我的应用有 compileSdkVersion 31targetSdkVersion 31minSdkVersion 14

至少在某种程度上是这个错误has been reported before,但目前还没有提供解决方案。

编辑: 崩溃发生在 Android 9,而不是 10。

FileObserver(File) is new to API Level 29。您的 minSdkVersion 是 14。您的代码将在 API 级别 28 及更低级别上因此错误而崩溃。你应该收到 Lint 警告之类的警告你 FileObserver(File) 比你的 minSdkVersion.

更新

您的选择是:

  1. 在所有 API 级别上使用 FileObserver(String),尽管有弃用警告。

  2. 在API 14-28级使用FileObserver(String),在API 29+级使用FileObserver(File),使用Build.VERSION.SDK_INT确定您的应用 运行 在设备上的 API 级别。

  3. 将您的 minSdkVersion 设置为 29。

  4. 仅在 API 级别 29+ 上使用 FileObserver,并跳过旧设备上依赖它的任何功能。