Android-在没有sd卡时强制关闭

Android-在没有sd卡时强制关闭,android,nullpointerexception,sd-card,instrumentation,Android,Nullpointerexception,Sd Card,Instrumentation,因此,我有一个应用程序,它将文件存储在我创建的目录中,当用户到达某个地理位置的某个距离内时,我会创建这些目录。除了某些通常使用sd卡的设备被移除,然后当用户登录时应用程序崩溃,其他一切都正常工作。我在droid x上试过,我能复制这次坠毁。当我有sd卡在它的工作正常,但当sd卡被删除时,我得到一个空指针异常,并强制关闭 以下是市场上的原木堆放场: java.lang.RuntimeException: Unable to resume activity {graffit.cores/

因此,我有一个应用程序,它将文件存储在我创建的目录中,当用户到达某个地理位置的某个距离内时,我会创建这些目录。除了某些通常使用sd卡的设备被移除,然后当用户登录时应用程序崩溃,其他一切都正常工作。我在droid x上试过,我能复制这次坠毁。当我有sd卡在它的工作正常,但当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)
由于日志转储显示了一些关于检测失败的信息,我猜我应该捕捉到这些信息,或者寻找是否有sd卡可用

我相信我能找到如何寻找sd卡,但我如何才能抓住这次崩溃,并使用内部存储代替丢失的sd卡


非常感谢您的帮助。

在使用外部存储器之前,您应该始终调用getExternalStorageState()检查介质是否可用。媒体可能并不总是可用,例如在您的情况下。Android文档给出了一个如何处理此问题的示例:

最好的做法可能是在一个函数中执行此检查,该函数返回一个关于是否可以访问外部存储器的布尔值,然后在每次需要从卡中获取数据时进行检查

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

嘿,谢谢你的回复。我实际上是在应用程序第一次运行时这样做的。崩溃发生在安装之后,用户移除了sd卡。您是否有任何线索可以帮助您了解用户在安装后移除卡时的情况?请在每次尝试读取卡之前进行此检查。我将编辑我的答案以更好地演示这一点。还有一些广播意图告诉应用程序何时从系统中卸载/装载媒体(相应地删除操作)。查看文档中的Intent类。您可以使用这些来了解媒体何时离开和返回系统。嘿,谢谢您的帮助。我应该将我的“check for sdcard”方法放在oncreate的开头,还是在onStart的前面?如果不确切知道您在做什么,那么在您尝试打开外部介质上存在的文件时,这可能是最好的选择。