Android 7.0你需要注意的一些坑。

原创 2017年03月23日 09:52:06

一.安装apk报错:android.os.FileUriExposedException

1.在AndroidMainifest.xml文件中添加:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
</provider>
authorities:app的包名.fileProvider grantUriPermissions:true,表示授予 URI 临时访问权限 exported:false resource:下一步添加的文件

2.在res下新建一个名为xml的文件家,再新建文件provider_paths:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="files_root"
        path="Android/data/com.example.downloadapk/"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>
path:需要临时授权访问的路径(.代表所有路径) name:给访问路径命名

3.安装apk文件:

   /**
     * 安装apk文件
     *
     * @param apkFile 安装包所在目录
     */
    private void installApk(File apkFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        try {
            String[] command = {"chmod", "777", apkFile.toString()};
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.start();
        } catch (IOException ignored) {
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(getApplicationContext(),
                    BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }

        startActivity(intent);
    }

二.调取系统相机崩溃解决android.os.FileUriExposedException

1、首先是在 AndroidManifest.xml 中申明

    <provider
        android:name=".ImagePickerProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

2、创建一个provider_paths.xml 文件在 res文件夹下的 xml 文件夹下。

res/xml/provider_paths.xml

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

3、在适当的地方去替换它

                Uri uri;
                if (VERSION.SDK_INT <= VERSION_CODES.M){
                    uri = Uri.fromFile(takeImageFile);
                }else{
                    /**
                     * 7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider
                     * 并且这样可以解决MIUI系统上拍照返回size为0的情况
                     */
                    uri = FileProvider.getUriForFile(activity, ProviderUtil.getFileProviderName(activity), takeImageFile);
                }

                Log.e("nanchen",ProviderUtil.getFileProviderName(activity));
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
import android.content.Context;

/**
 * 用于解决provider冲突的util
 *
 * Date: 2017-03-23  12:21
 */

public class ProviderUtil {

    public static String getFileProviderName(Context context){
        return context.getPackageName()+".provider";
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 7.0 FileProvider 使用说明

FileProvider 这个组件在Android 22.0.0 (也就是 Android 5.0 ) 版本下加入进Android系统,该组件是ContentProvider的子类,功能就是用来提供文...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

安卓外置sd卡创建文件失败的解决办法

安卓的变化日新月异,包括安卓系统的自身优化,这给开发者带来一定的问题,开发者需要做大量的兼容性工作。 在文件本地存储方面,安卓4.4以前一般是单卡。以前的安卓机基本是用一张可以拔插的sd卡来存储大文...

Android7.0适配教程与心得

这篇文章是在APP架构师的微信公众号上看到的,整理的相当全面,分享给大家一起看 权限更改 随着Android版本越来越高,Android对隐私的保护力度也越来越大。从Android6.0引入的...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

快速使用FileProvider解决Android7.0文件权限问题

升级到Android7.0之后,启动系统相机或者截图,传入URI的时候可能会导致闪退FileUriExposedException。使用FileProvider可以快速修复这个BUG...

Android7.0文件访问权限

在Android N之后大家会发现一些奇奇怪怪的问题,这里也是自己在开发的时候遇到的,做一个记录:情况出现在,把自己的手机刷成了Android N,然后,坑就来了,发现调用相册的地方崩溃了,提示Fil...

如何在Android7.0系统下通过Intent安装apk

Android7.0的系统上,进行安装apk, 会报这段错误。 > Caused by: android.os.FileUriExposedException...

Android 7.0 给开发者带来了什么

Android 7.0 给开发者带来了什么新的 Andorid N (Andorid 7.0)预览版发布了,但是新的Android预览版需要我们在已存在的APP上测试几乎全部内容,包括不同种类的屏幕尺...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 7.0你需要注意的一些坑。
举报原因:
原因补充:

(最多只允许输入30个字)