在运行时请求权限,Android M+

2023-11-20

首先,我知道这是一个重复的问题,但我已经看过其他类似问题的答案,但未能通过这些解决方案取得成功。

我开发了一个应用程序,它可以在我的测试设备上完美运行,该设备是运行 Android L (5.0.1) 的三星 S4,但我希望该应用程序也可以在较新版本的 Android 上运行。

我知道 Android M+ 的请求权限已更改,因此必须在运行时询问它们,但当我尝试实现此功能时,对话框永远不会出现,因此永远不会请求所需的权限。

我请求的权限是ACCESS_FINE_LOCATION.

这是我的清单文件中的相关代码:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果尚未获得许可,我请求许可:

if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

    startGeofenceMonitoring();

} else {
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}

askForPermission 函数(对 Google 的示例稍作修改):

private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {

            //This is called if user has denied the permission before
            //In this case I am just asking the permission again
            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);

        } else {

            Log.d(TAG, "askForPermission: " + permission);

            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
        }
    } else {
        Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
    }
}

以及 onRequestPermissionsResult 函数:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    Log.d(TAG, "onRequestPermissionsResult: " + requestCode);

        switch (requestCode) {
            case 1:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.d(TAG, "onRequestPermissionsResult: request");

                    Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();

                    startGeofenceMonitoring();
                }
                break;
        }
}

正如我所说,请求权限的对话框永远不会出现,但我的控制台告诉我ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);被称为,经过大量研究后我仍然不确定为什么它不起作用。我认为唯一可能的原因是该 Activity 是一个显示 Google Maps 地图的 Fragment 活动。我确实尝试在另一个活动中请求权限,但发生了完全相同的事情。

Thanks.

EDIT

所以我只是在一个全新的项目中测试了我在这里发布的代码,它运行得很好并显示了对话框。我现在真的很困惑是什么阻止了这个对话框在我当前的项目中显示。


final private int REQUEST_CODE_ASK_PERMISSIONS = 123;

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

private void requestPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
        ActivityCompat
                .requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
                        .show();
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
                        .show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时请求权限,Android M+ 的相关文章

随机推荐

  • 带有空标记的 Java StringTokenizer

    我有一个看起来像 56 0 76 0 93 1230 的字符串 我使用 StringTokenizer 将其分割为 然而 这似乎是从 93 直接跳到 1230 有没有办法让它在移动到 1230 之前返回六个空字符串 Use String s
  • std::move 的未定义行为

    来自移动页面cppreference 的 除非另有说明 所有标准库对象都具有 被移出的状态被置于有效但未指定的状态 那是 仅限没有前提条件的函数 例如赋值 操作符 可以在对象被移动后安全地使用它 因此 从同一页面上的示例来看 下面的代码被认
  • 错误:Android Pre Dex:未指定 Android SDK

    我已经下载了gdx setup jar从网站上 我将其运行为 java jar gdx setup jar 我选择我想要的选项并为其生成项目idea libgdx 1 6 2 当我单击生成按钮时 该工具不会向我抛出任何错误 当我跑步时ide
  • Firestore获取根集合的所有文档和子集合

    假设我有这种结构 A collection a doc name Tim B collection b doc color blue where A and B are 收藏品 while a and b are 文件 有没有一种方法可以通
  • 如何在 Matplotlib 中以 3D 形式绘制热图颜色

    I am using Matplotlib 3D to plot 3 dimensions of my dataset like below 但现在我还想将第四维 即 0 到 20 之间的标量值 可视化为热图 所以基本上 我希望每个点都根据
  • App Engine Java 11 无法在实时服务器上找到或加载主类

    tl dr 为什么这在本地有效 但在部署到实时 App Engine 项目时却无效 我正在尝试使用 Java 11 版本的 App Engine 创建一个基于 servlet 的准系统 Web 应用程序 我正在将一些项目从 Java 8 更
  • 如何在 multiautocompletetextview 中使用空间标记器(如 gmail 到 android 中的字段)正确添加和删除联系人气泡

    i am struggling alot with adding the Bubbles to to field like in gmail or facebook messanger please look into this pictu
  • Android“您需要将 Theme.AppCompat 主题(或后代)与设计库一起使用”

    好的 我收到此错误 标题 很多帖子建议我 甚至Android studio 更改主题 更改为App Appcompat 我已经做到了 清单文件
  • PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不转义捷克字符

    我从数据库中选择一些数据并将它们编码为 json 但我遇到了捷克符号的问题 例如 我的文件采用utf 8编码 我的数据库也是utf 8编码 我也将标头设置为utf 8编码 请问我还应该做什么 My code header Content T
  • VS2015企业版中出现错误C4576

    我有错误C4576在 Visual Studio 2015 中 当我尝试编译文件 transcoding c 时 该文件的源代码在这里 转码 c 错误 C4576 带括号的类型后跟初始值设定项列表是非标准显式类型转换语法 错误出现在该指令的
  • 列出 git-ls-remote 时为什么标签名称后面有“^{}”? [复制]

    这个问题在这里已经有答案了 当我跑步时git ls remote在工作树中 该命令输出原始存储库中的修订列表 由于某种原因 我对每个标签进行了 2 个修订 对于同一标签的第二个修订 标签名称包括 git ls remote From ema
  • 中断等待阻塞操作的线程?

    我正在运行一个线程 其主要操作是使用阻塞函数调用代理 并等待它给它一些东西 我已经使用了 挥发性布尔值 和 Interruption 的已知模式 但我不确定它是否会起作用 当我尝试添加 catch 块时InterruptedExceptio
  • 使用 GitHub API 下载文件时解码 base64

    我正在使用 GitHub API 从 GitHub 下载文件 我已经能够成功进行身份验证并从 github 获得响应 并看到表示文件内容的 Base64 编码字符串 不幸的是 在解码 Base64 字符串时出现了异常错误 字符串长度不是 4
  • libcurl HTTPS POST 数据发送?

    我有通过 HTTP POST 请求接收数据的应用程序 我正在尝试使用 libcurl 打开对此应用程序的请求 发送数据并接收从应用程序返回的回复 这是我到目前为止的代码 int main void CURL curl CURLcode re
  • 如何在 Eclipse 2020-09 中使用 Java 版本 15

    我正在尝试在 Eclipse 2020 09 下运行新的 Java 15 功能 我已经安装了 OpenJDK 15 并将其设置在 Installed JRE 下 尽管如此 我无法将此版本设置为编译器版本 仅限版本 14 我究竟做错了什么 E
  • Mega 的加密如何用于共享?

    我有一些关于找到一种方法来实现可以与多个收件人共享的任意数据的加密的问题 Mega 似乎正是这样做的 据我所知 它在将数据上传到网络服务器之前对其进行加密 仍然可以与其他人共享该文件 加密是如何完成的 想象一下以下场景 用户Alice将文件
  • 获取非常大的文件的 MD5 校验和

    我编写了一个脚本 该脚本读取目录中的所有文件并返回每个文件的 md5 哈希值 但是 对于相当大的文件 它不会呈现任何内容 我假设解释器为最大处理时间设置了一些值 并且由于获取该值需要很长时间 因此它只是跳到其他文件 有没有办法通过 PHP
  • 如何在 yii 框架中自动设置 url 友好

    我刚刚学习 yii 框架并阅读了本教程 关于yii 如何设置 url 但我不知道 假设我有10个控制器 我应该在配置文件中一一定义控制器吗 有没有更好的方法来为所有控制器设置像 www yoursite com yourController
  • 将标题层次结构生成为有序列表

    我已经思考这个问题有一段时间了 但无法想出可行的解决方案 我什至无法对其进行伪编码 举例来说 您有一个标题结构如下的页面 h1 Heading level 1 h1 h2 Sub heading 1 h2 h2 Sub heading 2
  • 在运行时请求权限,Android M+

    首先 我知道这是一个重复的问题 但我已经看过其他类似问题的答案 但未能通过这些解决方案取得成功 我开发了一个应用程序 它可以在我的测试设备上完美运行 该设备是运行 Android L 5 0 1 的三星 S4 但我希望该应用程序也可以在较新