神刀安全网

Android 6.0权限问题


一. 简介

对于6.0以下的权限在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录、短信等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。

新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权。它可以通过命令adb shell pm list permissions -d -g查看。

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

看到上面的危险权限都是一组一组的,在Android 6.x的机器上如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。

二.使用

  • Android系统使用方法
    1. 在AndroidManifest文件中添加需要的权限
      eg:<uses-permission android:name="android.permission.CALL_PHONE"/>
    2. 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) {         //权限已有      } else {//没有权限,申请一下         ActivityCompat.requestPermissions(this, new String[]{permission}, 1);//1自由设置,为回调code      } } else {     //已授权 } 

ContextCompat.checkSelfPermission,用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

shouldShowRequestPermissionRationale方法只有在用户在上一次已经拒绝过你的这个权限申请。也就是说,用户已经拒绝一次了,你又弹个授权框,你需要给用户一个解释,为什么要授权,则使用该方法。

    @Override     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {         super.onRequestPermissionsResult(requestCode, permissions, grantResults);         if (requestCode == 1) {             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                 //权限通过             } else {                 //权限拒绝             }             return;         }     } 

下面以拨打电话为例(其余动态申请危险权限的一样)

public class MainActivity extends AppCompatActivity {     private static final int PERMISSIONS_REQUEST = 1;      @Override     protected void onCreate(@Nullable Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);     }      public void testCall(View view) {         if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {             //未授权             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, PERMISSIONS_REQUEST);         } else {             //授权             callPhone();         }     }     private void callPhone() {         Intent intent = new Intent(Intent.ACTION_CALL);         intent.setData(Uri.parse("tel:" + "10086"));         startActivity(intent);     }     @Override     public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {         super.onRequestPermissionsResult(requestCode, permissions, grantResults);         if (requestCode == PERMISSIONS_REQUEST) {             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                 //授权同意回调                 callPhone();             } else {                 //授权拒绝回调                 Toast.makeText(MainActivity.this, "拒绝授权", Toast.LENGTH_SHORT).show();             }         }     } } 
  • RxPermissions第三方库使用方法
        RxPermissions rxPermissions = new RxPermissions(this);         RxView.clicks(findViewById(R.id.enableCall))                 .compose(rxPermissions.ensureEach(Manifest.permission.CALL_PHONE))                 .subscribe(new Action1<Permission>() {                                @Override                                public void call(Permission permission) {                                    Log.i(TAG, "Permission result " + permission);                                    if (permission.granted) {                                     } else if (permission.shouldShowRequestPermissionRationale) {                                        // Denied permission without ask never again                                    } else {                                        // Denied permission with ask never again   Need to go to the settings                                    }                                }                            },                         new Action1<Throwable>() {                             @Override                             public void call(Throwable t) {                                 Log.e(TAG, "onError", t);                             }                         },                         new Action0() {                             @Override                             public void call() {                                 Log.i(TAG, "OnComplete");                             }                         }); 

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » Android 6.0权限问题

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址