`
ch_kexin
  • 浏览: 899305 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

Android 7.0适配-应用之间共享文件(FileProvider)

 
阅读更多

(1)新建一个module

创建一个library的module,在其AndroidManifest.xml中完成FileProvider的注册,代码编写为:

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

 注意一点,android:authorities不要写死,因为该library最终可能会让多个项目引用,而android:authorities是不可以重复的,如果两个app中定义了相同的,则后者无法安装到手机中(authority conflict)。

同样的的编写file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path
        name="root"
        path="" />
    <files-path
        name="files"
        path="" />

    <cache-path
        name="cache"
        path="" />

    <external-path
        name="external"
        path="" />

    <external-files-path
        name="external_file_path"
        path="" />
    <external-cache-path
        name="external_cache_path"
        path="" />

</paths>

 最后再编写一个辅助类,例如:

public class FileProvider7 {

    public static Uri getUriForFile(Context context, File file) {
        Uri fileUri = null;
        if (Build.VERSION.SDK_INT >= 24) {
            fileUri = getUriForFile24(context, file);
        } else {
            fileUri = Uri.fromFile(file);
        }
        return fileUri;
    }

    public static Uri getUriForFile24(Context context, File file) {
        Uri fileUri = android.support.v4.content.FileProvider.getUriForFile(context,
                context.getPackageName() + ".android7.fileprovider",
                file);
        return fileUri;
    }


    public static void setIntentDataAndType(Context context,
                                            Intent intent,
                                            String type,
                                            File file,
                                            boolean writeAble) {
        if (Build.VERSION.SDK_INT >= 24) {
            intent.setDataAndType(getUriForFile(context, file), type);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            if (writeAble) {
                intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            }
        } else {
            intent.setDataAndType(Uri.fromFile(file), type);
        }
    }
}

 可以根据自己的需求添加方法。

好了,这样我们的一个小库就写好了

(2)使用

如果哪个项目需要适配7.0,那么只需要这样引用这个库,然后只需要改动一行代码即可完成适配啦,例如:

拍照

public void takePhotoNoCompress(View view) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        String filename = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA)
                .format(new Date()) + ".png";
        File file = new File(Environment.getExternalStorageDirectory(), filename);
        mCurrentPhotoPath = file.getAbsolutePath();

        Uri fileUri = FileProvider7.getUriForFile(this, file);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PHOTO);
    }
}

 只需要改动: Uri fileUri = FileProvider7.getUriForFile(this, file);即可。

 安装apk

FileProvider7.setIntentDataAndType(this, intent, "application/vnd.android.package-archive", file, true);即可。

https://github.com/hongyangAndroid/FitAndroid7

 

分享到:
评论

相关推荐

    Android-android7.0访问文件打开相机功能

    应用不再能直接访问外部存储(SD卡)上的所有文件,而是需要使用`FileProvider`来共享文件。`FileProvider`是一个特殊的`ContentProvider`,它允许安全地共享私有文件,而不会暴露文件路径。 2. **使用FileProvider...

    适用Android7.0的最新android-support-v4包

    标题中的"适用Android7.0的最新android-support-v4包"指的是该压缩包提供的`android-support-v4`库是针对Android 7.0 (Nougat)优化的,意味着它包含了所有与Android 7.0兼容的功能,并可能包括对新API的适配和性能...

    android7.0适配demo(图片选择,下载)

    - Android 7.0引入了`FileProvider`,以更安全的方式共享文件。在使用`Uri`进行文件操作时,必须通过`FileProvider`获取`content://`类型的`Uri`。 - `Intent`中使用`FLAG_GRANT_READ_URI_PERMISSION`和`FLAG_...

    Android调用摄像头拍照(兼容7.0)

    在Android 7.0及以上版本,由于采用了FileProvider来处理文件共享,我们需要创建一个`AndroidManifest.xml`中的`&lt;provider&gt;`标签来配置FileProvider,并在res/xml目录下创建一个`file_paths.xml`文件,定义可共享的...

    解决安卓7.0拍照闪退的问题,安卓拍照,图片选择,剪切,使用fileprovider7.0文件读写的权限,安卓6.0以上权限适配

    `FileProvider` 是一个特殊的ContentProvider,用于安全地共享应用私有的文件,如照片、视频等。因此,当应用需要使用相机拍摄照片或从图库选取图片时,必须通过`FileProvider`获取一个安全的URI,以避免权限问题...

    Android7.0行为变更之适配File Provider的方法

    Android 7.0 行为变更之适配 File Provider 的方法 Android 7.0 行为变更之适配 ...Android 7.0 行为变更之适配 File Provider 的方法可以帮助开发者轻松地共享文件给其他应用程序,同时也提高了应用程序的安全性。

    Android系统录制视频(适配7.0)

    对于Android 7.0,我们需要特别处理文件 Uri 的安全问题,因为它引入了FileProvider来代替直接使用文件路径。以下是创建FileProvider的配置和获取Uri的步骤: 1. 在`AndroidManifest.xml`中添加`&lt;provider&gt;`标签,...

    Android-为使用系统原生选择图片需求做了一个工具类封装并适配了Android7.0

    到了Android 7.0,系统对Intent的行为进行了调整,尤其是对于第三方应用的文件访问,引入了"FileProvider"来提供安全的文件共享。 下面,我们将逐步构建这个工具类: 1. **权限管理**: - 在`AndroidManifest.xml...

    android7 相机适配

    Android 7.0的相机适配主要涉及权限管理、FileProvider的使用以及对第三方应用相机访问的限制。下面我们将详细探讨这些关键点。 1. **权限管理**: 在Android 6.0(API级别23)开始,运行时权限模型被引入,这意味...

    FileProvider使用demo

    在Android开发中,`FileProvider`是Android API Level 14引入的一个非常重要的组件,主要用于在应用间安全地共享文件。由于Android 7.0(API Level 24)之后对权限管理的加强,传统的通过Uri共享文件的方式已经不再...

    androidN 7.0安装APK方法

    3. **使用FileProvider:** 对于简单的文件共享,Android提供了内置的`FileProvider`类,它是ContentProvider的一个子类,专门用于处理文件共享。只需在AndroidManifest.xml中声明FileProvider,并在需要的地方使用`...

    Android7.0自动更新适配 包解析异常

    总结来说,针对Android7.0的自动更新适配,开发者需要理解系统的新安全策略,并采取相应的措施,如使用`FileProvider`来处理文件共享,遵循严格的权限控制,从而确保应用在各个版本上的稳定运行。这个过程不仅解决了...

    解决Android7.0更新后无法安装的问题

    下面详细讲解如何使用`FileProvider`来适配Android 7.0以上的设备: 首先,我们需要检查设备的Android版本,如果大于等于Android 7.0,则使用`FileProvider`。这里是一个示例代码片段: ```java if (Build.VERSION...

    Android相机相册裁剪兼容7.0

    针对Android 7.0的文件访问限制,我们需要使用`FileProvider`来共享文件URI。`FileProvider`是一个安全的`ContentProvider`子类,可以防止其他应用通过Intent访问私有文件。当设置`Intent.EXTRA_OUTPUT`时,应使用`...

    适配Android高低版本自动更新apk安装

    在Android7.0及以上版本,为了安全起见,你需要添加FLAG_ACTIVITY_NEW_TASK和FLAG_GRANT_READ_URI_PERMISSION标志: ```java installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT &gt;...

    (拍照/打开相册)后裁剪压缩并显示出来(6.0 7.0也进行了适配)

    - Android 7.0引入了FileProvider,用于安全地共享私有文件。开发者需要在AndroidManifest.xml中配置FileProvider,并使用`FileProvider.getUriForFile()`获取Uri,避免使用`file://` Uri,防止因安全问题导致应用...

    Android7..0调用相机,相册获取图片并裁剪

    在共享文件时,需要创建一个`FileProvider`并配置`&lt;provider&gt;`标签在`AndroidManifest.xml`中。 - `Uri`权限:当裁剪照片时,如果目标应用是Android 7.0或更高版本,需要在启动裁剪 Intent 时使用`...

    安卓个人中心头像模块(从相册选择和照相功能,适配7.0)

    - 安卓7.0引入了FileProvider以解决安全问题,我们需要创建一个`AndroidManifest.xml`中的`&lt;provider&gt;`标签来配置FileProvider,并在`res/xml`目录下创建`file_paths.xml`来指定可共享的文件路径。 4. **拍照并...

    android实现附件预览效果

    在Android 7.0中,文件访问更加强调安全,使用`FileProvider`可以安全地共享文件。 3. 第三方应用交互:在本例中,预览附件可能需要借助WPS等第三方应用。使用`Intent`是Android中启动其他应用的常见方式。开发者...

    Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

    `FileProvider`是Android提供的安全方式来共享文件,特别是在Android 7.0及以上版本。然后,我们启动相机应用,并通过`EXTRA_OUTPUT`附加到Intent,这样相机应用就会将照片保存到指定的URI。 2. **启动相册**: ...

Global site tag (gtag.js) - Google Analytics