2013-04-10 58 views
0

我的对话框显示目录/sdcard及其所有文件。在选择文件/图像时,路径与位图图像一起保存,例如,读取SD卡上的文件时出错

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

然而,每次我试图通过单击位图来打开该文件时,它会导致开放应用程序崩溃,而不是我的应用程序。

我已经设置了写入外部存储权限。代码片段如下所示。我真的不知道发生了什么问题。我也尝试过所有文件类型,如txt,pdf,doc等等,都导致打开的文件应用程序崩溃,而不是打开文件。

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): [email protected] > dumpstate -k -t -n -z -d -o /data/log/dumpstate_app_error 
04-10 12:04:42.244: I/dumpstate(4530): begin 
+0

引起:java.lang.NullPointerException。调试你的代码,你发现错误。 – 2013-04-10 16:31:00

+0

如果我们要深入研究Gallery.java,我们需要从这个Android的确切版本。进入设置 - >关于设备并报告确切的Android版本。 – 2013-04-10 16:32:00

+0

@j__m它在设备上是4.0.4。 – JUL 2013-04-10 16:35:01

回答

1

所以我发现这一点:https://stackoverflow.com/a/3677598/1704011回答

引述一个评论者:使用setDataAndType(

),而不是两个独立的固定电话她 问题。

这真的让我感到困惑,为什么这将是必要的。然后我看了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; 
} 

所以setDatasetType呼叫则会覆盖的数据和setData呼叫则会覆盖类型。这就是为什么画廊应用程序正在打破,你setTypesetData所以当意图发送时,数据为空。授予docs确实提到了这种行为,但它不直观基于方法名称,类似setTypeOnlysetDataOnly似乎更明确地传达了这些方法的目的。否则,目前还不清楚这些方法是相互排斥的。

使用setDataAndType()并且应该解决您的问题。

+0

这对我来说看起来真的很奇怪,但是嘿 - 编程是什么工作的艺术,而不是它看起来应该工作的艺术。 – 2013-04-10 16:49:41

+0

我同意,这不应该是必要的,我会感兴趣,如果它解决了海报的情况下的问题 – 2013-04-10 16:53:19

+0

忘记不应该是必要的 - 从来没有见过内部实施的Uri类,我wouldn'不要期望能够工作,现在我浏览了源代码,这让我永远不想再次使用Uri类! – 2013-04-10 16:57:20