由于随着Android版本越来越高,Android对用户隐私保护力度越来越大,从Android6.0引入动态权限控制(Runtime Permission)到Android7.0私有目录被限制访问,“StrictMode API政策”.由于之前Android版本中,是可以读取到手机存储中任何一个目录及文件,这带来很多安全问题.在Android7.0中为了提高私有文件的安全性.面向Android N或者更高版本将被限制访问.

  • 私有文件的文件权限不再放权给所有的应用,使用MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE进行操作触发SecurityException.这使得无法通过File API访问手机存储上的数据了,基于File API的一些文件浏览器也将受到很大影响.

  • 给其他应用传递file://URI类型的Uri,可能会导致接收者无法访问该路径,因为在Android7.0中传递file://URI会触发FileUriExposedException.可以通过FileProvider来解决.

  • DownloadManager不再按文件名分享私人存储的文件,COLUMN_LOCAL_FILENAME在Android7.0中标记为deprecate,旧版应用在访问COLUMN_LOCAL_FILENAME可能会出现无法访问的路径.面向Android N或者更高版本中应用尝试访问COLUMN_LOCAL_FILENAME时会触发SecurityException.但可以通过ContentResolver.openFileDescriptor()来访问DownloadManager公开的文件.

    • 清单文件配置provider
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="xxx"><application><provider        android:name="android.support.v4.content.FileProvider"        android:authorities="${applicationId}.FileProvider"        android:exported="false"        android:grantUriPermissions="true">        <meta-data            android:name="android.support.FILE_PROVIDER_PATHS"            android:resource="@xml/rc_file_path" />    provider>application>manifest>

    res/xml/rc_file_path.xml

    <?xml version="1.0" encoding="utf-8"?><paths><external-path name="rc_external_path" path="."/>paths>
    • 创建临时图片

      if (CommonUtils.checkSDCard()) {        File stubFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.pathSeparator + CROP_FILE_NAME);        return FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".FileProvider", stubFile);        //return Uri.fromFile(Environment.getExternalStorageDirectory()).buildUpon().appendPath(CROP_FILE_NAME).build();Android7.0以前    } else {        File stubFile = new File(activity.getCacheDir().getAbsolutePath() + File.pathSeparator + CROP_FILE_NAME);        return FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".FileProvider", stubFile);        //return Uri.fromFile(activity.getCacheDir()).buildUpon().appendPath(CROP_FILE_NAME).build();Android7.0以前    }
    • 启动相机

      try {        //每次选择图片把之前的图片删除        clearCropFile(buildUri(fragment._mActivity));        LogUtils.d("feige", "buildUri-->" + buildUri(fragment._mActivity).getPath());        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);        intent.putExtra(MediaStore.EXTRA_OUTPUT, buildUri(fragment._mActivity));        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);        if (!isIntentAvailable(fragment._mActivity, intent)) {            return;        }        fragment.startActivityForResult(intent, INTENT_TAKE);    } catch (Exception e) {        e.printStackTrace();    }

更多相关文章

  1. Android中的Ninja简介
  2. 2010-02-27 传智播客—Android(二)数据存储和访问 之文件
  3. Android(安卓)4.0 Launcher2源码分析——主布局文件
  4. Android启动脚本init.rc
  5. Android系统添加自己写的工具
  6. ok6410开发板android底层驱动模块编写,出现insmod:init_module ‘
  7. Android中读写文件
  8. Android(安卓)Studio项目中的MainActivity.xml与ContentActivity
  9. NPM 和webpack 的基础使用

随机推荐

  1. 刚进入Android终端即可使用busybox的命令
  2. pc 应用 通过 usb adb 与 android客户端
  3. 第1章 Android图像概述
  4. 我也分享一下我Android的收入数据
  5. Android 6.x 新的运行时权限
  6. Android 开发之关于 drawable 你必须知道
  7. Android 文件保存getFilesDir()丶getCach
  8. Android -中毒
  9. Android 事件处理详解(一) —— 基于监听的
  10. Android(安卓)Studio地图开发之根据地点