android申请权限
可以设置三个函数对整个应用的权限做处理
checkPermissions()
checkPermissions中检查所有权限是否本身就已经给予
使用ContextCompat.checkPermission()
requestPermissions()
发起权限请求弹框
有一个请求码区分 与 OnRequestPermissionsResult()呼应区分出这次的请求
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)
可以检查是否用户已经勾选了不在禁止后不再提示
理论上这句可以不要,刁民都会不给权限了,肯定知道怎么重新打开
如果想考虑这个人笨的情况可以引导去设置重新打开
使用ActivityCompat.requestPermissions()
OnRequestPermissionsResult()
其中OnRequestPermissionsResult()是重写的方法
在ActivityCompat.requestPermissions()点击了允许或不允许之后程序会直接调用此函数,如果深耕为什么会自己回调,
就像OnCreate()在页面被创建时会自己调起一样
原理其实可以去 Ctrl B, 跳去ActivityCompat去分析一下,不过为了节约时间,将时间花到更多美好的地方我们所作的方式基本都是询问AI或者直接请教更加大神的人或者直接放弃我当一个定理记住即可。
grantResults[]就是requestPermissions中String权限组对应的权限响应结果,位置一致
在这里可以做到拦截未赋予权限的情况,以下使用的方式是未赋予权限直接finish完成退出页面。
注意点:
获取相关权限需要在Manifest中声明不同android版本可能权限的属性值可能还会不一样,在Mainfest中声明之后,长按android应用点击-详细信息-权限中就能看到相关的权限了。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Notebook"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".PicturePickerActivity"
android:exported="true">
</activity>
</application>
</manifest>
private static final int PERMISSION_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ps_item_grid_image);
if (checkPermissions()) {
//做得到权限之后的事情
} else {
requestPermissions();
}
}
private boolean checkPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
} else {
return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED;
}
}
private void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_CONTACTS},
PERMISSION_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_CONTACTS},
PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "所有权限都被赋予", Toast.LENGTH_SHORT).show();
//做得到权限之后的事情
} else if(grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "权限被拒绝,无法获取图片", Toast.LENGTH_SHORT).show();
this.finish();
//未得到权限 ,将页面结束防止未得到权限还是用权限的情况,会出现anr弹框
} else if(grantResults.length>0 && grantResults[1] != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "权限被拒绝,无法读取联系人", Toast.LENGTH_SHORT).show();
this.finish();
} else{
this.finish();
}
}
}