gpt4 book ai didi

android - checkSelfPermission 返回 PERMISSION_GRANTED 以撤销 targetSdkVersion <= 22 的权限

转载 作者:IT老高 更新时间:2023-10-28 23:13:15 27 4
gpt4 key购买 nike

我正在研究 Android Marshmallow 的新权限模型,但遇到了一个我觉得很奇怪的问题。

targetSdkVersion 22 的应用(因此尚未使用 Android Marshmallow 的新权限模型)在 list 中声明 READ_CONTACTS 权限:

<uses-permission android:name="android.permission.READ_CONTACTS" />

并尝试通过Intent.ACTION_PICK读取联系人的电话号码:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT_REQUEST);

在使用 Marshmallow MRA58K 的设备上运行时,在我通过 ADB 安装应用程序后撤销权限后,ContextCompat.checkSelfPermission() 方法仍然返回 PERMISSION_GRANTED,但是稍后访问联系人时操作失败,因为返回了没有记录的游标。据我了解,这是避免旧版应用崩溃的默认“回溯兼容性”策略。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_CONTACT_REQUEST && resultCode == Activity.RESULT_OK) {
Log.i("", "Permission granted: " + (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED));
Uri contactUri = data.getData();
Cursor c = null;
try {
c = getContentResolver().query(contactUri, new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, null, null, null);
if (c != null && c.moveToFirst()) {
Log.i("", "got phone number: " + c.getString(0));
} else {
Log.w("", "No data received");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}

如何在尝试操作之前安全地检测用户是否在权限之前显式?

我还尝试了 https://github.com/googlesamples/android-RuntimePermissions 上的 Google 官方示例将 targetSdkVersion 设置为 22,结果相同:即使用户撤销了权限,也会记录授予权限,然后操作失败。

谢谢 ;)

最佳答案

关于android - checkSelfPermission 返回 PERMISSION_GRANTED 以撤销 targetSdkVersion <= 22 的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com