【问题标题】:onRequestPermissionsResult is called infinitelyonRequestPermissionsResult 被无限调用
【发布时间】:2016-08-15 10:32:22
【问题描述】:

我正在使用运行时权限请求,但存在问题。似乎是无限调用了回调方法onRequestPermissionsResult。所以当用户拒绝请求时,应用程序没有响应..

每次用户单击“拒绝”时,权限对话框都会重新出现。只有单击“不再询问”,它才不会再次出现。 * 按“允许”时效果很好 - 没有任何问题。

有什么方法可以取消一次调用的方法吗?

if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED )
{
    ActivityCompat.requestPermissions( this, new String[]{ Manifest.permission.ACCESS_FINE_LOCATION }, LOCATION_PERMISSION_CUSTOM_REQUEST_CODE );
}


@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch( requestCode )
        {
            case LOCATION_PERMISSION_CUSTOM_REQUEST_CODE:   
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted
                    MyManager.connect();
                    return;
                } else {
                    // permission denied
                    return;
                }
            default:
                return;
        }
    }

【问题讨论】:

  • 请发布您的代码
  • @GilMoshayof 编辑了帖子)谢谢
  • MyManager.connect() 中发生了什么?
  • @GilMoshayof 只是 mGoogleApiClient.connect(); 。另外,值得一提的是,如果单击“允许”,则不会出现问题。但是当用户按下“拒绝”时,它会无限调用onRequestPermissionsResult
  • 是的,当然 - 当另一个活动完成并返回到当前活动时,会调用 onResume。请求权限对话框充当一个活动,因此当它停止工作时,您当前的活动将恢复,因此循环重复:)

标签: android permissions runtime


【解决方案1】:

这里的问题,正如您在 cmets 中提到的,是在 onResume 方法中调用了触发请求权限对话框的代码。

当请求对话权限完成时,运行时会在触发它的活动上调用onResume,就像任何以对话为主题的活动一样。

在您的情况下,拒绝权限将再次触发对onResume 的调用,这将再次显示对话框并导致无限循环。

将此权限请求移至onCreate,或其他一些流程将解决您的问题。

【讨论】:

  • 只是澄清一点:“就像任何对话一样”——对于以对话为主题的活动来说确实如此。 Dialog 不是这样,因为Dialog 不会影响活动生命周期。在这种情况下,运行时权限对话框是一个以对话框为主题的活动。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多