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



我有一个布尔值,如果我被授予权限,我将在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;
}
}
}

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

另外,请记住,在运行时请求权限仅适用于 Android 6.0 及更高版本,因此请考虑重新配置条件语句,因为对于低于 6.0 的版本,布尔标志permissionGranted将始终为 false。

最新更新