【问题标题】:Why is requestCode returned in onRequestPermissionsResult is 1 after user has granted runtime permissions?为什么用户授予运行时权限后,onRequestPermissionsResult 中返回的 requestCode 为 1?
【发布时间】:2018-05-20 05:07:10
【问题描述】:

我必须从用户那里获得运行时权限。我在 ActivityCompat.requestPermissions 中将 requestCode 作为 200 传递,如下面的代码所示。

但是当用户授予权限时,在onRequestPermissionsResult上,返回的requestCode1。这里返回的 requestCode 应该是 200 吧?

谁能解释为什么在 onRequestPermissionsResult 中返回的 requestCode 是 1 而不是 200 (我要传递给 requestPermissions 的代码)用户已授予/接受运行时权限?

        var mRuntimePermissions = RuntimePermissions(permissions, this)
        var gotPermissions = mRuntimePermissions.hasPermissions()

        if(gotPermissions == true){

            startActivity(Intent(this, MainActivity::class.java))
        }
        else{
            ActivityCompat.requestPermissions(this, permissions, 200);
        }


override fun onRequestPermissionsResult(requestCode: Int,
                 permissions: Array<String>, grantResults: IntArray) {
        when (requestCode) {

            // check requestCode and do something

            }

        }
    }

【问题讨论】:

  • 你是从 Fragment 还是 Activity 调用 requestPermission ?发布您的完整活动代码。
  • 我从一个活动中调用。这是完整的活动代码 - pastebin.com/4SSNLvxP

标签: android kotlin runtime-permissions


【解决方案1】:

我不知道它对你有多大帮助;因为它不在kotlin 中。但是我已经以下列方式在许多项目中实现了它。希望它可以帮助你至少获得一些线索。

类声明:

private static String[] PERMISSIONS = {Manifest.permission.READ_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS};
public int ALL_PERMISSIONS = 0;
public boolean CheckNoPermission = false;

现在在 OnCreate 中:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
{
    ALL_PERMISSIONS  = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE);
    ALL_PERMISSIONS  = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.PROCESS_OUTGOING_CALLS);

    // its below marshmallow
    // no need to ask permissions in this case
    // do the things here directly

    // START YOUR ACTIVITY HERE....
}
else
{
    // its marshmallow or above
    // have to ask permissions in this case

    // lets check if user already allowed the permissions in previous run

    for(int x = 0; x < PERMISSIONS.length; x++)
    {
        String ThisPermission = PERMISSIONS[x];

        if (checkSelfPermission(ThisPermission) != PackageManager.PERMISSION_GRANTED)
        {
             CheckNoPermission = true;
             break;
        }
    }

    // even if any permission is not granted then re-request all permissions; 
    // re-requesting all permissions will only request denied permissions only

    if(CheckNoPermission)
    {
          // request all permissions one by one in array

          ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, ALL_PERMISSIONS);
    }
    else
    {
         // user has already granted all the permissions in previous run
         // do the things here directly

         // START YOUR ACTIVITY HERE....
    }


}

现在检查 onCreate 之外的权限结果:

// if permissions are requested; check for user approvals :

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (grantResults.length == 2)
    {
        Boolean IsAllPermissions = true;

        // Yes need to check all permissions again as user may have denied any of the permission

        for(int p = 0; p < grantResults.length; p++)
        {
            if (grantResults[p] != PackageManager.PERMISSION_GRANTED)
            {
                IsAllPermissions = false;
                break;
            }
        }

        if(IsAllPermissions)
        {
            // user has granted all the permissions in this run
            // do the things here ...

            // START YOUR ACTIVITY HERE....
        }
        else
        {
            // user has not granted all the permissions in this run
            // so do what you want to do here in such case ...
        }
     }
     else
     {
         // missmatch in number of permissions in result
     }
 }

关于 onRequestPermissionsResult Is explained here... 的 Android 文档 希望对您或其他人有所帮助

onRequestPermissionsResult简介:

  1. requestCode 不关注;它适用于应用程序级别
  2. permissions是这个requestCode请求的所有权限的数组
  3. grantResults 是一个数组,包含用户对我们使用此 requestCode 请求的每一个权限所做的任何事情

requestCode 无需检查,也与我们无关

【讨论】:

  • 我理解您的代码,但我的问题不同。我在问为什么在用户授予权限后,onRequestPermissionsResult 中返回的 requestCode 是 1,为什么返回的 requestCode 与我们在请求权限时传递的 requestCode 不同?
  • @Gissipi_453,在 onRequestPermissionsResult 我们应该交叉检查用户对一堆权限做了什么......并且 requestCode 与您想的不一样; Android 无法使用单变量检测“是否授予所有权限”,它只是向您显示它的数组......它的开发人员任务是交叉检查所有权限是否都被授予?
  • @Gissipi_453,即使android也无法检测到它是否高于marshmallow,开发人员也需要编程和处理所有可能的情况以及所有可能的异常
  • @Gissipi_453,requestCode 仅用于 android 操作系统的应用程序级别,用于验证请求的来源,permissions 是此 requestCode 请求的所有权限的数组,grantResults 是用户对我们使用此 requestCode 请求的每一个权限。 requestCode 不需要检查,也与我们无关......
  • @Gissipi_453,我很高兴它帮助了你,在伪代码方面也是明智的......!!当然,我正在再次编辑,以便其他用户可能会发现它有帮助。
【解决方案2】:

我们可以从activity's中发送(执行)多个startActivity作为结果,在onActivityForResult方法中会收到多个回调,所以要识别回调是针对哪个请求,可以用requestCode来识别,我们可以直接说 requestCode 作为请求的 id,帮助我们处理特定请求的 onActivityResult 方法中的响应(staryActivityForResult)。

【讨论】:

  • 这不能回答我的问题。查看我的问题并查看我所指的特定场景。
  • 好的,我们会尽力为你想出更好的方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2017-10-07
  • 2017-03-30
  • 2020-08-08
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多