1

私はrequestPermissions(..)の結果をスリープループを使用して取得しようとしていますが、ユーザーの応答を待っていますが、コールバックメソッドonRequestPermissionsResult(..)これはrequestPermissionsを呼び出して実行を終了するので、私もそれを取得できません。onRequestPermissionsResultコールバックはメソッド呼び出しを待つ必要がありますrequestPermissions finish

例コード:runOnUiThreadは(..まだ同じ)、)(新しいスレッドで プット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; 
    } 
} 

私はいくつかの解決策を試してみました。 他のアクティビティの呼び出し要求のアクセス権。新しいアクティビティも起動しません。それでもaskS​​ystemForPermissionメソッドは終了します。

P/S:それは他の方法で行うことができますが、私はなぜこのようなアンドロイドの行為がこの問題を解決する方法を知りたいです。

+0

私は同じ問題に遭遇しました。しかし、私はC + +(ndk)からスレッドを作成する場合は、それは大丈夫です。 – user558185

答えて

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) 

- あなたは非同期的に何かを実行すると、あなたの方法は、それがTHRを阻止するのを待つことはできません。仕事があるからEAD(従ってもコールバックのために利用できない、そのスレッドを残す)

(注:MY_PERMISSIONS_REQUEST_READ_CONTACTS自己定義された要求コードである)

関連する問題