当前位置: 首页 > 面试题库 >

正在启动Intent.ACTION_VIEW Intent无法处理已保存的图像文件

唐阳晖
2023-03-14
问题内容

首先,我要说的是,这个问题与我提出的另一个问题)略有关联。实际上是因为这个原因而创建的。

我有以下代码将从网上下载的位图写入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上有milstone,但在里程碑上2.1更新没有包括3d画廊,所以它是旧的)和从一个联系的3d画廊(我在apk中找到了apk野生)。

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

  • Astro图片查看器: 该活动启动了,但是我只看到黑屏。

  • 媒体库: 我看到一个异常对话框,其中显示“应用程序媒体库(进程com.motorola.gallery)意外停止。请重试”,并带有强制关闭选项。

  • 3D图库: 一切正常。

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

  • Astro图片查看器: 一切正常。

  • 媒体库: 一切正常。

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

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

我在创建意图时会缺少某些东西吗?或者当我创建图像文件时?有任何想法吗?

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

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

I / ActivityManager(18852):为com.motorola.gallery/.ViewImage活动启动proc
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):在视图中onCreate!

D / AndroidRuntime(29187):关闭VM

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

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/*");
...


 类似资料:
  • 当我从图库中选择一个图像时,我可以获得该图像的Uri,如下所示: 上面检索到的Uri的格式是content://media/external/images/media/7266 但是,当我试图获取刚保存为文件的图像的Uri时,无法以这种格式检索Uri: 从上面的代码获得的Uri是/storage/emulated/0/dcim/camera/02-04-16 12-49-16.png 我相信,这不

  • 问题内容: 我尝试使用此代码下载图像并将其保存在以下行中: 我在emulator.my应用程序上尝试了此操作,但出现异常,没有权限保存到此路径: 我也添加了这一行: 这是代码: 问题答案:

  • 从远程url保存位图图像的典型方法(基于研究)是: 我无法保存位图,除非它被压缩(位图总是未压缩)。远程图像大小为32KB,压缩后为110KB。我知道我必须降低压缩参数以获得更小的尺寸,但远程图像经过优化,效率更高。 有没有一种方法可以在不压缩远程图像的情况下将其保存到移动存储上? 我的问题的答案===== 首先,我为误导内容道歉;我只想保存可以是png | jpeg | gif |等格式的图像。

  • 保存图像 能将图像保存至Memory Stick™或主机内存。 1. 让指针对准想要保存的图像,从选单列中选择[档案] > [保存图像]。 2. 选择[保存]。 提示 若想变更文件名或保存位置,请选择各项输入栏,并执行决定。

  • 是否有可能使用TYPO3的图像操作工具在TYPO3后端裁剪图像,以便在前端也为PDF文件使用? 图像操作工具只显示消息: 无法确定图像尺寸。 无法提供图像操作,因为图像的原始尺寸未知。 也许我需要另一个服务器端模块?但是我找不到关于这个话题的任何信息。

  • 想要改进此问题?通过编辑这篇文章来更新问题,以便可以用事实和引用来回答它。 在我的Web应用程序中,我希望允许“客户端用户”上传大量图像文件,并且“客户端用户”必须能够看到上传图像文件的网格。 在这种情况下,所有图像文件都有权进行上传、读取、删除和编辑操作。 基本上我使用的是java技术,但我有疑问, < li >管理这种大型图像文件最安全、最有效的方法是什么? < li >在这种web应用程序中