【问题标题】:Android M permission dialog not showingAndroid M 权限对话框未显示
【发布时间】:2015-10-30 22:39:23
【问题描述】:

我目前正在尝试使我的应用程序适应 Android M 的新权限模型。

我正在收集我需要的所有权限,然后运行

Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);

requiredPermissions 拥有我需要的权限,例如 android.permission.WRITE_EXTERNAL_STORAGE

该例程肯定会执行,因为我在 logcat 中有 Log 行:

08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE

但是权限对话框从不显示,更不用说调用了 onRequestPermissionsResult()。

我做错了什么?根据一些教程,我发现我没有遗漏任何东西。 我只有用于测试的模拟器,没有物理设备。这是设置中的关于屏幕: Image

可能值得一提的是:如果我尝试从主屏幕打开已安装应用程序的概览,​​我只会得到launcher3 has exited。我不确定这是否相关。

有人知道为什么它没有显示吗?

【问题讨论】:

  • 您使用的是哪个版本的 M 开发者预览版?在 v1 中,WRITE_EXTERNAL_STORAGE 不是 dangerous,不需要手动请求。这在 v2 中发生了变化,它与其他 dangerous 权限(如 CAMERA)一样工作。注意RECEIVE_BOOT_COMPLETED 不是dangerous 权限;您不必在运行时请求它。
  • 我有 v2。为了测试,我添加了现在请求的录制音频:08-07 13:49:31.647: I/Permissions(1540): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE; android.permission.RECORD_AUDIO 这是来自我的清单: 这是来自 project.properties 文件:target=android-MNC targetSdkVersion=MNC compileSdkVersion =android-MNC 我是否遗漏了对其他人来说可能很明显的任何内容?
  • 您的清单中有<uses-permission> 元素吗?新的运行时权限模型并没有消除对 <uses-permission> 元素的需求。它只是增加了在运行时为选定权限组请求权限的额外要求。
  • 是的,我的清单仍然包含所有旧的使用许可元素。
  • 好吧,this sample app of mine 似乎在 MNC v2 上运行良好。比较和对比你所拥有的和我所拥有的。

标签: android permissions android-6.0-marshmallow


【解决方案1】:

我遇到了同样的问题,但后来我意识到我忘记将权限添加到清单文件。添加uses-permission标签后,系统显示对话框。也许可以帮助某人。

【讨论】:

  • pfff.wasted 将近 2 小时,直到这篇文章(在清单中是代码fine_location 中的粗略位置)......
  • 这里也一样...谢谢!
  • 太棒了!这就是快速发展时的问题!你错过了背后的基本东西。谢谢!
  • 有趣,我也是=))
  • 但它没有修复,因为我也使用了 tabhost,当你想显示许可对话框时,这可能也是问题,found this post
【解决方案2】:

我花了一整天的时间才找出导致问题的原因。 original answer 帮助了我。

我通过像这样添加tools:remove="android:maxSdkVersion" 来修复:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>

【讨论】:

  • 这解决了我在运行时拒绝权限的问题。
【解决方案3】:

我遇到了同样的问题,因为我使用负值作为 REQUEST_CODE。

requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)

使用正值后,系统显示对话框。 希望它可以帮助某人。

【讨论】:

  • 这就是解决方案。绝对奇怪的是,负数会导致 Android 以如此微妙和令人愤怒的方式失败。
  • 谢谢!这是我的情况,因为我不想参加回调
  • 你救了我的命
【解决方案4】:

根据 Hilal 的评论(非常感谢!): 在我的情况下,我的应用程序确实在使用 tabhost,并且权限是从 tabhost 内的 Activity 请求的。在启动一个单独的活动来请求它正在工作的权限之后。

【讨论】:

    【解决方案5】:

    我也遇到了同样的问题。 我的问题是我在清单中的错误位置写了许可。 确保使用权限在应用程序之外:

        <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.google.android.gms.samples.vision.face.photo"
        android:installLocation="auto"
        android:versionCode="1"
        android:versionName="1" >
    
        <uses-sdk
            android:minSdkVersion="9"
            android:targetSdkVersion="21" />
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
    
        <application
            android:hardwareAccelerated="true"
            android:label="FacePhotoDemo"
            android:allowBackup="true"
            android:icon="@drawable/icon">
    

    【讨论】:

      【解决方案6】:

      添加

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

      在 AndroidManifest.xml 中

      注意:您想要获得的权限。例如:android.permission.ACCESS_FINE_LOCATION 等。

      【讨论】:

      • 这是我的问题。不要被官方文档告诉您设置 maxSdk 值所迷惑。 :(
      【解决方案7】:

      我也遇到过使用&lt;uses-permission-sdk23&gt; 元素时权限对话框不出现或应用程序崩溃的情况,但原因似乎是当前 6.0 设备上的系统错误:

      https://code.google.com/p/android/issues/detail?id=189841

      崩溃异常:

      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
      

      【讨论】:

        【解决方案8】:

        我有同样的问题,添加 shouldShowRequestPermissionRationale 后问题解决了,如下所示:

        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
        
        } else {
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        
        }
        

        【讨论】:

        • 这不会改变任何事情
        【解决方案9】:

        要添加到@shanraisshan 的答案,REQUEST_CODE 实际上必须大于 0,而不仅仅是非负数。

        【讨论】:

          【解决方案10】:

          在我们的代码中,这是一个简单的拼写错误。

          我们有:

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

          应该是:

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

          【讨论】:

            【解决方案11】:

            我正在对 requestPermissions() 进行两次调用,一个接一个。这个错误信息出现在 Logcat 中(注意“request”的拼写错误):

            Can reqeust only one set of permissions at a time
            

            requestPermissions() 实际上是为了一次接受多个请求而设计的;这就是 String 数组的用途。

            【讨论】:

              【解决方案12】:

              就我而言,我请求的权限 (WRITE_SETTINGS) 更为特殊,需要设置活动才能启动。所以对话框没有出现。

              我必须使用以下代码获得它的许可:

              Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
              intent.setData(Uri.parse("package:" + context.getPackageName()));
              startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
              

              【讨论】:

              【解决方案13】:

              请求危险权限时未显示权限对话框的另一个原因...

              我必须执行 Build -> Clean Project,然后 Build -> Rebuild Project。我猜 Android Studio 没有注意到我在清单中所做的更改。

              【讨论】:

              • 我浪费了半天时间来弄清楚我的代码出了什么问题。非常感谢:)
              【解决方案14】:

              由于清单中权限常量的大小写错误,我遇到了类似的问题,我使用的是小写的read_contacts

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

              read_contacts 更改为大写后,它开始按预期工作

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

              【讨论】:

                【解决方案15】:

                权限被组织成类别,因此在不显示对话框的情况下授予非关键权限。

                我发现这对于 Internet 权限来说很困难,如果您遇到此问题,那么更改为关键权限(例如 read_contacts)将允许您测试您的流程并揭示问题是权限是非关键还是其他问题别的。

                Normal protection 权限列出here

                【讨论】:

                  【解决方案16】:

                  在清单中,我改变了

                   <uses-permission
                      android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                      android:maxSdkVersion="22" />
                  

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

                  也许有帮助。

                  【讨论】:

                    【解决方案17】:

                    也在清单文件中添加权限。

                    【讨论】:

                      【解决方案18】:

                      如果你们中的任何人有一个更改/修改WRITE_SETTINGS 的应用程序并面临这个问题。查看CommonsWare's Answer to WRITE_SETTINGS Ambiguity

                      我遇到这个问题 2 周,后来意识到这个问题是由于 requestPermissions 不适用于请求 WRITE_SETTINGS 权限。 希望这会有所帮助:D

                      【讨论】:

                        【解决方案19】:

                        在我的例子中,我在清单文件中请求了“ACCESS_COARSE_LOCATION”,然后在代码中请求“ACCESS_FINE_LOCATION”权限,这就是权限对话框没有打开的原因。

                        【讨论】:

                          【解决方案20】:

                          搜索了一段时间后,似乎需要将值 compileSdkVersion 设置为“android-MNC”或从今天开始设置为 23。这需要 Gradle 构建系统,然后似乎需要 Android Studio。 至少我找不到一本关于如何在 gradle 文件之外设置它的手册。

                          【讨论】:

                          • 我有同样的问题,但还没有设法解决它。阅读您的答案并不能真正帮助我解决问题吗?你能再澄清一点吗?我的 compileSdkVersion 过去和现在都是 23,我仍然收到此错误。
                          • 我也是。你的回答一文不值,因为低于 23 没有运行时权限。
                          • 为什么一文不值?我只是说如果使用 Eclipse 似乎无法实现这一点。
                          【解决方案21】:

                          我做了上面答案中所说的所有事情,但仍然没有显示对话框,然后我在 gradle 中将 targetSdkVersion 更改为 23 并出现了。希望这可以帮助某人

                          【讨论】:

                            【解决方案22】:
                            @Override
                                public final void validateRequestPermissionsRequestCode(int requestCode) {
                                   // We use 16 bits of the request code to encode the fragment id when
                                   // requesting permissions from a fragment. Hence, requestPermissions()
                                   // should validate the code against that but we cannot override it as we
                                   // can not then call super and also the ActivityCompat would call back to
                                   // this override. To handle this we use dependency inversion where we are
                                   // the validator of request codes when requesting permissions in
                                   // ActivityCompat.
                                    if (!mRequestedPermissionsFromFragment
                                            && requestCode != -1 && (requestCode & 0xffff0000) != 0) {
                                        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
                                    }
                                }
                            

                            【讨论】:

                              【解决方案23】:

                              有同样的问题。后来我意识到我们必须在清单中声明每一个权限(即使一个是另一个的子类)。 就我而言,我声明了

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

                              在我的清单中,并试图访问用户的粗略位置。

                              ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                              

                              通过在清单中添加粗略权限来解决问题。

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

                              【讨论】:

                                【解决方案24】:

                                将您的 targetSdkVersion 设置为 22

                                【讨论】:

                                  【解决方案25】:

                                  有同样的(我猜)问题,解决方案正在删除

                                  import <app package>.Manifest;
                                  

                                  由 Android Studio 在文件顶部自动导入并用

                                  替换
                                  import android.Manifest; 
                                  

                                  开始工作

                                  【讨论】:

                                    【解决方案26】:

                                    在我的情况下,解决方案是字符串本身

                                    android.permission.READ_CONTACTS

                                    我做了 Manifest.permission.READ_CONTACTS 导致静音错误(注意屏幕上的显示)。

                                    确保这是正确的

                                    【讨论】:

                                    • Manifest.permission.READ_CONTACTS = "android.permission.READ_CONTACTS"
                                    【解决方案27】:

                                    我的 Android targetSDK 版本是 28。

                                    我没有看到任何向用户显示请求权限的弹出窗口,这些窗口在 android Manifest.xml 中列为 . 在安装过程中,使用 USB 安装 .apk 并从 google play 商店安装应用程序。 所以我在我的活动中添加了下面的代码,它会在运行时询问用户权限

                                    ActivityCompat.requestPermissions(MyActivity.this, 新字符串[]{Manifest.permission.READ_PHONE_STATE}, 1);

                                    【讨论】:

                                      【解决方案28】:

                                      我正在通过代码请求权限,但错过了在清单中添加 &lt;uses-permission ..&gt; 标记!

                                      【讨论】:

                                        【解决方案29】:

                                        将最终的常量值更改为 1。

                                        private static final int REQUEST_PERMISSION_WRITE = 1;
                                        
                                        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);
                                        

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 2021-03-06
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2022-12-06
                                          • 1970-01-01
                                          • 2020-03-05
                                          • 1970-01-01
                                          • 2021-03-16
                                          相关资源
                                          最近更新 更多