VIEW意图无法处理保存的图像文件

首先让我说,这个问题与我的另一个问题略有关联。 其实它是因为这个而创建的。

我有以下代码来写入从网络下载到SD卡中的文件的位图:

// Get image from url
URL u = new URL(url);
HttpGet httpRequest = new HttpGet(u.toURI());
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();
Bitmap bmImg = BitmapFactory.decodeStream(instream);
instream.close();

// Write image to a file in sd card
File posterFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Android/data/com.myapp/files/image.jpg");
posterFile.createNewFile();
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(posterFile));
Bitmap mutable = Bitmap.createScaledBitmap(bmImg,bmImg.getWidth(),bmImg.getHeight(),true);
mutable.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();

// Launch default viewer for the file
Intent intent = new Intent();                   
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*");
((Activity) getContext()).startActivity(intent);

几个笔记。 我在看到某人使用它之后创建了“可变”位图,似乎比没有它更好。 而且我在Uri类中使用parse方法,而不是fromFile,因为在我的代码中,我在不同的地方调用了这些方法,当我创建intent时,我有一个字符串路径而不是文件。

现在我的问题。 该文件被创建。 意图启动一个对话框,要求我选择一个查看器。 我有3个观众安装。 天文图像查看器,默认媒体库(我2.1上有一个milstone,但在里程碑2.1更新没有包括3D画廊,所以它是旧的)和3D画廊从nexus之一(我发现apk中的野生)。

现在,当我启动3名观众时,会发生以下情况:

  • 天文图像浏览器:活动启动,但我什么也看不到,但黑屏。

  • 媒体库:我收到一个异常对话框,显示“应用程序媒体库(process com.motorola.gallery)意外停止。请使用强制关闭选项再次尝试”。

  • 3D画廊:一切正常。

  • 当我尝试使用Astro文件管理器(浏览到它并简单地单击)简单地打开文件时,我得到相同的选项对话框,但这次情况有所不同:

  • Astro图片浏览器:一切正常。

  • 媒体库:一切正常。

  • 3D画廊:活动启动,但我什么都看不到,但黑屏。

  • 正如你所看到的一切都是一团糟。 我不知道为什么会发生这种情况,但每次都会发生这种情况。 这不是一个随机错误。

    我在创造意图时错过了什么? 或者当我创建图像文件? 有任何想法吗?

    编辑:正如在评论中指出的这是adb logcat感兴趣的部分。 另外我应该注意到,我改变了我创建图像文件的方式。 因为我想创建一个反映在线文件的文件,我只需下载它,而不是创建一个位图,然后创建该文件(这是因为在某些时候我需要位图,但现在我以相反的方式执行)。 问题依然存在,并且完全一样:

    I / ActivityManager(18852):开始活动:Intent {act = android.intent.action.VIEW dat = / sdcard / Android / data / com.myapp / files / image.jpg typ = image / * flg = 0x3800000 cmp = com .motorola.gallery / .ViewImage}

    我/ ActivityManager(18852):启动程序com.motorola.gallery:ViewImage for activity com.motorola.gallery/.ViewImage:pid = 29187 uid = 10017 gids = {3003,1015}

    I / dalvikvm(29187):调试器线程未激活,忽略DDM发送(t = 0x41504e4d l = 38)

    I / dalvikvm(29187):调试器线程不活动,忽略DDM发送(t = 0x41504e4d l = 64)

    我/ ActivityManager(18852):进程com.handcent.nextsms(pid 29174)已经死亡。

    I / ViewImage(29187):在View Image onCreate!

    D / AndroidRuntime(29187):关闭虚拟机

    W / dalvikvm(29187):threadid = 3:线程退出时未捕获的异常(group = 0x4001b170)

    E / AndroidRuntime(29187):未捕获的处理程序:由于未捕获的异常,线程主要退出

    E / AndroidRuntime(29187):java.lang.RuntimeException:无法启动活动ComponentInfo {com.motorola.gallery/com.motorola.gallery.ViewImage}:java.lang.NullPointerException

    E / AndroidRuntime(29187):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)

    E / AndroidRuntime(29187):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)

    E / AndroidRuntime(29187):在android.app.ActivityThread.access $ 2200(ActivityThread.java:119)

    E / AndroidRuntime(29187):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)

    E / AndroidRuntime(29187):在android.os.Handler.dispatchMessage(Handler.java:99)

    E / AndroidRuntime(29187):在android.os.Looper.loop(Looper.java:123)

    E / AndroidRuntime(29187):在android.app.ActivityThread.main(ActivityThread.java:4363)

    E / AndroidRuntime(29187):在java.lang.reflect.Method.invokeNative(Native Method)

    E / AndroidRuntime(29187):在java.lang.reflect.Method.invoke(Method.java:521)

    E / AndroidRuntime(29187):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)

    E / AndroidRuntime(29187):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

    E / AndroidRuntime(29187):在dalvik.system.NativeStart.main(本机方法)

    E / AndroidRuntime(29187):引起:java.lang.NullPointerException

    E / AndroidRuntime(29187):在com.motorola.gallery.ImageManager.allImages(ImageManager.java:5621)

    E / AndroidRuntime(29187):在com.motorola.gallery.ImageManager.getSingleImageListByUri(ImageManager.java:5515)

    E / AndroidRuntime(29187):在com.motorola.gallery.ViewImage.onCreate(ViewImage.java:1801)

    E / AndroidRuntime(29187):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)

    E / AndroidRuntime(29187):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

    E / AndroidRuntime(29187):... 11更多


    我用这个黑客修复错误:

    ...
    Uri hacked_uri = Uri.parse("file://" + uri.getPath());
    intent.setDataAndType(hacked_uri, "image/*");
    ...
    

    我使用这个代码为我的应用程序,并正常工作。 我只做了一个小改变。

    我改变了这个:

    intent.setDataAndType(Uri.parse(posterFile.getAbsolutePath()),"image/*");
    

    为了这:

    intent.setDataAndType(Uri.fromFile(posterFile),"image/*");
    

    我决定创建我自己的Activity,它只是在屏幕上绘制图像。 这不是一个完美的解决方案,但它符合我的基本标准......它的工作原理:)

    链接地址: http://www.djcxy.com/p/36741.html

    上一篇: VIEW intent not working on saved image file

    下一篇: Android Image Viewer from App