Android 权限申请
参考资料
https://www.jianshu.com/p/338741725cd0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
Android权限(普通权限+危险权限)
https://blog.csdn.net/feibendexiaoma/article/details/80093354
允许安装未知来源权限(一)
https://blog.csdn.net/qq_34330286/article/details/79660059
Android6.0以上允许读写权限
- Android权限分类*
正常权限,危险权限,特殊权限
- 正常权限
正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。此类权限都是正常保护的权限,只需要在Manifest文件中简单声明,安装即授权,如网络权限
配置方法,在Manifest文件中简单声明,安装即授权
<uses-permission android:name="android.permission.INTERNET" />
- 危险权限
危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
配置方法,使用时先检查权限是否开启,未开启则需要用户手动开启
如果App需要用到危险权限,需要这一权限的操作时都必须检查自己是否拥有该权限。检查权限代码如下所示:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
如果应用已经具有了该权限,此方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PERMISSION_DENIED,此时应用应当进行权限申请。
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
注意:表格中的每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中的其他权限也会同时被授权。
配置源码
单个权限
//第一步:看权限是否已经被申请,没有则申请权限
private void CheckPermssion(){
boolean haveInstallPermission;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
//是否有获取手机EMEI权限
if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
{
//第二步调用requestPermissions申请权限
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_PHONE_STATE},2);
}
}
}
//第三步:若有需要,调用回调函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
}
多个权限
//第一步:看权限是否已经被申请,没有则申请权限
private void CheckPermssion(){
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()]);
//第二步调用requestPermissions申请权限
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
}
}
}
}
//第三步:若有需要,调用回调函数
@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;
}
}
}
3 特殊权限
有许多权限其行为方式与正常权限及危险权限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细信息,以响应该 intent。