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

使用Android FileProvider将照片和视频保存到图库

焦同
2023-03-14

我的应用程序(使用SDK小于24)可以使用相机拍照和视频。这些照片和视频可以在应用程序外的图库中查看。SDK 24及以上版本要求FileProvider创建uri,以便将照片或视频保存到多媒体资料中。

在SDK 24之前,我会使用uri和拍照意图:

private void openCameraForResult(int requestCode){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    picturesDirectoryPhotoFileName = nextFileName();
    File photoFile = makePicturesPhotoFile();
    Uri uri = Uri.fromFile(photoFile);
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, requestCode);
}

private File makePicturesPhotoFile() {
    File photoGallery = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    File media = new File(photoGallery, picturesDirectoryPhotoFileName);

    return media;
}

使用SDK24及更高版本会出现异常:

Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/Pictures/126cfd69-59c6-4534-9b2e-4af9753d3643.jpg exposed beyond app through ClipData.Item.getUri()

我想使用FileProvider实现同样的目标(没有例外)。下面的实现可以拍照,但照片不会出现在图库中。我想知道我做错了什么。

Androidanifest.xml:

    <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/provider_paths"/>
    </provider>

提供者路径。xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="Pictures" path="Pictures"/>
    <external-path name="Movies" path="Movies"/>
</paths>

拍一张照片:

private void openCameraForResult(int requestCode){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    picturesDirectoryPhotoFileName = nextFileName();
    File photoFile = makePicturesPhotoFile();
    getDependencyService().getLogger().debug(photoFile.getAbsolutePath());
    Uri uri = fileProviderUri.makeUriUsingSdkVersion(photoFile);
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, requestCode);
}

制作Uri

private static final String AUTHORITY_FORMAT = "%s.fileprovider";

public  Uri makeUriUsingSdkVersion(File file) {
    Uri uri;

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
        uri = Uri.fromFile(file);
    } else {
        String packageName = getApplicationContext().getPackageName();
        String authority = String.format(Locale.getDefault(), AUTHORITY_FORMAT, packageName);
        uri = getUriForFile(getApplicationContext(), authority, file);
    }

    return uri;
}

共有1个答案

商宝
2023-03-14

这张照片出现在GT-I9300 Galaxy S3的图库中,所以我知道代码在该设备上运行。在Galaxy 7上,照片只有在手机打开和关闭后才会出现在多媒体资料中。

经过几天的研究,答案是使用媒体扫描文件来更新图库。在图片目录中创建照片是不够的。下面是一个扫描单个文件的类:

import android.app.Activity;
import android.media.MediaScannerConnection;
import android.net.Uri;

import java.io.File;

class Gallery implements IGallery {

    private Activity activity;

    public Gallery(Activity activity) {
        this.activity = activity;
    }

    @Override
    public void scanFile(File file) {
        if(activity == null || file == null) {
            return;
        }

        MediaScannerConnection.scanFile(activity,
                new String[] { file.getAbsolutePath() }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                    }
                });
    }

}
 类似资料:
  • 了解如何将 Apple 照片图库迁移到 Lightroom - Adobe 的全新一体化服务,专为摄影爱好者设计。 准备要进行迁移的 Apple 照片图库 请确保将您要迁移的 Apple 照片图库设置为“系统照片图库”。要将图库设置为“系统照片图库”,请执行以下步骤: 打开 Apple 照片,并在菜单栏中选择偏好设置。 单击通用标签,然后在图库位置下方选择用作系统照片图库。 选择“用作系统照片图库

  • 本文向大家介绍iOS中读取照片库及保存图片或视频到照片库的要点解析,包括了iOS中读取照片库及保存图片或视频到照片库的要点解析的使用技巧和注意事项,需要的朋友参考一下 读取照片库PhotoLibrary iOS中如果我们只有一次读取一张图片或者一个视频(或拍一张照片/视频)的需求,那么我们用 UIImagePickerController 就可以搞定。但是很多时候我们需要一次性从PhotoLibr

  • 问题内容: 我正在开发phonegap应用程序,我需要将URL中的图像保存到Device Photo Gallery。 我在Phonegap Api上找不到执行此操作的方法,而且我也没有找到用于此目的的phonegap插件。 我需要它才能与Iphone和Android一起使用 非常感谢! 问题答案: 这是任何人都可以使用的文件下载代码。您只有三个参数可以像这样使用- 1) 网址 2)您要在SD卡中

  • 了解如何将照片和视频从 Lightroom Classic 迁移到 Lightroom - Adobe 的全新一体化服务,专为照片爱好者设计。 如果您之前使用过 Lightroom Classic,那么您应该已经熟悉“目录”这一概念。Lightroom Classic 中的目录是一个数据库(.lrcat 文件),其中包含您的每张照片和任何已导入视频的记录。目录中的记录包括:对照片在系统上的位置的引

  • 我对JavaCV FFMPEGFrameRecOrder的使用有点困惑。我有几个字节[]或短[]数组(取决于我的图像是8位还是16位),如果我有几个图像的相关数据。现在,我的想法是使用JavaCPP将每个图像发送到ffmpeg,这样它就可以在我希望的framerate上从这个集合中创建一个静音视频。到目前为止,我有: 但我经常犯这样的错误 谢了!

  • 我想从Firebase存储中播放视频,其中包含我正在尝试的视频视图,如下所示: 但它不会播放。视频是空的。