Android 6.0及其更高版本中,即API>=23之后的版本中某些受保护的权限无法直接通过Manifest来直接默认获取,只能通过动态获取,这样做的好处是显而易见的,可以让权限用在该用的地方。
动态获取权限要做的是这几件事情:
- 判断当前的系统版本,API版本的多少来确定使用哪种获取权限的方法,如果API小于23那么就不需要发起权限获取操作。
- 如果API大于或等于23那么就发起权限获取,
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
this
为当前的操作主体Activity,string数组内为所请求的权限,可见可以同时获取多个权限,最后一位是请求码requestcode。
- 最后一步是确定回调函数onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult) 其中grantResult数组的第一位若等于PackageManager.PERMISSION_GRANTED那么说明权限被授予否则权限授予失败。
接下来show you the code:
1 2 3 4 5 6 7 8 9 10 11
| button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try{ requestCameraPermission(); }catch (Exception e){ Log.d("CameraDemo Start",e.toString()); } } });
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private void requestCameraPermission(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ int checkCameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA); if(checkCameraPermission != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1); return; }else{ Toast.makeText(MainActivity.this,"相机权限已获取成功",Toast.LENGTH_LONG).show(); onCallCamera(); } }else{ Toast.makeText(MainActivity.this,"API小于23无需获取权限,只需要声明即可",Toast.LENGTH_LONG).show(); onCallCamera(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public void onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult){ switch (requestCode){ case 1: if(grantResult[0] == PackageManager.PERMISSION_GRANTED){ onCallCamera(); }else{ Toast.makeText(MainActivity.this,"权限被拒绝",Toast.LENGTH_LONG).show(); } break; default: super.onRequestPermissionsResult(requestCode,Permissions,grantResult); } } private void onCallCamera() { Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(i, 1); Toast.makeText(MainActivity.this, "函数调用成功", Toast.LENGTH_LONG).show(); } protected void onActivityResult(int requestcode, int resultCode, Intent data){ try{ if(requestcode !=1){ return; } super.onActivityResult(requestcode,resultCode,data); Bundle extras = data.getExtras(); Bitmap bitmap = (Bitmap)extras.get("data"); imageView.setImageBitmap(bitmap); }catch (Exception e){ Log.d("Camera",e.toString()); } }
|
下面是另外一个动态获取权限的思路:
1 2 3 4 5 6 7 8 9
| Intent i =new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); }else { startActivityForResult(i,1); Toast.makeText(MainActivity.this,"test_1",Toast.LENGTH_LONG).show(); } startActivityForResult(i,1); Toast.makeText(MainActivity.this,"test_2",Toast.LENGTH_LONG).show();
|
核心部分是:
1
| if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); }
|
其中的本质就是判断权限是否存在,然后若是不存在该权限那么就直接申请。但有一个坏处是这里申请的权限是写死的,最好的解决办法是写一个函数便于调用。