首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android 6撤销了被检查为授予的权限

Android 6撤销了被检查为授予的权限
EN

Stack Overflow用户
提问于 2015-10-21 02:47:05
回答 2查看 8.2K关注 0票数 0

我有个问题,我不确定是不是bug。

如果用户授予了某个权限,然后又撤销了它,则checkSelfPermission似乎会在撤销的权限上返回GRANTED。

例如,似乎在撤销permission.CAMERA之后:

代码语言:javascript
复制
true == ActivityCompat.checkSelfPermission(context, permission.CAMERA)
                            == PackageManager.PERMISSION_GRANTED

我发现相机被吊销的唯一方法似乎是通过一个例外:

代码语言:javascript
复制
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)

有没有人知道这是用户错误还是新权限系统中的错误?

EN

回答 2

Stack Overflow用户

发布于 2016-05-22 01:06:54

我参加聚会有点晚了,但我刚刚遇到了这个问题,我想将来应该对其他人有用。

根据谷歌链接https://developers.google.com/android/guides/permissions#prerequisites

连同新的平台功能,Android6.0棉花糖有一个新的权限模型,简化了应用程序的安装和自动更新过程。权限现在是在运行时请求的,而不是在应用程序安装之前。

因此,如果您的应用程序的目标是SDK level 23或更高级别,则在AndroidManifest.xml中声明的权限是不够的(尽管有必要)。确保您使用的是V4支持库,并按如下所示进行检查:

代码语言:javascript
复制
@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并调用intent。另一方面,生活并不是那么容易,用户不会这么做。因此,我们必须调用ActivityCompat.requestPermissions:

代码语言:javascript
复制
ActivityCompat.requestPermissions(getActivity(),
                                              new String[]{Manifest.permission.CAMERA},
                                              MainActivity.REQUEST_CAMERA);

在第一个参数中,我传递了getActivity(),因为我使用的是Fragment。如果您使用的是Activity,则传递this。第二个参数是要检查的权限,第三个参数是应用程序定义的int常量,该常量将用作回调方法的标识符,稍后将对其进行解释。

代码语言:javascript
复制
public static final int REQUEST_CAMERA = 1;

ActivityCompat.requestPermissions将打开一个对话框,询问用户是授予还是拒绝权限。这就是我们必须使用onRequestPermissionsResult方法的原因

代码语言:javascript
复制
@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,则此回调方法必须位于包含FragmentActivity中。

票数 7
EN

Stack Overflow用户

发布于 2015-10-23 03:14:25

这被证明是程序员在逻辑上的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33244500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档