android 动态权限添加 ,你不得不学

为了用户权限的更好的控制,保护好用户的隐私,android在API23上面开始使用了动态全选的设置,对于这个引起的问题呢

1.如果你给你的App配置的targetSdkVersion设置的低于23的话,app会认为你没有在android6上进行测试,所以在app安装的时候会把所有的权限给列出来,然后"强迫"用户默认所有权限授权进行安装,(不受授权,不安装)

2,如果用户在设置中关闭权限的话会导致你的应用没有权限开启不了对应的功能,然后对应的操作也就会返回null或者0,然后后果的话你也就知道了。。。。

3.你的targetSdkVersion设置的不低于23,那么对于一些涉及隐私的你就要去动态的添加,我们先来看下权限的分类吧:

权限2大分类

PROTECTION_NORMAL权限 ,应用安装的时候授权(这些权限的话都是不涉及隐私的。用户也是不能关闭的)都有:

android.permission.ACCESS LOCATIONEXTRA_COMMANDS 
android.permission.ACCESS NETWORKSTATE 
android.permission.ACCESS NOTIFICATIONPOLICY 
android.permission.ACCESS WIFISTATE 
android.permission.ACCESS WIMAXSTATE 
android.permission.BLUETOOTH 
android.permission.BLUETOOTH_ADMIN 
android.permission.BROADCAST_STICKY 
android.permission.CHANGE NETWORKSTATE 
android.permission.CHANGE WIFIMULTICAST_STATE 
android.permission.CHANGE WIFISTATE 
android.permission.CHANGE WIMAXSTATE 
android.permission.DISABLE_KEYGUARD 
android.permission.EXPAND STATUSBAR 
android.permission.FLASHLIGHT 
android.permission.GET_ACCOUNTS 
android.permission.GET PACKAGESIZE 
android.permission.INTERNET 
android.permission.KILL BACKGROUNDPROCESSES 
android.permission.MODIFY AUDIOSETTINGS 
android.permission.NFC 
android.permission.READ SYNCSETTINGS 
android.permission.READ SYNCSTATS 
android.permission.RECEIVE BOOTCOMPLETED 
android.permission.REORDER_TASKS 
android.permission.REQUEST INSTALLPACKAGES 
android.permission.SET TIMEZONE 
android.permission.SET_WALLPAPER 
android.permission.SET WALLPAPERHINTS 
android.permission.SUBSCRIBED FEEDSREAD 
android.permission.TRANSMIT_IR 
android.permission.USE_FINGERPRINT 
android.permission.VIBRATE 
android.permission.WAKE_LOCK 
android.permission.WRITE SYNCSETTINGS 
com.android.alarm.permission.SET_ALARM 
com.android.launcher.permission.INSTALL_SHORTCUT 
com.android.launcher.permission.UNINSTALL_SHORTCUT


Dangerous Permissions: 设计隐私的权限,需要你去动态申请的

    Permission Group Permissions
    android.permission-group.CALENDAR
    • android.permission.READ_CALENDAR
    • android.permission.WRITE_CALENDAR
    android.permission-group.CAMERA
    • android.permission.CAMERA
    android.permission-group.CONTACTS
    • android.permission.READ_CONTACTS
    • android.permission.WRITE_CONTACTS
    • android.permission.GET_ACCOUNTS
    android.permission-group.LOCATION
    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_COARSE_LOCATION
    android.permission-group.MICROPHONE
    • android.permission.RECORD_AUDIO
    android.permission-group.PHONE
    • android.permission.READ_PHONE_STATE
    • android.permission.CALL_PHONE
    • android.permission.READ_CALL_LOG
    • android.permission.WRITE_CALL_LOG
    • com.android.voicemail.permission.ADD_VOICEMAIL
    • android.permission.USE_SIP
    • android.permission.PROCESS_OUTGOING_CALLS
    android.permission-group.SENSORS
    • android.permission.BODY_SENSORS
    android.permission-group.SMS
    • android.permission.SEND_SMS
    • android.permission.RECEIVE_SMS
    • android.permission.READ_SMS
    • android.permission.RECEIVE_WAP_PUSH
    • android.permission.RECEIVE_MMS
    • android.permission.READ_CELL_BROADCASTS
    android.permission-group.STORAGE
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

    首先你可能会有惊讶,为啥这个还分组了,其实这也是大google方便我们,只要你申请了一组里面的任一个权限,他会将相关的权限附带给你授权了,比如你申请了位置权限loaction中的ACCESS_FINE_LOCATION ,那么对应的该loaction 的ACCESS_COARSE_LOCATION权限你也会被授权了(只要你在manifest中有注册了)(不过如果你是个谨慎的人的话,还是老老实实的对每一个权限去申请,因为你指不定这个分组会变偷笑,毕竟 everything is possible

    相关的google的api文段

    http://developer.android.com/training/permissions/requesting.html

    http://developer.android.com/guide/topics/security/permissions.html


    如何去申请权限 

    1.  配置权限 和以前一样,先都是在manifest中配置好需要的所有的权限

    2.检查权限是否获取到    使用

    if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {
    
    //需要申请授权了
    }else{ }
    
    
    
    
    
    

    注:ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS),判断权限是否授权,返回的值是PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了

    3申请授权代码
    ActivityCompat.requestPermissions(activty,new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
    CODE_FOR_WRITE_PERMISSION);

    参数的话第一个 Context,第二个是授权的权限数组,第三个是requestCode,主要用于回调的时候检测。第二个参数的话传多个权限的话,就会弹出多个授权的对话框  , ⚠ 这里面的弹出对话框是不能进行定制的,是由各个手机去定制的比如gengenymotion上面的框是
    4.不用说接下来就是对弹出框的两个按钮的选择监听了

    @Override
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
    switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
    // If request is cancelled, the result arrays are empty.
    if (grantResults.length > 0
    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

    // permission was granted, yay! Do the
    // contacts-related task you need to do.

    } else {

    // permission denied, boo! Disable the
    // functionality that depends on this permission.
    }
    return;
    }
    }
    }


    GitHub上的封装

    你可以在github上面搜索到android permission就可以找到 很多的相关库,你选一个就OK了,这里就不做啰嗦了,(其实也就是懒癌有犯了)
    <a href=""http://blog.csdn.net/lmj623565791/article/details/50709663">http://blog.csdn.net/lmj623565791/article/details/50709663

    出自鸿洋之手了


      介绍一个 很简单的 权限GitHub 上的 easypermissions  http://www.jianshu.com/p/2b3661928e66












    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 1
      评论
    Android动态添加 Device Admin 权限,需要使用 DevicePolicyManager 类。下面是一个简单的示例代码: 1. 首先,在 AndroidManifest.xml 文件中声明需要使用 Device Admin 权限: ``` <receiver android:name=".MyDeviceAdminReceiver" android:description="@string/device_admin_description" android:label="@string/device_admin_label" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_receiver" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> ``` 2. 创建一个 DeviceAdminReceiver 子类 MyDeviceAdminReceiver,用于接收设备管理器事件的回调,并在 onEnabled() 方法中处理设备管理器启用事件: ``` public class MyDeviceAdminReceiver extends DeviceAdminReceiver { @Override public void onEnabled(Context context, Intent intent) { super.onEnabled(context, intent); // 在此处添加设备管理器所需的权限 DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName componentName = new ComponentName(context, MyDeviceAdminReceiver.class); if (dpm.isAdminActive(componentName)) { dpm.setCameraDisabled(componentName, true); } } } ``` 3. 在应用程序中动态请求设备管理器权限,并在用户授权后激活设备管理器: ``` private static final int REQUEST_CODE_ENABLE_ADMIN = 1; private void requestAdminPermissions() { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); ComponentName componentName = new ComponentName(this, MyDeviceAdminReceiver.class); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "需要设备管理器权限以禁用摄像头"); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_ENABLE_ADMIN) { if (resultCode == RESULT_OK) { // 设备管理器已激活,可以使用相关权限了 } else { // 用户拒绝了设备管理器权限 } } } ``` 以上就是在 Android动态添加 Device Admin 权限的简单示例代码。需要注意的是,设备管理器权限是非常敏感的权限,需要经过用户授权才能使用。在使用时,应提供必要的解释说明以获得用户的信任,并且在用户拒绝授权时,应优雅地处理相关逻辑。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值