小编red*_*man的帖子

为什么 ContentResolver.openFileDescriptor 会抛出 IllegalArgumentException?出路?

我有两个问题,为了让我的问题在这里清晰,一个简短的代码片段:

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 android-contentresolver

5
推荐指数
1
解决办法
1758
查看次数

如何修改 startService() 的源代码以识别它是否是从后台调用的?

从 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()修改以识别它是否是从前台/后台调用的。但我确信在我之前的许多开发人员已经这样做了,如果他们能够给出答案,我会很高兴。

android android-source

2
推荐指数
1
解决办法
1163
查看次数