2016-07-04 7 views
1

マシュマロデバイスのAndroidランタイムパーミッションがREAD PHONE STATEに統合されました。この実装はうまくいき、アプリケーションでallow/denyオプションを使ってポップアップが表示されています。Marshmallowでの実行時の権限のポップアップクリックの問題更新されたデバイス

通常のマシュマロデバイスでは、許可/拒否ボタンをクリックできます。しかし、更新されたアンドロイドデバイス(LollipopからMarshmallowまで)の場合、許可ボタンのクリックは初期の時間では機能しません。この問題は、Nexus 5とNexus 7でテストされ、再現されています。更新されたOSに追加で追加する必要がありますか?それともマシュマロ問題ですか?

完全なコードを確認してください:

private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 101; 

if (Build.VERSION.SDK_INT >= 23) { 
    if(mActivity.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) !=PackageManager.PERMISSION_GRANTED) { 
           if (this.shouldShowRequestPermissionRationale(
             Manifest.permission.READ_PHONE_STATE)) { 
            showExplanationDialog(mActivity, getString(R.string.dialog_message_phone_state)); 
           } else { 
            this.requestPermissions(new String[]{Manifest.permission.READ_PHONE_STATE}, 
              MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); 
           } 
          } else { 
           handleLoginAPI(); 
          } 
         } else { 
          handleLoginAPI(); 
         } 

    private void handleLoginAPI() { 
     if (super.isNetworkConnectionAvailable(mActivity)) { 
     // Api Call from here.. 
     }else{ 
     // No Nw Connection. 
     } 

    } 

    @Override 
     public void onRequestPermissionsResult(int requestCode, 
               String permissions[], int[] grantResults) { 
      switch (requestCode) { 
       case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: { 
        // If request is cancelled, the result arrays are empty. 
        if (grantResults.length > 0 
          && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
         handleLoginAPI(); 
        } else if (grantResults.length > 0 
          && grantResults[0] == PackageManager.PERMISSION_DENIED) { 
         if (this.shouldShowRequestPermissionRationale(
           Manifest.permission.READ_PHONE_STATE)) { 
          showExplanationDialog(mActivity, getString(R.string.dialog_message_phone_state)); 
         } 
        } 
        return; 
       } 
      } 
     } 
+0

あなたが許可を求めているコードとactivityResultメソッド –

+0

を投稿できます。質問を編集します。しかし、この問題はアップデートOSだけにあるのですか? – Nithinjith

+0

必ずしもそうではありませんが、私自身は更新されたOS電話を使用しています。いくつかの実装上の問題があります。 –

答えて

0

これはAndroid OSのアップデートに関する問題です。この問題はNexus端末で報告されています。 https://code.google.com/p/android/issues/detail?id=213120。この問題は、Googleマップ、Gmailなどの他のアンドロイドネイティブアプリケーションで再現することができます。

1

は許可を要求する前にshouldShowRequestPermissionRationale()を呼び出さないでください。その呼び出しは、ユーザが通常onRequestPermissionsResult()メソッドでリクエストを拒否した後に行われるように意図されています。アプリがそれを求める前に許可が必要な理由を説明する必要がある場合は、アプリの内部ロジックがそれを決定する必要があります。

+0

私はアンドロイドデベロッパーコンソールのサンプルコードに従っています。 https://developer.android.com/training/permissions/requesting.html更新されたコードがあります。可能であれば、共有してください。 – Nithinjith

+0

アプリは以前にインストールされましたか(アップグレード前)?そうであれば、許可は自動的に付与されます。もしそうでなければ、それはマシュマロ装置のようになっているはずです。しかし、許可が一度も要求されなかった場合(拒否された場合)、 'shouldShowRequestPermissionRationale()'はおそらく 'false'を返すでしょう。私は最初の使用が「説明された」かどうかを内部的に追跡し、ユーザーが許可を拒否した場合にのみ「表示根拠」に依存する最も信頼性の高い結果を得ました。拒否され、ユーザが将来のリクエストを抑止することを選択しなかった場合にのみ、 'true'を返します。 –

+0

興味があれば、これを扱いやすくするオープンソースのヘルパーライブラリがあります:https://github.com/hiqes/andele –

1
private void setCheck() 
    { 
     int hasWriteContactsPermission = 0; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 
      hasWriteContactsPermission = checkSelfPermission(android.Manifest.permission.READ_PHONE_STATE); 
      if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
       if (!shouldShowRequestPermissionRationale(android.Manifest.permission.READ_PHONE_STATE)) { 
        showLocationRationleDalog(); 
        return; 
       } 
       return; 
      } else { 
       handleLoginAPI(); 
      } 
     } else { 
      handleLoginAPI(); 
     } 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length == 1 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        handleLoginAPI(); 
       } else { 
        Log.i("Permission denied"); 
       } 
       return; 
      } 
     } 
    } 
+0

コメントありがとうございます。私の実装との違いは何ですか? – Nithinjith

関連する問題