版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq952290156/article/details/52814789
官方运行时权限请求方法
运行时权限
核心方法 (需Android 6.0 (API level 23)及以上)
检查是否已获得系统权限context.checkPermission(permission, Process.myPid(), Process.myUid())
请求指定的系统权限:会弹出系统的对话框
activity.requestPermissions(permissions, requestCode); fragment.requestPermissions(permissions, requestCode);
检查是否需要弹出开发者自定义的对话框:
用户拒绝使用权限后,再次点击请求操作(如拍照)时,弹出开发者自定义的对话框;// 用户拒绝使用权限后,再次点击请求操作(如拍照)时,返回true; // 用户第一次请求权限时,返回false; activity.shouldShowRequestPermissionRationale(permission); fragment.shouldShowRequestPermissionRationale(perm);
使用第三方框架处理运行时权限(EasyPermissions)
用法(以读取短信总数为例)
public class MainActivity extends AppCompatActivity
implements EasyPermissions.PermissionCallbacks //实现EasyPermissions接口并重写方法
{
// 请求码
public static final int CODE_READ_SMS = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onclick(View view) {
readSmsCount();
}
/**
* 读取短信
* 需要注入注解 (参数: 自定义的请求码)
*/
@AfterPermissionGranted(CODE_READ_SMS)
public void readSmsCount() {
String[] perms = new String[] {
Manifest.permission.READ_SMS,
Manifest.permission.READ_EXTERNAL_STORAGE
};
// 判断是否有权限
// this: 当前Activity,Activity需要实现接口EasyPermissions.PermissionCallbacks
if (EasyPermissions.hasPermissions(this, perms)) {
// 有权限,就可以读取短信了
// AsyncQueryHandler
int count = -1;
Cursor cursor = getContentResolver().query(Uri.parse("content://sms"),
null, null, null, null);
if (cursor != null) {
count = cursor.getCount();
cursor.close();
}
Toast.makeText(this, "短信条数:" + count, Toast.LENGTH_SHORT).show();
} else {
// 没权限,则需要请求权限
// 参数1:传当前Activity
// 参数2:当首次请求权限被拒绝时再次请求时提示的信息
// 参数3:自定义的请求码
// 参数4:权限
EasyPermissions.requestPermissions(this,
"此操作要用到短信权限...",
CODE_READ_SMS, perms);
}
}
// 用户点击了同意时调用
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
System.out.println("-----------------用户点击了同意");
}
// 用户点击了拒绝时调用
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
System.out.println("-----------------用户点击了拒绝");
}
// 用户点击了同意或者拒绝时都会调用此方法
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
System.out.println("-----------------onRequestPermissionsResult");
}
}