【问题标题】:Camera permission granted is not updated when button is Clicked单击按钮时未更新授予的相机权限
【发布时间】:2017-06-16 04:53:10
【问题描述】:

抱歉,这对你来说可能是一个微不足道的问题,但我做不到,所以请耐心等待。我正在创建这个片段布局,用户将通过一个按钮受到欢迎。如果用户单击按钮(命名;相机),则应用程序应显示一条弹出消息以授予或拒绝相机权限。如果授予权限,则按钮应滑动并隐藏。如果被拒绝,则显示一条 toast 消息。现在,我可以显示弹出消息来请求权限,但是当用户授予权限时,它不会滑动按钮并隐藏。但是当我再次单击该按钮时,它会滑动并隐藏。看起来当我调用 manageCameraPerm() 方法时它不会立即更新。任何帮助将不胜感激。谢谢。

这是我的片段类

@Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.cameraPerm:
                manageCameraPerm();
                if ((ActivityCompat.checkSelfPermission(getContext(),
                        android.Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {

                    v.startAnimation(animSlide);
                    allowCamera.setVisibility(View.GONE);
                    w = 1;
                }
                break;
     }
 }

// 这是我的 manageCameraPerm 方法

 private void manageCameraPerm() {
        if (ActivityCompat.checkSelfPermission(getContext(),
                android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    MY_PERMS_REQUEST_CAMERA);


        } else {

            Toast.makeText(getActivity(), "Camera is enabled", Toast.LENGTH_LONG).show();

        }
    }

【问题讨论】:

    标签: java android


    【解决方案1】:

    假设您使用的是 Marshmallow 或更高版本的设备,您必须通过回调方法 onRequestPermissionsResult() 处理 UI 代码(在这种情况下设置动画然后隐藏按钮),该方法负责检查是否提出请求后授予或不授予权限如下:

    // Displays a permission dialog when requested for devices M and above.
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        if (requestCode == MY_PERMS_REQUEST_CAMERA) {
    
            // User accepts the permission(s).
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                v.startAnimation(animSlide);
                allowCamera.setVisibility(View.GONE);
                w = 1;
            } else { // User denies the permission.
                Toast.makeText(this, "Please grant the permission", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    ...对于你的 manageCameraPerm() 方法:

    private void manageCameraPerm() {
    
        // Requests permission for devices with versions Marshmallow (M)/API 23 or above.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (ActivityCompat.checkSelfPermission(getContext(),
                android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    
                requestPermissions(new String[]{Manifest.permission.CAMERA},
                    MY_PERMS_REQUEST_CAMERA); // Invokes onRequestPermissionsResult()
    
                return;
            }
        }        
    

    【讨论】:

    • 如何使用 onRequestPermissionsResult 中的视图类?我指的是 v.startAnimation(animSlide);
    • @makkhaygurung 只需在 Activity 类的 UI 线程中的某处实例化一个 Button 成员变量/字段(ID:cameraPerm),然后相应地启动动画 :-)
    • 我没明白你的意思。该按钮已经在片段类中实例化,并且我已经在那里设置了 onClick 监听器。
    【解决方案2】:

    这是因为检查权限是否被授予的 if 语句发生在弹出窗口出现之后(当然权限还没有被授予)。您需要在 onPermissionResult 中触发动画(请参阅此处的“处理权限请求响应”部分:https://developer.android.com/training/permissions/requesting.html

    【讨论】:

    • 哈哈你说得对。那是一个愚蠢的错误。你猜怎么着?我已经在 onPermissionResult 中包含了 toast 消息,并且我正在其他地方尝试授予方案。
    【解决方案3】:

    在 android 中使用权限并不是那么简单。有一些图书馆可以像这样更容易:https://github.com/hotchemi/PermissionsDispatcher 就用这个库吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 2022-08-24
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多