Android - 当没有SD卡时强制关闭

时间:2012-04-05 23:51:35

标签: android nullpointerexception sd-card instrumentation

所以我有一个应用程序将文件存储在我创建的目录中,当用户进入某个地理位置的某个距离时。一切正常,除非通常使用SD卡的某些设备将其删除,然后当用户登录时应用程序崩溃。我尝试了droid x,我能够复制崩溃。当我有SD卡在它工作正常,但当SD卡被删除时,我得到一个nullpointer异常并强制关闭。

来自市场的日志转储:

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 个答案:

答案 0 :(得分:1)

在使用外部存储器进行任何操作之前,应始终调用getExternalStorageState()来检查介质是否可用。媒体可能并不总是可用,例如在您的情况下。 Android文档提供了有关如何处理此问题的示例:http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

最好的办法是检查一个函数,该函数返回一个布尔值,表示是否可以访问外部存储,然后在每次需要从卡中获取数据时进行检查。

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