onRequestPermissionsResult中的布尔值更改,但MainActivity使用旧的布尔值

时间:2017-07-12 23:06:45

标签: android android-permissions android-runtime

我有一个布尔值,如果我被授予了权限,我将在onRequestPermissionsResult方法中更新。之后调用checkPermission方法后,我检查了boolean的值。 boolean的值在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;
            }
    }

}

1 个答案:

答案 0 :(得分:0)

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

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