程序运行是的权限分为两种,一种是普通权限,一种是危险权限。普通权限的话可以直接使用,只有危险权限需要询问用户的同意。
危险权限分组以及组内权限如下:
注:危险权限同一组内有一项权限被授权,则一组权限都被授权。
1 group:android.permission-group.CONTACTS2 permission:android.permission.WRITE_CONTACTS3 permission:android.permission.GET_ACCOUNTS4 permission:android.permission.READ_CONTACTS5
6 group:android.permission-group.PHONE7 permission:android.permission.READ_CALL_LOG8 permission:android.permission.READ_PHONE_STATE9 permission:android.permission.CALL_PHONE10 permission:android.permission.WRITE_CALL_LOG11 permission:android.permission.USE_SIP12 permission:android.permission.PROCESS_OUTGOING_CALLS13 permission:com.android.voicemail.permission.ADD_VOICEMAIL14
15 group:android.permission-group.CALENDAR16 permission:android.permission.READ_CALENDAR17 permission:android.permission.WRITE_CALENDAR18
19 group:android.permission-group.CAMERA20 permission:android.permission.CAMERA21
22 group:android.permission-group.SENSORS23 permission:android.permission.BODY_SENSORS24
25 group:android.permission-group.LOCATION26 permission:android.permission.ACCESS_FINE_LOCATION27 permission:android.permission.ACCESS_COARSE_LOCATION28
29 group:android.permission-group.STORAGE30 permission:android.permission.READ_EXTERNAL_STORAGE31 permission:android.permission.WRITE_EXTERNAL_STORAGE32
33 group:android.permission-group.MICROPHONE34 permission:android.permission.RECORD_AUDIO35
36 group:android.permission-group.SMS37 permission:android.permission.READ_SMS38 permission:android.permission.RECEIVE_WAP_PUSH39 permission:android.permission.RECEIVE_MMS40 permission:android.permission.RECEIVE_SMS41 permission:android.permission.SEND_SMS42 permission:android.permission.READ_CELL_BROADCASTS
申请权限:
以获取拨打电话call权限为例。
首先在 AndroidManifest.xml 文件中声明所需的权限:
在布局文件中设置一个按钮,然后在MainActivity中编写相关申请权限的逻辑。
申请主要分三个部分:
1.设置按钮点击事件,通过checkSelfPermission方法来判断是否有相关权限,如果没有权限,则调用requestPermissions方法来询问用户是否授权,如果有权限,则直接调用call()来进行执行。
2.在第一步调用完requestPermissions方法后,无论用户选择授权与否,都会回调到onRequestPermissionsResult()方法中,授权结果封装在grantResults参数中,所以判断授权结果,如果授权同意,则调用call方法,不同意则提示未获得授权。
3.call方法具体,使用隐身intent方法,动作为拨打电话,并设置相应电话号码,执行intent动作。为了防止程序奔溃,这些放在try方法里执行。
代码如下:
1 public classMainActivity extends AppCompatActivity {2
3 @Override4 protected voidonCreate(Bundle savedInstanceState) {5 super.onCreate(savedInstanceState);6 setContentView(R.layout.activity_main);7
8 /*设置按钮点击事件,通过checkSelfPermission方法来判断是否有相关权限9 * 如果没有权限,则调用requestPermissions方法来询问用户是否授权10 * 如果有权限,则直接调用call()来进行执行*/
11 Button makeCall =(Button) findViewById(R.id.make_call);12 makeCall.setOnClickListener(newView.OnClickListener() {13 @Override14 public voidonClick(View view) {15 /*该方法传入两个参数,第一个是context,第二个是要获得的权限名。16 将返回值与PackageManager.PERMISSION_GRANTED做比较*/
17 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)18 !=PackageManager.PERMISSION_GRANTED) {19 /*为获得授权,调用requestPermissions方法向用户申请授权,20 传入三个参数:context,获得的权限名字符串,以及请求码,唯一值即可。*/
21 ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);22 } else{23 call();24 }25 }26 });27 }28
29 /*call方法具体,使用隐身intent方法,动作为拨打电话,并设置相应电话号码,执行intent动作。30 * 为了防止程序奔溃,这些放在try方法里执行。*/
31 private voidcall() {32 try{33 Intent intent = newIntent(Intent.ACTION_CALL);34 intent.setData(Uri.parse("tel:10086"));35 startActivity(intent);36 } catch(SecurityException e) {37 e.printStackTrace();38 }39 }40
41 @Override42 public void onRequestPermissionsResult(intrequestCode, String[] permissions,43 int[] grantResults) {44 switch(requestCode) {45 case 1:46 if (grantResults.length > 0 && grantResults[0] ==PackageManager.PERMISSION_GRANTED) {47 call();48 } else{49 Toast.makeText(this, "you denied the permission", Toast.LENGTH_LONG).show();50 }51 break;52 default:53 }54 }55 }
原文:https://www.cnblogs.com/Mask-D/p/9520291.html