繁体   English   中英

方法意外返回 null

[英]Method returns null unexpectedly

由于某种原因,此方法不断返回 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

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

在回复您的原始帖子后,我从 stackoverflow 中挖掘了这篇文章: MEDIA_TYPE_IMAGE not识别

您的问题可能与 MEDIA-TYPE_IMAGE 和/或 MEDIA_TYPE_VIDEO 未被识别或发现有关。 该帖子中的答案提供的两个选项包括引用包含此整数的 Android 提供程序,或手动添加它。

尝试贡献者提供的两个选项,看看它们是否能解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM