2013-04-10 86 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