使用 getExternalStorageDirectory 保存视频时,相机预览为黑色

Camera preview is black when using getExternalStorageDirectory to save the video

我正在使用 camera2 API and Google sample code 拍摄视频。

当我尝试更改要保存在 sdcard/MyApp/filename 而不是 Android/data/my_package/filename 上的输出位置时,我遇到了一个问题。

方法如下:

private File getVideoFile(Context context) {
    // Not working, cause black preview
    return new File(Environment.getExternalStorageDirectory().getPath() +
                                                    "/myApp/", "myVideo.mp4");
    // Working
    return new File(context.getExternalFilesDir(null), "myVideo.mp4");
}

所以,我的问题是,为什么将视频保存在 sdcard 上会导致“黑色预览”以及如何将视频保存在 sdcard 上?

编辑

这是我请求的权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA"/>

要将视频保存在 SD 卡(二级外部存储)上,请使用此 API:getExternalFilesDirs()

这个API将分别return外存和二级外存的路径数组。第二条路径是SD卡路径。有些设备也可以有 2 个 SD 卡,所以最好检查 returned 路径中是否有 "sdcard" 关键字。要了解各种存储之间的区别,请查看我的 this 答案。

终于找到解决方法了

不知道为什么会这样,目标目录不存在时预览是空白的

我将视频保存在 myApp 目录中,该目录尚不存在,这导致预览为空白。

解决方法是先创建目录,而不是保存视频。代码应该是这样的:

private File getVideoFile(Context context) {
    File folder = new File (Environment.getExternalStorageDirectory().getPath() + "/myApp/");
    folder.mkdirs();
    return new File(Environment.getExternalStorageDirectory().getPath() + "/myApp/", "myVideo.mp4");
}