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 31
、targetSdkVersion 31
和 minSdkVersion 14
。
至少在某种程度上是这个错误has been reported before,但目前还没有提供解决方案。
编辑: 崩溃发生在 Android 9,而不是 10。
FileObserver(File)
is new to API Level 29。您的 minSdkVersion
是 14。您的代码将在 API 级别 28 及更低级别上因此错误而崩溃。你应该收到 Lint 警告之类的警告你 FileObserver(File)
比你的 minSdkVersion
.
更新
您的选择是:
在所有 API 级别上使用 FileObserver(String)
,尽管有弃用警告。
在API 14-28级使用FileObserver(String)
,在API 29+级使用FileObserver(File)
,使用Build.VERSION.SDK_INT
确定您的应用 运行 在设备上的 API 级别。
将您的 minSdkVersion
设置为 29。
仅在 API 级别 29+ 上使用 FileObserver
,并跳过旧设备上依赖它的任何功能。
我有一个 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 31
、targetSdkVersion 31
和 minSdkVersion 14
。
至少在某种程度上是这个错误has been reported before,但目前还没有提供解决方案。
编辑: 崩溃发生在 Android 9,而不是 10。
FileObserver(File)
is new to API Level 29。您的 minSdkVersion
是 14。您的代码将在 API 级别 28 及更低级别上因此错误而崩溃。你应该收到 Lint 警告之类的警告你 FileObserver(File)
比你的 minSdkVersion
.
您的选择是:
在所有 API 级别上使用
FileObserver(String)
,尽管有弃用警告。在API 14-28级使用
FileObserver(String)
,在API 29+级使用FileObserver(File)
,使用Build.VERSION.SDK_INT
确定您的应用 运行 在设备上的 API 级别。将您的
minSdkVersion
设置为 29。仅在 API 级别 29+ 上使用
FileObserver
,并跳过旧设备上依赖它的任何功能。