动态申请权限后当前Activity退出的问题

这个问题应该还有更合理的解决方式比如线程之类的,异步操作使得申请到权限后发送数据启动需要权限的活动。
我这里使用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;
    }

如果有更好的方法希望大神不吝赐教。谢谢了。(不想用线程异步,太麻烦了。)

猜你喜欢

转载自blog.csdn.net/weixin_37627774/article/details/108942117