java - 方法意外返回 null

标签 java android

由于某种原因,该方法不断返回 Null

它应该创建并返回 .jpg 或 .mp4 文件

private static File getOutputMediaFile(int type) {
    // External sdcard location
    File mediaStorageDir = new File(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            Config.IMAGE_DIRECTORY_NAME);
    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d(TAG, "Oops! Failed create "
                    + Config.IMAGE_DIRECTORY_NAME + " directory");
            return null;
        }
    }
    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
            Locale.getDefault()).format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");
    } else if (type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "VID_" + timeStamp + ".mp4");
    } else {
        return null;
    }
    return mediaFile;
}

我不明白为什么? 我在这里调用它是为了获取上面指定操作之上的文件 Uri

private void captureImage() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    fileUri = FileProvider.getUriForFile(Camera.this,
            "com.company.example.provider",
            Objects.requireNonNull(getOutputMediaFile(MEDIA_TYPE_IMAGE)));
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

但是一旦 captureImage() 到达 FileProvider.getUriForFile() ,它就会因空指针异常而崩溃

2020-01-16 14:39:52.766 13603-13603/com.company.example E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.company.example, PID: 13603
    java.lang.NullPointerException
        at java.util.Objects.requireNonNull(Objects.java:203)
        at com.company.example.Camera.captureImage(Camera.java:76)
        at com.company.example.Camera.lambda$onCreate$0$Camera(Camera.java:44)
        at com.company.example.-$$Lambda$Camera$TibLnS7dWo_dEUw9GC45GOADOCo.onClick(Unknown Source:2)
        at android.view.View.performClick(View.java:6274)
        at android.view.View$PerformClick.run(View.java:24859)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

最佳答案

您应该能够通过在方法开始处设置断点并单步执行来观察它的作用来找出实际发生的情况。

根据您包含的代码,我可以看到两个可能的原因。

  1. 在方法开始时,它会检查给定名称的目录是否存在,如果不存在,则尝试通过调用 Files.mkdirs() 创建该目录。 。如果 mkdirs 调用无法创建目录,该方法将返回 null。

  2. 您正在使用 MEDIA_TYPE_IMAGE 作为类型参数调用该方法,这显然是受支持的类型之一。但是,我们无法看到 MEDIA_TYPE_IMAGE 是在哪里定义(或导入)的,因此可能有两个不同的定义......具有不同的值。如果它们不同,则可能返回 null

您正在运行的代码也可能与您向我们展示的代码不匹配。

关于java - 方法意外返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769812/

相关文章:

java - createNewFile() 后忽略的方法

java - Gradle多项目——模块间共享测试代码

android - ShapeShifter 旋转使用坐标 0, 0, 而不是中心

android - EditText 高度-长度

java - 使用 Eclipse 从 java 读取环境变量

java - 错误 : syntax error at or near "." in copy command using java?

java - 使用哪些语言/互联网协议(protocol)来远程控制机器人/电子产品?

java - 与嵌入式 JAR 文件通信

android - 在不更改 list 中的 launchMode 的情况下将现有任务清除到顶部的最佳方法是什么?

android - OrmLite 生成的 "ormlite_config.txt"文件的用途是什么?