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下创建文件夹

由于工作的需要,今天研究了在android下创建文件夹和修改其权限的方法,需要了解的是每个应用程序包都会有一个私有的存储数据的目录(类似文件夹),只有属于该包的应...
  • zoe6553
  • zoe6553
  • 2011年01月06日 11:04
  • 51180

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

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

android 6.0 创建文件或文件夹失败

在AndroidManifest.xml中添加权限 代码如下File appDir = new File(Environment.getExternalStoragePublicDirectory(...
  • yukun314
  • yukun314
  • 2016年08月01日 10:31
  • 7431

android读写文件的实现(针对android4.4不能在sdcard根目录下创建文件夹)

sdcard的读操作 // public String loadFromSDFile(String fname) // { // String result=null; // try { /...
  • u014271612
  • u014271612
  • 2015年09月23日 11:34
  • 1835

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

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

android 7.0对开发者会有哪些影响

Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。 本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。 如果您之前发布过 Android 应用,请注意您...
  • jiabailong
  • jiabailong
  • 2016年09月02日 10:06
  • 7482

Android 4.0系统在sdcard不能创建目录

在项目移植过程中发现了一个离奇的问题,以前的项目是2.3的。后来移植到4.0上面发现sdcard不能创建目录权限全部都加了。 研究了一会发现目录出现多层是不能创建 例如:(/mnt/sdcard/t...
  • qhs1573
  • qhs1573
  • 2012年11月14日 12:44
  • 4170

Android 创建文件夹 && 创建文件 (写人数据 || 续写数据)

记录自己比较头痛老忘记的方法,创建文件夹,存放文件,存放图片等资源,这样可以再开发APP时从本地加载,减少网络请求,无网络请求也可以完成基本使用。 需要读写权限:(*6.0以上需要动态加载权限...
  • Mr_ChenXu
  • Mr_ChenXu
  • 2018年01月19日 14:34
  • 10

AndroidN 7.0的注意事项

Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。 本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。如果您之前发布过 Android 应用,请注意您的...
  • changsimeng
  • changsimeng
  • 2017年02月17日 10:55
  • 990

Android 7.0 FileProvider的使用

我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载。 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和...
  • yq6073025
  • yq6073025
  • 2016年10月26日 15:04
  • 12209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 7.0你需要注意的一些坑。
举报原因:
原因补充:

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