2016-07-04 5 views
1

Ich integrierte Android Runtime Permission für READ PHONE STATE für Marshmallow-Geräte. Diese Implementierung funktioniert einwandfrei und das Popup wird in meiner Anwendung mit der Option allow/deny angezeigt.Laufzeit Permission popup click issue in Marshmallow Aktualisierte Geräte

Ich kann auf die Erlauben/Verweigern-Taste für normale Marshmallow-Geräte klicken. Aber im Fall von aktualisierten Android-Geräten (Von Lollipop zu Marshmallow) funktioniert der Klick auf die Schaltfläche "Erlauben" nicht. Dieses Problem wurde in Nexus 5 und Nexus 7 getestet und reproduziert. Benötigen Sie etwas, das Sie für ein aktuelles Betriebssystem benötigen? Oder ist es ein Marshmallow-Problem?

Bitte überprüfen Sie den vollständigen Code:

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

können Sie den Code, wo Sie um Erlaubnis bitten und die activityResult-Methode –

+0

Ja, ich werde die Frage bearbeiten. Aber das Problem ist nur in Updates OS ?. – Nithinjith

+0

Nein, nicht unbedingt, ich selbst benutze aktualisierte OS-Telefon, es funktioniert gut für mich. Möglicherweise sind einige Implementierungsprobleme. –

Antwort

1

nicht shouldShowRequestPermissionRationale() rufen Sie, bevor Sie die Erlaubnis eingeholt. Dieser Anruf soll durchgeführt werden, nachdem der Benutzer die Anfrage abgelehnt hat, normalerweise in der onRequestPermissionsResult() Methode. Wenn Ihre App erklären muss, warum sie eine Berechtigung benötigt, bevor sie danach fragt, muss die interne Logik der App dies entscheiden.

+0

Ich befolge die Android-Entwickler-Konsole Beispielcode. https://developer.android.com/training/permissions/request.html. Sie haben einen aktualisierten Code. Bitte teilen Sie wenn möglich. – Nithinjith

+0

Wurde die App zuvor installiert (vor dem Upgrade)? Wenn dies der Fall ist, wurde die Berechtigung automatisch erteilt. Wenn nicht, dann soll es wie ein (neues) Marshmallow-Gerät sein. Wenn die Berechtigung jedoch nie angefordert (und zurückgewiesen) wurde, wird 'shouldShowRequestPermissionRationale()' wahrscheinlich 'false' zurückgeben. Ich habe die zuverlässigsten Ergebnisse intern verfolgt, ob die erste Verwendung "erklärt" wurde und sich nur auf "show rationale" verlässt, wenn die Erlaubnis vom Benutzer abgelehnt wird. Es wird nur dann "true" zurückgegeben, wenn es abgelehnt wurde, und der Benutzer entschied sich nicht, zukünftige Anfragen zu unterdrücken. –

+0

Bei Interesse gibt es eine Open-Source-Hilfsbibliothek, die es einfacher macht, damit umzugehen: 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

Danke für den Kommentar. Irgendein Unterschied zu meiner Implementierung? – Nithinjith

Verwandte Themen