【问题标题】:onRequestPermissionsResult callback must wait method call requestPermissions finishonRequestPermissionsResult 回调必须等待方法调用 requestPermissions 完成
【发布时间】:2016-05-06 03:55:24
【问题描述】:

我正在尝试通过使用睡眠循环来获取 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 放入 new Thread(), runOnUiThread() .. 还是一样的。 从其他 Activity 调用 requestPermissions,新的 Activity 甚至没有启动,它仍然等待 askSystemForPermission 方法完成。

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

【问题讨论】:

  • 我遇到了同样的问题。但如果我从 c++(ndk) 创建线程,就可以了。

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


【解决方案1】:

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 是自定义请求代码)

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2016-03-09
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多