onRequestPermissionsResult 中的布尔值发生变化,但 MainActivity 使用旧布尔值

boolean value in onRequestPermissionsResult changes but MainActivity uses old boolean value

如果我被授予权限,我将在 onRequestPermissionsResult 方法中更新一个布尔值。稍后在调用我的 checkPermission 方法后,我正在检查布尔值。 布尔值在 onRequestPermissionsResult 中发生变化,但在变化发生之前,MainActivity 代码运行并使用旧值。 MainActivity 没有等待 onRequestPermissionsResult 结束然后继续使用布尔值的最新值是什么问题。

我也是 运行 我手机上的代码有将近 300 个联系人,但应用程序一直只显示一个相同的随机联系人。

    textView = (TextView) findViewById(R.id.textview);

    ContentResolver contentResolver = getContentResolver();

    Cursor data = null;

    getPermissionStatus();

    //the if statement does not waits for the onRequestPermissionsResult to ends

    if (permissionGranted) {
        data = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, mSelectionColumns,
                null, null, null);
        if (data != null && data.getCount() > 0) {
            while (data.moveToNext()) {
                textView.setText(data.getString(
                        data.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
                        + "\t " +"\n");
            }
        } else
            Toast.makeText(this, "No data...", Toast.LENGTH_SHORT).show();
    } else
        Toast.makeText(this, "Permission not granted.", Toast.LENGTH_SHORT).show();

    if (data != null) {
        data.close();
    }

}

public void getPermissionStatus() {
    Toast.makeText(this, "Called", Toast.LENGTH_SHORT).show();

    if ((ContextCompat.checkSelfPermission(this,
            Manifest.permission.READ_CONTACTS)) !=
            PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(this, "Requesting...", Toast.LENGTH_SHORT).show();
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CONTACTS},
                REQ_CODE_READ_CONTACTS);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    switch (requestCode) {
        case REQ_CODE_READ_CONTACTS:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                //Main activity should these value of the permissinGranted
                permissionGranted = true;
                Toast.makeText(this, "Permission Granted...", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show();
                permissionGranted = false;
            }
    }

}

因为在 requestPermissions() 之后带有 if (permissionGranted) ... 运行s 的条件语句,并且由于线程(主要),以下代码行将 运行 就在 运行 之后,甚至在显示权限对话框之前。也就是说,您想要设置查询数据库的方法,该方法将在 运行 时间内在主线程中调用 Android 低于 6.0 的版本,并在 onRequestPermissionsResult() Android 6.0 及更高版本的回调方法。

此外,请记住 requesting permissions at runtime is only for Android 6.0 and above,因此请考虑重新配置您的条件语句,因为您的布尔标志 permissionGranted 对于低于 6.0 的版本始终为假。