注意:本篇文章是本人阅读相关文章所写下的总结,方便以后查阅,所有内容非原创,侵权删。
本篇文章内容来自于
1.Android第一行代码 郭霖
目录
1.权限分类(普通权限+危险权限)
2.申请单个权限 第一行代码248
3.申请多个权限 第一行代码388
1.权限分类
1⃣️低于6.0系统的设备<use-permission> 安装时给权限申请提醒,而且可以在设置中进行管理。如果不同意某项则这个软件不能使用。
2⃣️6.0系统加入运行时权限 用户不需要在安装时一次性申请所有权限,可以在软件使用过程中对某一项申请进行授权 拒绝后只是不能用这个功能,其他功能依旧可以使用
但并不是所有权限都需要运行时申请,对于用户来说,不停授权也很麻烦。
Android将所有权限分为:
普通权限 系统自动授权(只需要在清单文件中<use-permission> )
危险权限 必须用户手动授权 威胁安全(需要动态申请)
Android中有上百种权限,如何区分哪些是普通哪些是危险。危险权限一共有9组24个,其他的都是普通权限。
所有权限列表查看Android权限列表(转)
Android危险权限:
编号 | 权限组 | 权限 |
---|---|---|
0 | CALENDAR | READ_CALENDAR WRITE_CALENDAR |
1 | CAMERA | CAMERA |
2 | CONTACTS | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
3 | LOCATION | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
4 | MICROPHONE | RECORD_AUDIO |
5 | PHONE | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
6 | SENSORS | BODY_SENSORS |
7 | SMS | SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
8 | STORAGE | READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE |
注意:表格中的每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中的其他权限也会同时被授权。
2.申请单个权限
例子:点击按钮进行拨号,需要危险权限中的CALL_PHONE权限
第一步:在清单文件中声明权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apple.encryptiondemo">
<uses-permission android:name="android.permission.CALL_PHONE" />
...
第二步:在代码中进行动态申请权限
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_call = findViewById(R.id.btn_call);
btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//==第一步:判断用户是否已经授权
//ContextCompat.checkSelfPermission() 参数一:context 参数二:具体的权限名
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//没有授权,则申请授权
//ActivityCompat.requestPermissions() 参数一:context 参数二:申请的权限名数组 参数三:请求码,要求唯一值
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
call();
}
}
});
}
@SuppressLint("MissingPermission")
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//==第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
Toast.makeText(MainActivity.this, "you denied", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
3.申请多个权限
第一步:在清单文件中声明权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apple.encryptiondemo">
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
第二步:在代码中进行动态申请权限
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_call = findViewById(R.id.btn_call);
btn_call.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//第一步:看权限是否已经被申请,没有则申请权限
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.CALL_PHONE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
String[] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
call();
}
}
});
}
@SuppressLint("MissingPermission")
private void call() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
//第二步:调用requestPermissions申请权限,不管是否同意都会回调onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
call();
}else{
Toast.makeText(MainActivity.this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
}