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";
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c__chao/article/details/65437099

android之manifest.xml内provider详解 .

原文地址分别是http://blog.csdn.net/imdxt1986/article/details/7280110 和 http://www.2cto.com/kf/201205/13248...
  • winson_jason
  • winson_jason
  • 2012-10-26 15:56:10
  • 15924

Android Provider 属性

Android provider 属性详解
  • cpwolaichile
  • cpwolaichile
  • 2016-02-26 10:38:14
  • 2533

利用meta-data的数据,动态更改contetnprovider的authorities

因为业务需要,做个库给应用使用,需要动态的给contentprovider配置uri,于是便用到了meta和${applicationId},很方便的解决了问题,并且极大的方便了其他应用的使用。 1...
  • DG_summer
  • DG_summer
  • 2016-12-15 23:02:06
  • 1627

Android 总结:ContentProvider 的使用

一、概述ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。 Android内置的许多数据都是使用ContentProvider形式,供开发者调用的 (...
  • u014136472
  • u014136472
  • 2015-11-18 16:45:26
  • 10705

转载:android 各种xml资源的引用方式

转载来源 http://blog.csdn.net/hunanwy/article/details/8517269 前言   本章内容为Android开发者指南的Framework T...
  • shanshan_blog
  • shanshan_blog
  • 2016-12-12 15:27:04
  • 927

Android Resource介绍和使用

Android Resource介绍和使用 2010-04-21 21:54:01 标签:资源 resource 移动开发 Android 休闲 原创作品,允许转载,转载时请务必以超链接形式...
  • RuingMan
  • RuingMan
  • 2016-09-21 14:11:22
  • 1354

android app版本升级(DownloadManager、适配6.0、7.0)

说明: 1.本文使用系统DownloadManager在通知栏更新下载进度 2.动态权限使用第三方库EasyPermissions(https://github.com/googlesamp...
  • u010296640
  • u010296640
  • 2017-06-20 18:11:18
  • 3922

关于AndroidManifest.xml 添加多个 provider节点问题

我们知道在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获...
  • Luck_mw
  • Luck_mw
  • 2017-02-10 14:23:30
  • 7739

Android7.0 SDcard无法创建文件夹解决办法

1. 背景 Android开发过程中,需要在SDcard目录内创建文件夹并创建文件保存内内容,首先在AndroidManifest.xml中加入相关权限 ...
  • yewuqingxuan
  • yewuqingxuan
  • 2017-07-14 18:17:02
  • 3378

Android 7.0 FileProvider 使用说明

FileProvider 这个组件在Android 22.0.0 (也就是 Android 5.0 ) 版本下加入进Android系统,该组件是ContentProvider的子类,功能就是用来提供文...
  • soslinken
  • soslinken
  • 2017-04-12 17:26:48
  • 4557
收藏助手
不良信息举报
您举报文章:Android 7.0你需要注意的一些坑。
举报原因:
原因补充:

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