我试图通过使用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会这样做以及如何解决这个问题。答案 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是一个自定义的请求代码)