【问题标题】:Error reading file on Sdcard读取 SD 卡上的文件时出错
【发布时间】:2013-04-10 16:26:44
【问题描述】:

我的对话框显示目录/sdcard 及其所有文件。选择文件/图像后,路径与位图图像一起保存,例如

file.name = "/sdcard/Pictures/Screenshots/Screenshot_2013-01-15-10-42-02.jpg";`

但是,每次我尝试通过单击位图打开文件时,都会导致打开的应用程序崩溃,而不是我的应用程序。

我已设置写入外部存储权限。代码 sn -p 如下所示。我真的不知道出了什么问题。我也试过所有文件类型,如txtpdfdoc等,都导致打开文件应用程序崩溃,无法打开文件。

Adapter.java(到位图)

public View getView(int position, View convertView, Viewgroup parent(){
   case Image:
   Bitmap bp = new BitmapFactory().decodeFile(file.name);
   image.setImageBitmap(Bitmap.create(bp, 200, 200, true));
   break;

}

Activity.java

public void onItemClick(AdapterView<?> parent, View v, int position, long id){
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    intent.setData(Uri.fromFile(new File(file.name)));
    intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

  switch(file.getTypeByName()){
  case Image:
       intent.setType("image/*");
       break;
  }
 startActivityforResult(intent, 000);
}

Logcat

04-10 12:04:42.164: E/AndroidRuntime(4513): FATAL EXCEPTION: main
04-10 12:04:42.164: E/AndroidRuntime(4513): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.sec.gallery3d/com.android.sec.gallery3d.app.Gallery}: java.lang.NullPointerException
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.os.Looper.loop(Looper.java:137)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread.main(ActivityThread.java:4512)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at java.lang.reflect.Method.invokeNative(Native Method)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at java.lang.reflect.Method.invoke(Method.java:511)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at dalvik.system.NativeStart.main(Native Method)
04-10 12:04:42.164: E/AndroidRuntime(4513): Caused by: java.lang.NullPointerException
04-10 12:04:42.164: E/AndroidRuntime(4513):     at com.android.sec.gallery3d.app.Gallery.startViewAction(Gallery.java:377)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at com.android.sec.gallery3d.app.Gallery.initializeByIntent(Gallery.java:237)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at com.android.sec.gallery3d.app.Gallery.onCreate(Gallery.java:149)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.Activity.performCreate(Activity.java:4469)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
04-10 12:04:42.164: E/AndroidRuntime(4513):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)
04-10 12:04:42.164: E/AndroidRuntime(4513):     ... 11 more
04-10 12:04:42.164: W/ActivityManager(668):   Force finishing activity r.intent.getComponent().flattenToShortString()
04-10 12:04:42.234: E/android.os.Debug(668): !@Dumpstate > dumpstate -k -t -n -z -d -o /data/log/dumpstate_app_error
04-10 12:04:42.244: I/dumpstate(4530): begin 

【问题讨论】:

  • 由:java.lang.NullPointerException 引起。调试你的代码,你发现了错误。
  • 如果我们要深入研究 Gallery.java,我们需要准确的 Android 版本。转到设置 -> 关于设备并报告确切的 Android 版本。
  • @j__m 在设备上是 4.0.4。
  • 不,他有两个不同的问题。有一个回答。这是后续行动。

标签: java android io


【解决方案1】:

所以我发现了这个:https://stackoverflow.com/a/3677598/1704011 答案

引用评论者:

使用 setDataAndType() 而不是 2 个单独的调用修复了她 问题。

这真的让我很困惑,为什么有必要这样做。然后我查看了Intent.setType()Intent.setData()Intent.setDataAndType()的实现。看看这个:

public Intent setType(String type) {
    mData = null;
    mType = type;
    return this;
}

public Intent setData(Uri data) {
    mData = data;
    mType = null;
    return this;
}

所以在setData 之后调用setType 会破坏数据,而对setData 的调用会破坏类型。这就是画廊应用程序崩溃的原因,你在setData 之后setType 所以当发送意图时数据为空。当然 docs 确实提到了这种行为,但是基于方法名称它并不直观,像 setTypeOnlysetDataOnly 这样的东西似乎更明确地传达了这些方法的目的。否则不清楚这些方法是否相互排斥。

使用setDataAndType() 应该可以解决您的问题。

【讨论】:

  • 这对我来说似乎很奇怪,但是,嘿 - 编程是有效的艺术,而不是看起来应该有效的艺术。 +1 挖掘它。
  • 我同意,这不应该是必要的。如果它解决了海报案例中的问题,我会很感兴趣。
  • Forget 不应该是必要的——我从未见过 Uri 类的内部实现,我根本不希望它能够工作。现在我看了一眼源代码,这让我再也不想使用 Uri 类了!
  • 对不起,我在和同事交谈.. 但上面的答案对我不起作用。我试过这种方式,不管你信不信,Uri.fromFile 也以“file:///sdcard/downloads/filepath.ext”格式提供了 Uri..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2019-12-20
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多