程序运行是的权限分为两种,一种是普通权限,一种是危险权限。普通权限的话可以直接使用,只有危险权限需要询问用户的同意。
危险权限分组以及组内权限如下:
注:危险权限同一组内有一项权限被授权,则一组权限都被授权。
1 group:android.permission-group.CONTACTS 2 permission:android.permission.WRITE_CONTACTS 3 permission:android.permission.GET_ACCOUNTS 4 permission:android.permission.READ_CONTACTS 5 6 group:android.permission-group.PHONE 7 permission:android.permission.READ_CALL_LOG 8 permission:android.permission.READ_PHONE_STATE 9 permission:android.permission.CALL_PHONE 10 permission:android.permission.WRITE_CALL_LOG 11 permission:android.permission.USE_SIP 12 permission:android.permission.PROCESS_OUTGOING_CALLS 13 permission:com.android.voicemail.permission.ADD_VOICEMAIL 14 15 group:android.permission-group.CALENDAR 16 permission:android.permission.READ_CALENDAR 17 permission:android.permission.WRITE_CALENDAR 18 19 group:android.permission-group.CAMERA 20 permission:android.permission.CAMERA 21 22 group:android.permission-group.SENSORS 23 permission:android.permission.BODY_SENSORS 24 25 group:android.permission-group.LOCATION 26 permission:android.permission.ACCESS_FINE_LOCATION 27 permission:android.permission.ACCESS_COARSE_LOCATION 28 29 group:android.permission-group.STORAGE 30 permission:android.permission.READ_EXTERNAL_STORAGE 31 permission:android.permission.WRITE_EXTERNAL_STORAGE 32 33 group:android.permission-group.MICROPHONE 34 permission:android.permission.RECORD_AUDIO 35 36 group:android.permission-group.SMS 37 permission:android.permission.READ_SMS 38 permission:android.permission.RECEIVE_WAP_PUSH 39 permission:android.permission.RECEIVE_MMS 40 permission:android.permission.RECEIVE_SMS 41 permission:android.permission.SEND_SMS 42 permission:android.permission.READ_CELL_BROADCASTS
申请权限:
以获取拨打电话call权限为例。
首先在 AndroidManifest.xml 文件中声明所需的权限:
<uses-permission android:name="android.permission.CALL_PHONE"/>
在布局文件中设置一个按钮,然后在MainActivity中编写相关申请权限的逻辑。
申请主要分三个部分:
1.设置按钮点击事件,通过checkSelfPermission方法来判断是否有相关权限,如果没有权限,则调用requestPermissions方法来询问用户是否授权,如果有权限,则直接调用call()来进行执行。
2.在第一步调用完requestPermissions方法后,无论用户选择授权与否,都会回调到onRequestPermissionsResult()方法中,授权结果封装在grantResults参数中,所以判断授权结果,如果授权同意,则调用call方法,不同意则提示未获得授权。
3.call方法具体,使用隐身intent方法,动作为拨打电话,并设置相应电话号码,执行intent动作。为了防止程序奔溃,这些放在try方法里执行。
代码如下:
1 public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(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(new View.OnClickListener() { 13 @Override 14 public void onClick(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 void call() { 32 try { 33 Intent intent = new Intent(Intent.ACTION_CALL); 34 intent.setData(Uri.parse("tel:10086")); 35 startActivity(intent); 36 } catch (SecurityException e) { 37 e.printStackTrace(); 38 } 39 } 40 41 @Override 42 public void onRequestPermissionsResult(int requestCode, 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 }