转载请注明出处:https://blog.csdn.net/mythmayor/article/details/81388482
一、运行时权限工具类。
二、运行时权限简述。
自从安卓6.0系统开始,Android中引入了运行时权限,需要在代码中动态申请,下面是需要动态申请的所有运行时权限:
这里有两点需要注意:
1.运行时权限在安卓6.0系统及以上版本中只在AndroidManifest.xml配置中是不行的,还需要在代码中动态申请,可参考文章末尾的例子。
2.每个运行时权限都属于一个权限组,我们在申请某一权限并通过用户的授权后,该权限所在的权限组中其它的权限也会被授权。
/**
* 运行时权限(危险权限)一共是9组24个权限:
*
* 权限组名 权限名
* ----------------------------------------------
* CALENDAR READ_CALENDAR
* WRITE_CALENDAR
* ----------------------------------------------
* CAMERA CAMERA
* ----------------------------------------------
* CONTACTS READ_CONTACTS
* WRITE_CONTACTS
* GET_ACCOUNTS
* ----------------------------------------------
* LOCATION ACCESS_FINE_LOCATION
* ACCESS_COARSE_LOCATION
* ----------------------------------------------
* MICROPHONE RECORD_AUDIO
* ----------------------------------------------
* PHONE READ_PHONE_STATE
* CALL_PHONE
* READ_CALL_LOG
* WRITE_CALL_LOG
* ADD_VOICEMAIL
* USE_SIP
* PROCESS_OUTGOING_CALLS
* -----------------------------------------------
* SENSORS BODY_SENSORS
* -----------------------------------------------
* SMS SEND_SMS
* RECEIVE_SMS
* READ_SMS
* RECEIVE_WAP_PUSH
* RECEIVE_MMS
* -----------------------------------------------
* STORAGE READ_EXTERNAL_STORAGE
* WRITE_EXTERNAL_STORAGE
* -----------------------------------------------
*/
下面附上在代码中申请运行时权限的完整Demo(以拨打电话为例):
public class RuntimePermissionActivity extends AppCompatActivity {
private static final int REQUEST_CODE_CALL_PHONE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_runtime_permission);
}
/**
* 按钮点击事件,点击按钮拨打电话
* @param view
*/
public void makecall(View view) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, REQUEST_CODE_CALL_PHONE);
} else {
call();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_CALL_PHONE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
Toast.makeText(this, "用户拒绝该权限", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
private void call() {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:12580"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
}