当前位置: 首页 > 知识库问答 >
问题:

Android-请求权限对话框不出现在请求权限之后(活动、权限[]、请求代码)

诸葛令
2023-03-14

我一直在尝试实现运行时权限。下面是它的代码片段:

RunTimePermissionsUtil。JAVA

package com.orgzit.android.util;

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;

public class RuntimePermissionsUtil {

private static boolean shouldAskPermission() {
    return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
}

private static boolean shouldAskPermission(Context context, String permission) {
    if (shouldAskPermission()) {
        int permissionGrantedResult = ActivityCompat.checkSelfPermission(context, permission);
        return !(permissionGrantedResult == PackageManager.PERMISSION_GRANTED);
    }
    return false;
}

//TODO Karan 2018-09-20 Still need to investigate on the behaviour of storing in SharedPreferences whether I have asked for the permission before or not
public static void checkPermission(Context context, String permission, AskPermissionListener permissionListener) {
    if (shouldAskPermission(context, permission)) {
        if (!ActivityCompat.shouldShowRequestPermissionRationale(((Activity)context), permission)) {
            permissionListener.onNeedPermission();
        } else {
            permissionListener.onPermissionDisabled();
        }
    } else {
        permissionListener.onPermissionGranted();
    }
}

public interface AskPermissionListener {

    void onPermissionGranted();

    void onNeedPermission();

    void onPermissionDisabled();
}
}

在一个名为AddFileActivity的活动中,我在一个点击事件中实现了这个监听器,其代码如下:

public class AddFileActivity extends DrawerActivity {

private static final int CAMERA_REQ_CODE = 1001;
private static final int FILE_SELECT_REQ_CODE = 1002;

private Activity activity;

private RuntimePermissionsUtil.AskPermissionListener askPermissionListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activity = this;
    init();
    getSupportActionBar().setTitle("Add File");

    askPermissionListener = new RuntimePermissionsUtil.AskPermissionListener() {
        @Override
        public void onPermissionGranted() {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            cameraFileUri = getCameraFileUri();
            intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraFileUri);
            startActivityForResult(intent, CAMERA_REQ_CODE);
        }

        @Override
        public void onNeedPermission() {
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, CAMERA_REQ_CODE);
        }

        @Override
        public void onPermissionDisabled() {
            Toast.makeText(activity,"App does not have the permission to Open Camera :(", Toast.LENGTH_LONG).show();
        }
    };
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    Log.d("q","q");
}

private void init() {
            showFileChooser();
}


private void showFileChooser() {
    final CharSequence[] items = {"Open camera", "Select from device",
            "Cancel"};
    AlertDialog.Builder builder = new AlertDialog.Builder(AddFileActivity.this);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Open camera")) {
                RuntimePermissionsUtil.checkPermission(activity, Manifest.permission.CAMERA, askPermissionListener);
                Log.d("d","d");
            } else if (items[item].equals("Select from device")) {
                //DO SOMETHING
            } else if (items[item].equals("Cancel")) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

所以,我所有的代码都会执行,它会进入onNeed权限()代码,其中,它会进入

ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, CAMERA_REQ_CODE);

但是,令人惊讶的是,在此之后,没有任何对话框要求获得摄像头的运行时权限,相反,对话框关闭并再次显示活动。

有没有人能帮我解决这个问题,或者指出一个克服它的方法

共有1个答案

章增
2023-03-14

权限请求对话框未出现的原因有:

  • 要么许可已经被授予
  • 或者权限已设置为不再询问
  • 或者你还没有在舱单上声明许可

在所有情况下,都会立即调用onRequestPermissionsResult(),而不显示对话框。检查它是否被调用,并检查结果。

与其编写自己的实用程序类,我建议您看看我的库:https://github.com/nabinbhandari/Android-Permissions

 类似资料:
  • HttpURLConnection使我的应用程序崩溃,因为即使我在清单文件中使用标记,也没有授予internet权限

  • 我再一次需要你的帮助堆叠天花! 我一直在开发SDK,现在需要验证用户是否授予了位置或文件写入等权限。 验证是可以的,但是我想如果需要的话,我应该请求许可。问题是,我绝对不能访问任何活动。我可以使用appContext来检查权限,但是我不能像这样监听onRequest estPermissionsResult。 有没有一种聪明的方法可以向我这边请求许可,或者我应该让使用我的SDK的开发人员及时请求许

  • 首先,我知道这是一个重复的问题,但我已经看过了其他类似问题的答案,没有找到成功的解决方案。 我已经开发了一款应用程序,可以在我的测试设备上完美运行,这是一款运行Android L(5.0.1)的三星S4。不过,我希望这款应用程序也能在较新版本的Android上运行。 我知道Android M的请求权限已更改,因此必须在运行时请求权限,但当我尝试实现此功能时,对话框从未出现,因此从未请求所需的权限。

  • CodenameOne的似乎可以很好地使用Android TargetSDKVersion21权限。但在23号,它错误地要求一个 允许[...]访问设备上的照片、媒体和文件? 权限,但由于丢失而失败。 (没有摄像头的模拟器请求媒体文件--会不会有什么东西搞混了?) 更新(DDMS输出) (settingsform.java:98)

  • 问题内容: 嗨,我正在更新我的应用程序贾夫纳神庙。使其可以支持Android M设备(v 6.0及更高版本)。 有没有一种方法可以一次请求多个权限。例如:我想获得同时读取手机状态和位置信息的权限。 通过这种方式,我可以一一请求权限。但是我想在应用程序启动时立即放下两个权限。 请给我一些建议。Tnx。 问题答案: 有没有办法我可以一次请求多个权限 在您要传递给的许可中放置多个权限。 例如,在这个示例

  • 是否可以在同一个对话框中同时请求多个权限,比如读联系人、读短信和写外部存储? 如果是,如何做到?请提供一个例子。 我已经在网上搜索了几个小时,但找不到方法。请帮忙!