簡體   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