文章目录
这个问题应该还有更合理的解决方式比如线程之类的,异步操作使得申请到权限后发送数据启动需要权限的活动。
我这里使用finish()直接结束当前Activity,防止产生页面切换的情况影响使用。
1.环境
- 手机版本:Huawei pro20
- 编程环境:Android 10 + Sdk30 + Jdk 8
- 问题:动态申请读取读取联系人,主线程自动进行到申请权限后面的部分,导致闪退等问题。
2.解决
解决方法如下:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(ResolverActivity.this, new String[]{
Manifest.permission.READ_CONTACTS}, 123);
// 这样就直接结束了当前Activity,相当于弹框。
finish();
} else {
// 以下是需要权限才能执行的代码。
setTextResolver();
}
手机尝试没有问题,这里允许我用虚拟机代替:
3.以下提供简单的测试效果代码
只提供代码部分,布局没啥难度就不提供了。
private void setTextResolver() {
TextView tv_res = findViewById(R.id.tv_resolver);
List<String> resolverOfContact = getResolverOfContact();
tv_res.setText(resolverOfContact.toString());
}
/**
*
* @return 获取联系人名称。
*/
private List<String> getResolverOfContact() {
List<String> listres = new ArrayList<>();
ContentResolver resolver = getContentResolver();
Cursor query = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
// 下面这行在没有权限时会出问题。
query = resolver.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null);
}
while (query!= null && query.moveToNext()) {
String display_name = query.getString(query.getColumnIndex("display_name"));
listres.add(display_name);
}
query.close();
return listres;
}
如果有更好的方法希望大神不吝赐教。谢谢了。(不想用线程异步,太麻烦了。)