拍照可以在模拟器上使用,但不能在真实设备上使用

Taking camera picture works on emulator but not on real device

我正在尝试拍照,然后保存并上传到 Firebase 但出于某种原因,当我在任何模拟器上尝试时它都有效,但在我的真实 phone 上我收到消息文件不存在。 注意:用户已经授予相机和存储权限。 User.pictureTaken 和 User.pictureTakenName 只是另一个 class 中的 2 个静态字符串,我用来只需快速保存路径和 UUID。

拍照:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

File file = getOutputMediaFile(null);
Uri photoUri = FileProvider.getUriForFile(getActivity(), getActivity().getApplicationContext().getPackageName() + ".provider", file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
User.pictureTaken = file.getPath();
Log.d("MyTag", "URL: " + file.getPath());

startActivityForResult(intent, TAKE_PHOTO_CODE);

获取图像路径:

private File getOutputMediaFile(String newUUID){
    if (newUUID == null) {
        newUUID = UUID.randomUUID().toString();
        User.pictureTakenName = newUUID;
    }

    return new File(getActivity().getFilesDir(), newUUID);
}

正在尝试打开文件:

File mediaStorageDir = getOutputMediaFile(User.pictureTakenName);
InputStream stream = new FileInputStream(mediaStorageDir);
UploadTask uploadTask =  FirebaseReferences.selfies.child(User.pictureTakenName).putStream(stream);

这里的最后一行给出了错误,下面的代码不包括在内,因为它不相关。

你给出了内部存储的文件路径,所以尝试给出外部存储路径,它可以正常工作。

像这样更改您的 getOutputMediaFile,

private File getOutputMediaFile(String newUUID){
    if (newUUID == null) {
        newUUID = UUID.randomUUID().toString();
        User.pictureTakenName = newUUID;
    }

    return new File(Environment.getExternalStorageDirectory(), newUUID);
}

并尝试从这条路上回来。