无法通过cwac-provider在Gallery中查看资产图像文件

时间:2017-09-21 06:14:03

标签: android image android-intent commonsware-cwac

我想在设备中使用任何可用的图像查看器打开我应用程序资源中的图像。使用cwac-provider库,我已经能够为资产中的某些.pps文件做同样的事情而没有麻烦但是,图像根本不能正常工作。我查看了演示版,几乎所有documentation都可用。我甚至搜索过网络和所以问题,但没有真正得到解决。

定位API 26

以下是我如何设置提供商。

AndroidManifest

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

asset_file_meta

<paths>
    <asset
        name="gallery_a"
        path="gallery/a" />
    <asset
        name="gallery_b"
        path="gallery/b" />
    ...
</paths>

FileProvider

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上,而且很可能在其他人之间(未经测试)。

生成

URI

content://com.justsomeproj.provider/30b6ac14-6bec-4e54-a1d3-445367f69ccc/gallery_a/image1.jpeg

异常

java.io.FileNotFoundException: Not a whole file

logcat的

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)进行查看,看看它是否有效。

1 个答案:

答案 0 :(得分:0)

  

我的意图好吗?

我无法回答这个问题,因为我不知道项目中Uri目录的内容。但是,如果有任何内容可以读取Uri,那么Intent就可以了。你ImageView的其余部分似乎很好。

  

为什么它不起作用?

也许你没有have noCompress configured,但如果是这样的话我会发现它会一直失败。

或许添加the additional elements for legacy app support有助于与这些其他应用兼容。

我不太确定你为什么要这样做,而不是简单地在应用程序中自己显示图像。不仅有SubsamplingImageView,还有Intent等第三方库类提供了更多功能(例如,缩放到缩放)。

  

为什么Google相册应用效果很好?

嗯,因为谷歌太棒了? : - )

任何应用都可以处理您的UriIntent这一事实表明UrinoCompress没问题。

  

这是图库应用程序或库中的问题吗?

我无从得知。

  

有解决方法吗?

我在回答的前面提出了两个(google-cloud,遗留应用支持)。