【发布时间】: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