我有两个问题,为了让我的问题在这里清晰,一个简短的代码片段:
ContentResolver resolver = context.getContentResolver();
DocumentsContract.deleteDocument(resolver, documentUri);
resolver.openFileDescriptor(documentUri, "rw");
Run Code Online (Sandbox Code Playgroud)
文档说最后一行“如果 URI 下不存在文件或模式无效,则抛出 FileNotFoundException”。
但实际上我得到java.lang.IllegalArgumentException.
(问题 1)这是一个错误还是可以?
(问题2)openFileDescriptor()显然不是测试文档是否存在的好方法。什么是“官方”方法来做到这一点?
编辑(添加错误日志):
W/System.err: java.lang.IllegalArgumentException: 无法确定 9016-4EF8:myFolder/file1.wav 是否是 9016-4EF8:myFolder: java.io.FileNotFoundException: Missing file for 9016-4EF8:myFolder/file1 .wav 在 /storage/extSdCard/myFolder/file1.wav
W/System.err: 在 android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
W/System.err: 在 android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:148)
W/System.err: 在 android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:618)
W/System.err: 在 android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:945)
W/System.err: 在 android.content.ContentResolver.openFileDescriptor(ContentResolver.java:784)
W/System.err: 在 android.content.ContentResolver.openFileDescriptor(ContentResolver.java:739)
和:
documentUri="content://com.android.externalstorage.documents/tree/9016-4EF8%3AmyFolder/document/9016-4EF8%3AmyFolder%2Ffile1.wav"
从 Android 9 开始,如果从后台调用,它会抛出IllegalStateException。我在开发者控制台中多次看到此异常:startService()
java.lang.IllegalStateException:
at android.app.ContextImpl.startServiceCommon (ContextImpl.java:1666)
at android.app.ContextImpl.startService (ContextImpl.java:1611)
Run Code Online (Sandbox Code Playgroud)
在这些情况下,Google 建议改为startForegroundService()在 5 秒内致电 and startForeground()。请参阅“后台执行限制”。
无论如何,startService()从前台调用是完全可以的。现在,我想知道 Android 究竟是如何识别/决定应用程序位于前台而不错误地抛出 IllegalStateException的?
我开始挖掘Android9/10的源代码,并将其与8/7进行比较,以发现如何startService()修改以识别它是否是从前台/后台调用的。但我确信在我之前的许多开发人员已经这样做了,如果他们能够给出答案,我会很高兴。