Android 7.0 行为变更:通过FileProvider在应用间共享文件(ACTION_IMAGE_CAPTURE)

魔法少女酱 2024-05-22 ⋅ 20 阅读

随着Android系统的不断升级,开发者们需要不断适应新的行为变更和API更新。Android 7.0引入了一些重大的变更,其中之一是关于文件共享的变更。在本文中,我们将重点讨论通过FileProvider在应用间共享文件的变更,特别关注在使用ACTION_IMAGE_CAPTURE进行拍照操作时所涉及的一些变化。

1. 什么是FileProvider?

FileProvider是Android提供的一个特殊的ContentProvider,用于共享应用的私有文件。使用FileProvider,可以在没有文件读写权限的情况下,通过URI访问应用的文件。一般来说,当我们需要向其他应用共享应用内的文件时,可以使用FileProvider来实现。

2. FileProvider的使用步骤

下面是使用FileProvider进行文件共享的简要步骤:

步骤1:在AndroidManifest.xml中声明FileProvider

application标签下添加如下内容,指定FileProvider的名称和授权的文件路径:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.your.package.name.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

步骤2:创建file_paths.xml文件

res/xml目录下创建file_paths.xml文件,并添加所需的路径配置。以下是一个示例:

<paths>
    <files-path name="my_images" path="images/"/>
    <external-path name="my_files" path="."/>
</paths>

步骤3:生成共享的URI

在代码中使用FileProvider生成共享的URI,例如:

File imagePath = new File(getFilesDir(), "images");
File newFile = new File(imagePath, "example.jpg");
Uri contentUri = FileProvider.getUriForFile(context, "com.your.package.name.fileprovider", newFile);

3. Android 7.0的变更

在Android 7.0之前,我们可以直接将URI传递给ACTION_IMAGE_CAPTURE来保存拍摄的照片。然而,在Android 7.0及以后的版本中,安全性的考虑使得我们需要采取一些额外的步骤。

步骤4:授予临时权限

在调用ACTION_IMAGE_CAPTURE之前,我们需要为生成的URI授予临时的读写权限。在部分设备上,不授予权限可能导致Permission Denial异常。

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);

步骤5:处理返回结果

在接收ACTION_IMAGE_CAPTURE的返回结果时,我们可能需要通过FileProvider并使用提供的URI来访问图片。

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentUri);

4. 总结

通过FileProvider在Android 7.0及以上版本中实现文件共享可能需要我们额外的注意和操作,特别是在使用ACTION_IMAGE_CAPTURE进行拍照操作时。我们需要在AndroidManifest.xml中声明FileProvider,并授予临时的读写权限,以及在处理返回结果时使用提供的URI来访问图片。理解和适应这些行为变更,将有助于我们在应用开发中更好地与其他应用进行文件共享。

(完)


全部评论: 0

    我有话说: