2012-04-05 73 views
0

因此,我有一個應用程序,它將文件存儲在用戶在距離地理位置一定距離內時創建的目錄中。除了某些通常使用SD卡的設備將其刪除,然後在用戶登錄時應用程序崩潰時,一切正常。除此之外,我嘗試使用droid x,並且能夠複製崩潰。當我有SD卡在它工作正常,但當SD卡被刪除時,我得到一個空指針異常並強制關閉。Android - 當沒有SD卡存在時強制關閉

繼承人從市場的原木堆:

java.lang.RuntimeException: Unable to resume activity  {graffit.cores/graffit.cores.GraffView}: java.lang.NullPointerException 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2208) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2228) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1721) 
at android.app.ActivityThread.access$1500(ActivityThread.java:124) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3806) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at graffit.cores.GraffView.onResume(GraffView.java:1201) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
at android.app.Activity.performResume(Activity.java:3882) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2191) 
... 12 more 
java.lang.NullPointerException 
at graffit.cores.GraffView.onResume(GraffView.java:1201) 
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
at android.app.Activity.performResume(Activity.java:3882) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2191) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2228) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1721) 
at android.app.ActivityThread.access$1500(ActivityThread.java:124) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3806) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

之處在於logdump了一些關於失敗的儀器即時猜測我應該趕上或找如果SD卡可用。

我確定我可以找出如何尋找一個SD卡,但我怎樣才能捕捉到這個崩潰並使用內部存儲來代替丟失的SD卡。

任何幫助將不勝感激。

回答

1

在使用外部存儲器進行任何工作之前,您應該始終調用getExternalStorageState()來檢查媒體是否可用。媒體可能並不總是可用的,比如你的情況。 Android Docs舉例說明了如何處理這個問題:http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

最好的辦法是在一個函數中檢查這個函數,該函數返回一個布爾值,表示是否可以訪問外部存儲然後檢查它們你需要從卡上獲取數據。

if (sdCardAvalableForRead()) 
{ 
    // get file. 
} 
else 
{ 
    // show warning or message to user. 
} 
+0

嘿謝謝你的回覆。我實際上是在應用程序第一次運行時執行此操作。安裝完成後,用戶將刪除SD卡。當用戶在安裝後取出卡時,您是否有任何線索知道如何處理這種情況? – 2012-04-05 23:57:14

+0

每次嘗試從卡上讀取之前都要進行此項檢查。我會編輯我的答案以更好地展示這一點。 – Wizetux 2012-04-05 23:58:42

+1

還有一些廣播意圖告訴應用程序何時從系統卸載/安裝媒體(特別是ACTION_MEDIA_REMOVED)。在文檔中查看Intent類。您可以使用這些來了解媒體何時離開並返回系統。 – Wizetux 2012-04-06 00:03:51