[英]Android 6 revoked permissions checked as granted
有一个不确定的帽子,我不确定是否是错误。
如果用户授予了权限,然后随后将其撤消,则似乎checkSelfPermission在撤消的许可上返回GRANTED。
例如,似乎在撤消许可后。CAMERA:
true == ActivityCompat.checkSelfPermission(context, permission.CAMERA)
== PackageManager.PERMISSION_GRANTED
我似乎发现相机被吊销的唯一方法是一个例外:
10-20 14:25:54.330: E/AndroidRuntime(13954): java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.google.android.GoogleCamera/com.android.camera.CaptureActivity clip={text/uri-list U:file:///storage/emulated/0/Pictures/JPEG_20151020_142554_399504353.jpg} (has extras) } from ProcessRecord{adc5d77 13954:com.conx2share.conx2share.staging/u0a144} (pid=13954, uid=10144) with revoked permission android.permission.CAMERA
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.os.Parcel.readException(Parcel.java:1599)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.os.Parcel.readException(Parcel.java:1552)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.app.Activity.startActivityForResult(Activity.java:3917)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.app.Activity.startActivityForResult(Activity.java:3877)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:855)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:907)
10-20 14:25:54.330: E/AndroidRuntime(13954): at android.support.v4.app.Fragment.startActivityForResult(Fragment.java:930)
有人知道这是用户错误还是新权限系统中的错误?
我参加聚会有点晚了,但是我只是遇到了这个问题,认为将来对其他人有用。
根据Google链接https://developers.google.com/android/guides/permissions#prerequisites
除了新的平台功能外,Android 6.0 Marshmallow还具有新的权限模型,可简化应用安装和自动更新过程。 现在,需要在运行时而不是在应用程序安装之前请求权限。
因此,如果将您的应用程序定位为SDK级别23或更高级别,则在AndroidManifest.xml中声明的权限是不够的(尽管有必要)。 确保您正在使用V4支持库,并进行如下所示的检查:
@Override
public void onClick(View view) {
// Check permission for CAMERA
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// Check Permissions Now
// Callback onRequestPermissionsResult interceptado na Activity MainActivity
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CAMERA},
MainActivity.REQUEST_CAMERA);
} else {
// permission has been granted, continue as usual
Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(captureIntent, 0);
}
就我而言,我对Fragment
进行了检查,但可以在Activity
完成,这取决于您的需求。
用户可以通过转到设置>应用程序> yourapp来授予对该应用程序的权限,然后授予该权限。 在这种情况下,逻辑沿else
并调用意图。 另一方面,生活并不那么轻松,用户不会那样做。 因此,我们必须调用ActivityCompat.requestPermissions:
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.CAMERA},
MainActivity.REQUEST_CAMERA);
在第一个参数中,我通过了getActivity()
因为我正在使用Fragment
。 如果您正在使用Activity
,请通过this
。 第二个参数是要检查的权限,第三个参数是应用程序定义的int
常量,将用作回调方法的标识符,我将在下面解释。
public static final int REQUEST_CAMERA = 1;
ActivityCompat.requestPermissions
将打开一个对话框,要求用户授予或拒绝权限。 这就是为什么我们必须使用onRequestPermissionsResult
方法的原因:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_CAMERA: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
如果像我一样使用Fragment
,则此回调方法必须位于包含Fragment
的Activity
中。
事实证明这是逻辑上的程序员错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.