美文网首页
Android 7.0你需要注意的一些坑。

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

作者: 844b9a3a3a68 | 来源:发表于2017-05-22 11:56 被阅读1764次

    一.安装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你需要注意的一些坑。

          本文链接:https://www.haomeiwen.com/subject/xlpbxxtx.html