我想在设备中使用任何可用的图像查看器打开我应用程序资源中的图像。使用cwac-provider库,我已经能够为资产中的某些.pps文件做同样的事情而没有麻烦但是,图像根本不能正常工作。我查看了演示版,几乎所有documentation都可用。我甚至搜索过网络和所以问题,但没有真正得到解决。
我定位API 26 。
以下是我如何设置提供商。
<provider
android:name="com.commonsware.cwac.provider.StreamProvider"
android:authorities="com.justsomeproj.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="com.commonsware.cwac.provider.STREAM_PROVIDER_PATHS"
android:resource="@xml/asset_file_meta" />
</provider>
<paths>
<asset
name="gallery_a"
path="gallery/a" />
<asset
name="gallery_b"
path="gallery/b" />
...
</paths>
public class FileProvider {
private static final String AUTHORITY =
"com.justsomeproj.provider";
private static final Uri PROVIDER =
Uri.parse("content://" + AUTHORITY);
public static Uri buildUri(String path, String fileName) {
return (PROVIDER
.buildUpon()
.appendPath(StreamProvider.getUriPrefix(AUTHORITY))
.appendPath(path).appendPath(fileName)
.build());
}
public static boolean isIntentResolvable(Context context, Intent intent) {
PackageManager pm = context.getPackageManager();
return intent.resolveActivity(pm) != null;
}
}
Intent intent = new Intent(Intent.ACTION_VIEW, FileProvider.buildUri(path, fileName));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (FileProvider.isIntentResolvable(this, intent))
startActivity(intent);
因此,在意图执行时,图库确实会显示,但会显示空白和&#34;没有缩略图&#34;消息就可以了。我尝试了多个图库应用,但遇到了相同的结果,并在logcat中发现了类似或相同的错误。
即使他们无法加载缩略图,他们也会收到该文件 我这样说是因为,在Gallery应用程序的空白预览中,如果我尝试查看文件信息,它会显示有关该文件的正确信息。试图分享&#39;来自同一屏幕的图像也可以工作,下一个应用程序(用于共享)可以毫无问题地获取图像文件 但是,Google相册应用程序可以完美呈现图像。怪异。
问题出现在API 21,25,26上,而且很可能在其他人之间(未经测试)。
生成content://com.justsomeproj.provider/30b6ac14-6bec-4e54-a1d3-445367f69ccc/gallery_a/image1.jpeg
java.io.FileNotFoundException: Not a whole file
09-21 10:21:16.453 1214-2098/? I/PackageManager: Setting last chosen activity com.android.gallery3d/.app.GalleryActivity for user 0:
09-21 10:21:16.453 1214-2098/? I/PackageManager: Action: "android.intent.action.VIEW"
09-21 10:21:16.453 1214-2098/? I/PackageManager: Category: "android.intent.category.DEFAULT"
09-21 10:21:16.453 1214-2098/? I/PackageManager: Type: "image/jpeg"
09-21 10:21:16.453 1214-2098/? I/PackageManager: AutoVerify=false
09-21 10:21:16.461 1214-2677/? I/ActivityManager: START u0 {act=android.intent.action.VIEW dat=content://com.justsomeproj.provider/30b6ac14-6bec-4e54-a1d3-445367f69ccc/gallery_a/image1.jpeg flg=0x3000001 cmp=com.android.gallery3d/.app.GalleryActivity} from uid 10233 on display 0
09-21 10:21:16.675 14814-14814/? V/StateManager: startState class com.android.gallery3d.app.SinglePhotoPage
09-21 10:21:16.727 14814-15533/? W/UriImage: fail to open: content://com.justsomeproj.provider/30b6ac14-6bec-4e54-a1d3-445367f69ccc/gallery_a/image1.jpeg
java.io.FileNotFoundException: Not a whole file
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:856)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:793)
at com.android.gallery3d.data.UriImage.openOrDownloadInner(UriImage.java:108)
at com.android.gallery3d.data.UriImage.openFileOrDownloadTempFile(UriImage.java:83)
at com.android.gallery3d.data.UriImage.prepareInputFile(UriImage.java:170)
at com.android.gallery3d.data.UriImage.-wrap0(UriImage.java)
at com.android.gallery3d.data.UriImage$RegionDecoderJob.run(UriImage.java:185)
at com.android.gallery3d.data.UriImage$RegionDecoderJob.run(UriImage.java:176)
at com.android.gallery3d.util.ThreadPool$Worker.run(ThreadPool.java:133)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
at com.android.gallery3d.util.PriorityThreadFactory$1.run(PriorityThreadFactory.java:44)
09-21 10:21:16.727 14814-15533/? W/SinglePhotoDataAdapter: fail to get region decoder, try to request thumb image
09-21 10:21:16.739 14814-14814/? W/SinglePhotoDataAdapter: fail to decode thumb
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at com.android.gallery3d.app.SinglePhotoDataAdapter.onDecodeThumbComplete(SinglePhotoDataAdapter.java:151)
at com.android.gallery3d.app.SinglePhotoDataAdapter.-wrap1(SinglePhotoDataAdapter.java)
at com.android.gallery3d.app.SinglePhotoDataAdapter$3.handleMessage(SinglePhotoDataAdapter.java:70)
at android.os.Handler.dispatchMessage(Handler.java:102)
at com.android.gallery3d.ui.SynchronizedHandler.dispatchMessage(SynchronizedHandler.java:36)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6236)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
logcat来自物理API 25设备。
我已经尝试过文档中有关支持旧版应用程序的建议而没有任何成功。 我也尝试了一些调整意图,也没有任何喜悦。
@CommonsWare我有点坚持这个,所以寻求建议。我错过了什么?
我的意图好吗?
为什么它不起作用?
为什么Google相册应用效果很好?
这是图库应用程序或库中的问题吗?
有解决方法吗?
目前,我正在考虑将文件写入缓存并尝试通过Android的FileProvider(而不是cwac-provider的StreamProvider)进行查看,看看它是否有效。
答案 0 :(得分:0)
我的意图好吗?
我无法回答这个问题,因为我不知道项目中Uri
目录的内容。但是,如果有任何内容可以读取Uri
,那么Intent
就可以了。你ImageView
的其余部分似乎很好。
为什么它不起作用?
也许你没有have noCompress
configured,但如果是这样的话我会发现它会一直失败。
或许添加the additional elements for legacy app support有助于与这些其他应用兼容。
我不太确定你为什么要这样做,而不是简单地在应用程序中自己显示图像。不仅有SubsamplingImageView
,还有Intent
等第三方库类提供了更多功能(例如,缩放到缩放)。
嗯,因为谷歌太棒了? : - )为什么Google相册应用效果很好?
任何应用都可以处理您的Uri
和Intent
这一事实表明Uri
和noCompress
没问题。
这是图库应用程序或库中的问题吗?
我无从得知。
有解决方法吗?
我在回答的前面提出了两个(google-cloud
,遗留应用支持)。