当前位置: 首页 > 知识库问答 >
问题:

使用FileProvider拍照后无法保存在图库中

葛景龙
2023-03-14

由于我已使用FileProvider将我的应用程序迁移到Android N,所以我无法在手机的图库中看到我的图片(即使版本低于Android N)。所以我创建了一个小测试应用程序来调试它,但没有成功。

在我的舱单中

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>

<application
    ...>
    ...


    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"></meta-data>
    </provider>
</application>

在file\u路径中。xml

<paths>
<external-files-path
    name="test_images"
    path="Pictures/TestPictures"/>
</paths>

我做了一个小活动,显示上次拍摄的照片,以确保URI是正确的:

private final static int REQUEST_CAMERA = 1102;
public static final String CAMERA_IMAGES_DIR = "TestPictures";
String mOutputFilePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onCamera();
        }
    });
}

public void onCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        File photoFile = createImageFile();
        Uri photoURI = FileProvider.getUriForFile(this,
                getPackageName() + ".fileprovider",
                photoFile);
        mOutputFilePath = photoFile.getAbsolutePath();
        intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CAMERA)
        onCaptureImageResult();
}

private void onCaptureImageResult() {
    if (mOutputFilePath != null) {
        File f = new File(mOutputFilePath);
        Uri finalUri = Uri.fromFile(f);
        galleryAddPic(finalUri);
        ((ImageView) findViewById(R.id.imageView)).setImageURI(finalUri);
    }
}

public File createImageFile() {
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), CAMERA_IMAGES_DIR + "/");
    if (!storageDir.exists())
        storageDir.mkdir();
    return new File(storageDir, imageFileName + ".jpg");
}

private void galleryAddPic(Uri contentUri) {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
    sendBroadcast(mediaScanIntent);
}

我的照片在我的应用程序和我的文件浏览器中,如预期的那样,但我在照片库中看不到它。我尝试使用FileProvider Uri,那也不行。

共有1个答案

公良鸿畅
2023-03-14

问题似乎是要添加到图库的文件的位置,而不是添加它的方式。

getExternalFilesDir(Environment.DIRECTORY\u PICTURES)不适用于媒体扫描,但适用于环境。getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)执行此操作。但是,我们不能将最后一张照片与FileProvider一起使用,因此我需要在公共目录中创建照片的副本。

我更新代码如下:

private void onCaptureImageResult() {
    if (mOutputFilePath != null) {
        File f = new File(mOutputFilePath);
        try {
            File publicFile = copyImageFile(f);
            Uri finalUri = Uri.fromFile(publicFile);
            galleryAddPic(finalUri);
            ((ImageView) findViewById(R.id.imageView)).setImageURI(finalUri);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public File copyImageFile(File fileToCopy) throws IOException {
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), CAMERA_IMAGES_DIR + "/");
    if (!storageDir.exists())
        storageDir.mkdir();
    File copyFile = new File(storageDir, fileToCopy.getName());
    copyFile.createNewFile();
    copy(fileToCopy, copyFile);
    return copyFile;
}

public static void copy(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst);
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
 类似资料:
  • 我正在用FileProvider在Android牛轧糖上拍照,这是我的代码 file_paths.xml: 编辑丢失的文件#createNewFile();

  • 我的应用程序(使用SDK小于24)可以使用相机拍照和视频。这些照片和视频可以在应用程序外的图库中查看。SDK 24及以上版本要求FileProvider创建uri,以便将照片或视频保存到多媒体资料中。 在SDK 24之前,我会使用uri和拍照意图: 使用SDK24及更高版本会出现异常: 我想使用FileProvider实现同样的目标(没有例外)。下面的实现可以拍照,但照片不会出现在图库中。我想知道

  • 我可以按下一个按钮,打开原生相机app,成功拍下一张照片。但当我查看手机上的照片库或原生应用程序时,照片并没有保存在那里。我对Android很陌生,所以很可能我的代码中遗漏了一些重要的东西。 问题: 1)这些图片保存在哪里? 2)我是否可以修改下面的代码,以保存到内部存储,所以所有的图片拍摄与我的应用程序是私人的,只能通过我的应用程序访问? 3)如果我想将这些图片连同一些文本/其他输入一起保存到一

  • 我正在开发一个Android应用程序,在某个时候我必须拍摄一张照片并将其保存到图库中。相机将打开并拍摄照片,但不会将其保存到多媒体资料中。这是我的密码: 布局: 有人能帮帮我吗?我已经搜索了其他类似的问题,但都没有帮助我。感谢大家,祝大家有美好的一天。

  • 我已经阅读了几个文档和堆栈,但是我不太确定如何实现这个。。。 帮助或示例代码将真正帮助我理解更多。 下面是运行相机的代码集,它工作得非常好,我的下一个问题是,我如何让它自动保存到手机库中?

  • 我正在尝试使相机应用程序存储输出到我的内部存储。我还知道第三方应用程序不能访问我的应用程序的内部存储,但我们可以通过公开内部目录来做到这一点。我在这里遵循了指南: 相机意图不保存照片 https://developer.android.com/reference/android/support/v4/content/fileprovider.html 当我运行应用程序时,我可以得到以下Logcat