java - 保存文件选择内部路径而不是 SD 卡路径。

标签 java android

我已经阅读了几个问题和 Android Guide保存文件,但不知道哪里出了问题。

我正在尝试将图像保存到 SD 卡图片目录中的新文件夹中。

我有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>在 list 中。

此方法抛出异常

String storageStage =  Environment.getExternalStorageState();

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory (
            Environment.DIRECTORY_PICTURES),"/WordResolver");

    mediaStorageDir.mkdirs();

    if (! mediaStorageDir.exists()){ 
            if(! mediaStorageDir.mkdirs()) {

                Log.d("WordResolver", "Failed to create directory"); 
                return null;
            }
    }

    //Creating Media File Name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;

    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File (mediaStorageDir.getPath() + File.separator + "IMG_WR" +
                timeStamp + ".jpg");
    } else {
            return null;
        }

    return mediaFile;

}

它抛出的错误是 NullPointerException。这是一个奇怪的问题的原因是因为程序试图保存在内部存储而不是 SD 卡中,如下所示:

1

我的印象是Environment.getExternalStoragePublicDirectory会保存到外部存储吗?

这是堆栈跟踪:

                                                                            java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aaron.wordresolver/com.example.aaron.wordresolver.cameraShot}: java.lang.NullPointerException: file
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                                at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                at android.os.Looper.loop(Looper.java:148)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                             Caused by: java.lang.NullPointerException: file
                                                                                at android.net.Uri.fromFile(Uri.java:452)
                                                                                at com.example.aaron.wordresolver.cameraShot.getOutputMediaFileUri(cameraShot.java:55)
                                                                                at com.example.aaron.wordresolver.cameraShot.onCreate(cameraShot.java:45)
                                                                                at android.app.Activity.performCreate(Activity.java:6237)
                                                                                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                                at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                                at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                at android.os.Looper.loop(Looper.java:148) 
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                                at java.lang.reflect.Method.invoke(Native Method) 
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

如果重要的话,我正在使用模拟设备!

干杯

最佳答案

Where as I was under the impression that Environment.getExternalStoragePublicDirectory would save to the external storage?

是的。您可以通过查看路径来判断。目前使用的设备大约为零,其中 external storage是“SD 卡”。 SD卡是removable storage ,并且在 Android 4.4+ 上无法通过文件系统访问它。

关于堆栈跟踪,您需要确定您的问题是否与 mediaStorageDirtype 有关,因为在这两种情况下您都会遇到相同的症状。请记住,如果您的 targetSdkVersion 为 23 或更高,并且您运行的是 Android 6.0 或更高版本,you need to request your external storage permission at runtime .

关于java - 保存文件选择内部路径而不是 SD 卡路径。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37324861/

相关文章:

Android 私有(private)字段命名规范可以吗?

具有全局上下文的 Android 单例

java - 使用 Java 替换来自阿拉伯语推文的表情符号 Unicode 范围

java - 如何断开与接收器应用程序的连接?

java - 如何在矩阵中生成同心层

c# - C 与 C# 或 JAVA 中的 char 有什么区别

android - 从图库或相机中选择图像并用所选图像替换按钮

Java 不识别 Android XML 元素的 ID

java - JPanel drawString 留下字符串

Java将字符串中的两个整数拆分为double(转换时间)