onRequestPermissionsResult回调必须等待方法调用requestPermissions完成

时间:2016-05-06 03:55:24

标签: java android android-6.0-marshmallow android-permissions

我试图通过使用sleep循环来获取requestPermissions(..)的结果并等待用户响应,但是onRequestPermissionsResult(..)的回调方法必须等待调用requestPermissions完成执行的方法,所以我也无法得到它。

示例代码:

public int result = 0;

public int askSystemForPermission(String permission)
{
   result = 0;
   requestPermissions(this,new String[] {permission});

   while (result == 0)                  // It hang forever here
   {                                    // because onRequestPermissionsResult never excute
      try {                             // then result always equals to 0
          Thread.sleep(500);
      } catch (Exception ecx) {}
   }

   return result;
}


public void onRequestPermissionsResult(...)
{
   if ( /*granted*/ )
   {
       result = 1;
   }
   else if ( /*dont show again*/ )
   {
       result = 2;
   }
   else //denied
   {
       result = 3;
   }
}

我尝试了一些解决方案: 把requestPermissions放在新的Thread(),runOnUiThread()..仍然是一样的。 从其他Activity调用requestPermissions,新的Activity甚至不启动,它仍然等待askSystemForPermission方法完成。

P / S:可以用其他方式完成,但我想知道为什么android会这样做以及如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

Requesting permissions异步任务,您的非同步结果变量将永远为0,因为该方法中的其余代码和请求回调发生在不同的线程中(想想备用时间轴) )。

您需要做的是首先检查您是否已经获得许可

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}

如果你没有然后你请求权限,但是你可以通过覆盖另一个方法从那里开始工作来等待它:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)

这当然意味着你的方法无法返回结果 - 你不能异步运行某些东西并让你的方法等待它阻塞一个线程(因此即使是回调就让该线程不可用)

(注意:MY_PERMISSIONS_REQUEST_READ_CONTACTS是一个自定义的请求代码)