我们在使用一些官方app时,刚下载进去之后经常会弹出各种各样的权限获取请求,今天简单学习了下,希望不会误人子弟哈哈哈哈。
一、将需要用到的权限添加到Manifest清单里
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
这一步很重要,本人Debug时发现如果缺少这步,进入界面后点击屏幕毫无反应......
private static final String[] REQUEST_PERMISSIONS = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO,
};
private static final int PERMISSION_REQUEST_CODE = 1;
同时将对应的权限放到1个String数组里,标记一个权限申请标识码。
二、OnStart方法申请权限
在OnStart方法里判断权限是否申请过,如果没有,进行申请,申请的方法里用到了之前的String数组和权限申请标识码
@Override
protected void onStart() {
super.onStart();
if (!hasPermissionsGranted(REQUEST_PERMISSIONS)) {
Log.d(Tag,"-------activityCompat.requestPermissions--------");
ActivityCompat.requestPermissions(this, REQUEST_PERMISSIONS, PERMISSION_REQUEST_CODE);
}
}
hasPermissionsGranted()方法:遍历String里的权限检测是否已经授予。
/**
* ContextCompat类的checkSelfPermission方法用于检测用户是否授权了某个权限。
* PackageManager.PERMISSION_DENIED : -1
* PackageManager.PERMISSION_GRANTED : 0 表示授权成功
*/
public boolean hasPermissionsGranted(@NonNull String[] permissions) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
return false;
//此时没有授权,返回false
}
}
return true;
//已经授权过,返回true
}
onRequestPermissionsResult()方法:在对应的Activity中获取到回调结果,通过标识码和hasPermissionsGranted()方法判断是否授予权限成功,失败则调用finish()方法退出应用。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Log.d(Tag,"-------onRequestPermissionsResult--------");
if (requestCode == PERMISSION_REQUEST_CODE) {
if (!hasPermissionsGranted(REQUEST_PERMISSIONS)) {//返回false代表申请失败
Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
this.finish();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
综上一个简单的权限申请demo已经成功。后续也可以在定制化的申请弹窗方面研究一下。
如有错误和疑问,敬请矫正!