• Android运行时权限开启问题


    参考:

    http://www.cnblogs.com/whoislcj/p/6072718.html(重点这篇)

    https://www.jianshu.com/p/b4a8b3d4f587

    https://www.cnblogs.com/xmcx1995/p/5870191.html

    1. 概念

    Android 6.0以下非运行时权限:

    Android的权限其实就是为了程序之间更加的安全的访问,所以权限有等级之分,比如:Normal 低风险权限 、Dangerous  高风险权限等,虽然有这种安全意识,但是这些权限只会在安装的时候被询问一次,一旦安装之后,如果app申请了高风险权限的话,而且大部分用户在安装的时候很少去关注这些权限列表,再加上很多Android市场都有静默安装的功能用户更加感知不到任何权限提示,就这样app就有可能会在后台做一些对用户带来伤害的事情。如下图所示:

    Android6.0运行时权限:

      鉴于6.0之前的版本权限管理相对不那么安全,所以Android 6.0 采用新的权限模型,只有在需要权限的时候,才告知用户是否授权,是在runtime时候授权,而不是在原来安装的时候 ,同时默认情况下每次在运行时打开页面时候,需要先检查是否有所需要的权限申请。这样的用户的自主性提高很多,比如用户可以给APP赋予摄像的权限,也可以使用权限。

    2. 代码

    在Android6.0以上多了一个运行时权限问题

    下面我们以SD卡来说明一下:

        public void savaFileToSD(String filename, String filecontent) throws Exception {
            //如果手机已插入sd卡,且app具有读写sd卡的权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                String[] PERMISSIONS_STORAGE = {
                        "android.permission.READ_EXTERNAL_STORAGE",
                        "android.permission.WRITE_EXTERNAL_STORAGE" };
                int REQUEST_EXTERNAL_STORAGE = 1;
    
                filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
                Log.d(TAG,"文件名:"+filename);
    
                try {
    //检测是否有写的权限
                    int permission = context.checkSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE");
    if (permission != PackageManager.PERMISSION_GRANTED) {
    // 没有写的权限,去申请写的权限,会弹出对话框
                        requestPermissions(context, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
                        Log.d(TAG, "没有权限");
                    }else {
                        Log.d(TAG, "有权限");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                //这里就不要用openFileOutput了,那个是往手机内存中写数据的
                FileOutputStream output = new FileOutputStream(filename);
    
                output.write(filecontent.getBytes());
                //将String字符串以字节流的形式写入到输出流中
                output.close();
                //关闭输出流
            } else Toast.makeText(context, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
        }
  • 相关阅读:
    普通锁和分布式锁
    java 正则表达式
    java 字符串转date 格式转换
    消息中间件 kafka
    数据的存储方式:对象存储、文件存储、块存储
    Exceptional Control Flow(6)
    Exceptional Control Flow(5)
    Exceptional Control Flow(4)
    Exceptional Control Flow(3)
    Exceptional Control Flow(2)
  • 原文地址:https://www.cnblogs.com/maogefff/p/8418476.html
Copyright © 2020-2023  润新知