【问题标题】:READ_PHONE_STATE permission dialogue doesn't get shown未显示 READ_PHONE_STATE 权限对话框
【发布时间】:2018-01-08 09:27:37
【问题描述】:

我需要向用户请求两个权限:READ_PHONE_STATEWRITE_EXTERNAL_STORAGE。我这样做如下:

public void checkPermissions() {
    if (Build.VERSION.SDK_INT >= 23) {
        ArrayList<String> missingPermisions = new ArrayList<>();
        if (checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            missingPermisions.add(android.Manifest.permission.READ_PHONE_STATE);
        }
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            missingPermisions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (missingPermisions.size() > 0) {
            String[] permissions = missingPermisions.toArray(new String[missingPermisions.size()]);
            ActivityCompat.requestPermissions(this, permissions, PERMISSIONS_REQUEST);
        }
    }
}

方法checkPermissions()onCreate() 中被调用。 从我请求的两个权限中,只出现了WRITE_EXTERNAL_STORAGE 对话。我检查了在执行期间missingPermisions.size() 的值是2。我还尝试仅请求READ_PHONE_STATE 权限,在这种情况下,对话框也没有显示。我的清单也包含这些权限:

<permission android:name="android.permission.INTERNET" />
<permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<permission android:name="android.permission.READ_PHONE_STATE" />
<permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />

为什么我的READ_PHONE_STATE 权限对话框不显示?我该如何解决?

【问题讨论】:

    标签: android android-permissions runtime-permissions


    【解决方案1】:

    并非所有权限都需要用户使用对话框询问。仅使用对话框询问危险权限(如写入存储)。

    【讨论】:

    • 我也在考虑这个问题。根据documentationREAD_PHONE_STATE 是危险权限之一
    【解决方案2】:

    我通过改变这个解决了我的问题:

    <permission android:name="android.permission.INTERNET" />
    <permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <permission android:name="android.permission.READ_PHONE_STATE" />
    <permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    

    进入这个:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    

    uses-permissionpermission 其实是有区别的。

    【讨论】:

      【解决方案3】:

      如果你已经解决了它,但......你不需要检查然后将它们添加到列表中。 只需创建一个String[] {permision, permision},然后检查它们是否被授予。即使一个是而另一个不是,它仍然会提示用户允许它们。 我就是这样做的:

      // M = 23
              if (Build.VERSION.SDK_INT >= 23) {
                  final int SMS = ActivityCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS);
      
                  if (SMS != PackageManager.PERMISSION_GRANTED) {
                      mDialogBuilder = new AlertDialog.Builder(this);
                      mDialogBuilder.setTitle(R.string.perms)
                              .setMessage(R.string.text)
                              .setPositiveButton(R.string.dialog_ok, new DialogInterface.OnClickListener() {
                                  @Override
                                  public void onClick(DialogInterface dialog, int which) {
      
                                      ActivityCompat.requestPermissions(MainActivity.this, new String[] {
                                              Manifest.permission.SEND_SMS,
                                              Manifest.permission.READ_PHONE_STATE,
                                      }, MY_PERMISSIONS_REQUEST_SEND_SMS + MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
                                  }
                              }).create().show();
                  }
              }
      

      我删除了您不需要的内容,因此代码格式不正确,但您可以看到,1 个权限检查下的 2 个权限,并且都显示了。 Ofc,在这种情况下,如果用户检查 SMS 而没有检查 RPS,对话框将不会再次打开

      【讨论】:

        猜你喜欢
        • 2020-03-05
        • 1970-01-01
        • 2022-12-06
        • 2015-10-30
        • 1970-01-01
        • 2021-03-06
        • 2016-10-22
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多