Android CloudMediaProvider onOpenMedia未触发,抛出FileNotFoundException问题
自定义CloudMediaProvider无法触发onOpenMedia()的问题
我通过继承Android的CloudMediaProvider类实现了类似OneDrive的自定义云存储媒体服务,查询和预览功能正常——PhotoPicker会调用我重写的onQueryMedia()、onOpenPreview()等方法,日志输出符合预期。
但当用户选择媒体项点击“打开”(即获取全分辨率文件)时,系统完全不会调用我重写的onOpenMedia()方法,反而PhotoPicker的SelectedMediaPreloader组件抛出如下异常:
Could not open FileDescriptor for content://media/picker/0/ch.nikleberg.bettershared.cloudpicker/media/ID_1 (Ask Gemini) java.io.FileNotFoundException: File not found for uri: content://media/picker/0/ch.nikleberg.bettershared.cloudpicker/media/ID_1 at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:151) at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:780) at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:2053) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1868) at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1784) at com.android.providers.media.photopicker.SelectedMediaPreloader.openFileDescriptor(SelectedMediaPreloader.java:262) at com.android.providers.media.photopicker.SelectedMediaPreloader.-$$Nest$mopenFileDescriptor(SelectedMediaPreloader.java:0) at com.android.providers.media.photopicker.SelectedMediaPreloader$4.run(SelectedMediaPreloader.java:214) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012) at com.android.providers.media.photopicker.SelectedMediaPreloader$5$1.run(SelectedMediaPreloader.java:334) SelectedMediaPreloader com...ndroid.providers.media.module D openFileDescriptor() DONE, took 12 ms, content://media/picker/0/ch.nikleberg.bettershared.cloudpicker/media/ID_1 SelectedMediaPreloader com...ndroid.providers.media.module D Preloaded 1 (of 1) items
已尝试的解决方案
- 在
onQueryMedia()返回的Cursor列中,云端文件原本应返回NULL的MEDIA_STORE_URI,我尝试设置为任意内容URI,但异常未改变。 - 将
CloudMediaProvider实现包装在普通ContentProvider中,并为所有可能的调用添加日志,预览功能的调用可在logcat中看到,但未发现媒体实际检索的调用(预期会调用query()或openTypedAssetFile())。
内容的提问来源于stack exchange,提问作者NikLeberg
相关产品推荐
相关产品推荐

