【问题标题】:Launching Intent.ACTION_VIEW intent not working on saved image file启动 Intent.ACTION_VIEW 意图不适用于保存的图像文件
【发布时间】:2023-03-11 16:05:01
【问题描述】:

首先让我说这个问题与我的another question略有联系。实际上它就是因为这个而创建的。

我有以下代码将从网上下载的位图写入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 类而不是 fromFile 上使用 parse 方法,因为在我的代码中,我在不同的地方调用它们,当我创建意图时,我有一个字符串路径而不是文件。

现在解决我的问题。文件被创建。意图启动一个对话框,要求我选择一个查看器。我安装了 3 个查看器。 Astro 图​​像查看器,默认媒体库(我在 2.1 上有一个里程碑,但在里程碑上,2.1 更新不包括 3d 画廊,所以它是旧的)和来自 nexus 的 3d 画廊(我在野生)。

现在,当我启动 3 个查看器时,会发生以下情况:

  • Astro 图​​像查看器: 活动 发射,但我只看到一个 黑屏。

  • 媒体库:我遇到了异常 对话框显示“应用程序媒体 图库(过程 com.motorola.gallery) 已停止 不料。请再试一次” 强制关闭选项。

  • 3D 画廊: 一切正常 应该。

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

  • Astro 图​​像查看器: 一切正常 应该的。

  • 媒体库:一切正常 应该。

  • 3D 画廊: 活动启动但 我只看到黑屏。

如您所见,一切都是一团糟。我不知道为什么会这样,但每次都会这样。这不是一个随机的错误。

我在创建意图时是否遗漏了什么?或者当我创建图像文件时?有什么想法吗?

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

I/ActivityManager(18852):正在启动 活动:意图{ 行动=android.intent.action.VIEW dat=/sdcard/Android/data/com.myapp/files/image.jpg 类型=图像/* flg=0x3800000 cmp=com.motorola.gallery/.ViewImage }

I/ActivityManager(18852):启动过程 com.motorola.gallery:ViewImage 为 活动 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)

I/ActivityManager(18852):进程 com.handcent.nextsms (pid 29174) 有 死了。

I/ViewImage(29187):在视图中 创建!

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

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

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

E/AndroidRuntime(29187): java.lang.RuntimeException:无法 开始活动 组件信息{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 方法)

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(Native 方法)

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

【问题讨论】:

  • adb logcat 的 com.motorola.gallery 崩溃输出是什么?此外,image/* 在技术上不是有效的 mimetype,您可能需要使用正确的 mimetype,例如 image/jpeg。
  • 另外,与 sdk 捆绑的演示应用程序是否提供了将 Intent 启动为“audio/*”的示例?我认为图像也是一样的......
  • 你试过“image/jpeg”看看有什么效果吗?

标签: java android bitmap android-intent


【解决方案1】:

我使用这个 hack 来修复错误:

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

【讨论】:

  • 你是我朋友的救命稻草 :)
  • 注意:我已经设置了数据并输入了两个单独的调用,但它们不起作用。像这里所做的那样将它们设置在一个电话中解决了我的问题。
  • 对我来说关键是使用image/* 作为类型。三星的图库应用与image/jpg 配合良好,但摩托罗拉的图库应用却不能(我收到的是ActivityNotFoundException)。
  • 在路径之前添加“file://”就可以了!弗拉德你就是男人!
【解决方案2】:

我将此代码用于我的应用程序并且工作正常。我只做了一点改变。

我改变了这个:

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

为此:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我用这个代码

       MediaScannerConnection.scanFile(PayamKhosusiActivity.this, new String[] { filez.toString() },
                              null, new MediaScannerConnection.OnScanCompletedListener() {
                                  @Override
                                  public void onScanCompleted(String path, Uri uri) {
                                      Log.wtf("onScanCompleted", "yes");
      
      
                                      Intent intent = new Intent(Intent.ACTION_VIEW, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                                      intent.setDataAndType(uri, "image/*");
                                      intent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); //must for reading data from directory
      
                                      startActivity(intent);
                                  }
                              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 2019-08-16
        • 1970-01-01
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多