- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在研究 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.support.v4.content.PermissionChecker
https://developer.android.com/reference/android/support/v4/content/PermissionChecker.html
关于android - checkSelfPermission 返回 PERMISSION_GRANTED 以撤销 targetSdkVersion <= 22 的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33039188/
我的问题是我不确定使用什么字符串键来检查通知权限。对于关键 "com.google.android.c2dm.permission.RECEIVE" 此代码始终返回 true,即使我从我的 list
我正在尝试运行 Android 示例 camera2basic。有一种调用 checkSelfPermission 的方法需要 API 级别 23,但我在只支持 API 级别 21 的手机上运行。ch
我在下面的代码中收到错误: if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)
我正在尝试让我的应用为 Android 6 做好准备,但现在我遇到了需要请求和检查权限的问题。 我尝试了文档中的以下内容: int permissionCheck = ContextCompat.ch
我的客户要求测试他们的 APK。我在我的 Android 6 和 Android 4 上安装了那个应用程序。但是它在启动时崩溃了。 错误 java.lang.NoSuchMethodError: an
是否可以运行 Google Sample - RuntimePermissionsBasic 在操作系统低于 MNC (Android M) 的设备上? 这个项目附带: compileSdkVersi
我有使用的应用程序 它在 Android 6.0 上自动授予,但我可以在设置中撤销它。想要检查它是否被授予以防用户撤销它,所以我这样做: int permissionCheck = ContextC
目前我有以下方法来检查 Marshmallow 的 AppCompatActivity 中的运行时权限: if(Build.VERSION.SDK_INT > Build.VERSION_CODES.
我有一个 Android 应用程序,我想检查相机权限。但是,即使我将其关闭(在模拟器或真实设备的应用程序设置中),结果始终为 0(GRANTED)。我用的模拟器和真机是SDK 23,Android M
我正在尝试使运行时权限向后兼容旧设备,但使用支持库我无法在 ContextCompat 类中找到 checkSelfPermission() 静态调用,但其记录为 here 这是我的项目 gradle
我正在开发一款需要用户提供多项权限(位置、外部存储、相机和手机状态)的应用程序,如果我一个接一个地提出请求,当我运行应用程序,这是一个问题: if (ActivityCompat.checkSelfP
在我的 android 应用程序(minSdkVersion 15)中,我必须创建目录并将文件写入其中。在我的 AppManifest 中,我正在使用: 在创建目录或文件之前,我正在检查是否允许或
我明白为什么 Android Studio 显示 MissingPermission警告。 Call requires permission which may be rejected by user
因此,我现在已经在这里坐了 4 个小时,对为什么我的 2 台设备行为不端而摸不着头脑。 问题是,即使授予了权限, checkSelfPermission 也会返回 false! 我 100% 确定这不
当按下 ListView 中的通话按钮时,我正在检查电话通话权限。由于某种原因,我在 checkSelfPermission() 方法中作为参数传递的 Context 导致了空指针异常。我使用过 th
这可能是一个非常愚蠢的问题。 我有一个几年前使用 Eclipse 编写的应用程序,适用于 Android OS 8 (2.3.x)。我正在尝试将其带入现代世界(仍然使用 8 构建,但目标是 28),并
我已经发布了我的 Android 应用程序,但我看到用户出现很多以下错误。我无法每次在模拟器上自己重现该问题,因此我很难自己调试它。 当用户在后台运行一段时间后打开我的应用程序时,似乎会发生这种情况。
我想知道下面代码中的 this 关键字指的是什么(代码块是请求访问用户位置的权限)。 class RequiresLocation : AppCompatActivity() { overri
我在检查权限时遇到问题,在 6.0 中总是说 nullpointer 我的调试: 我做错了什么 public String getGeolocation(Context context){ t
嗨,我在 Eclipse 中有一个旧项目,当我尝试像这样检查SelfPermission时: ContextCompat.checkSelfPermission(this, Manifest.per
我是一名优秀的程序员,十分优秀!