2016-09-28 4 views
2

Ich denke, es ist ein Fehler shouldShowRequestPermissionRationaleAndroid sollteShowRequestPermissionRationale einen Fehler haben?

-Code ist ...

@Override 
protected void onResume() { 
    super.onResume(); 
    if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED && 
      ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) { 
     if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION) || 
       ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 
      new AlertDialog.Builder(this)....show(); 
    } else { 
     // do something... 
} 

die App zum ersten Mal installiert, Wir erlauben keine Erlaubnis. Wenn onResume aufgerufen wird, sollte AlertDialog angezeigt werden. Aber es erscheint nicht ...

Wenn wir in die Einstellung der App gehen, und erlauben Sie die Erlaubnis. Also spielen wir den App-Code (// do something). Wieder gehen wir in die Einstellung der App, verweigern die Erlaubnis. Und wir starten die App neu, AlertDialog erscheint.

Warum läuft die App so?

+0

'shouldShowRequestPermissionRationale()' wird nur wahr zurück, wenn Sie ** NICHT HABEN ** das Kontrollkästchen aktiviert, die mich nicht noch einmal fragen –

+0

sagt nicht tat ich die Checkbox. – fasdgoc

+0

@fasdgoc Siehe [dies] (http://stackoverflow.com/a/34612503/3117966) für weitere Informationen – Nisarg

Antwort

1

Von Entwickler Docs:

shouldShowRequestPermissionRationale()

Diese Methode liefert true, wenn die App vorher diese Berechtigung angefordert hat und der Benutzer die Anforderung verweigert.

Hinweis: Wenn der Benutzer die Berechtigungsanforderung in der Vergangenheit abgelehnt hat und die Option Nicht erneut fragen im Berechtigungsanforderungssystem-Dialogfeld ausgewählt hat, gibt diese Methode false zurück.

Das Problem ist, dass Sie nicht die Erlaubnis gebeten haben, bevor

ActivityCompat.requestPermissions(); 

daher den Dialog seine nicht angezeigt werden.

Wenn Sie die Berechtigung manuell erteilen oder die Berechtigung von den Einstellungen verweigern, wird davon ausgegangen, dass Sie die Berechtigung verweigert haben und deshalb der Alert-Dialog angezeigt wird.

+0

folgen Sie einfach dem Weg in der untenstehenden Antwort und beim Klicken auf den Knopf fragen Sie nicht erneut um Erlaubnis –

+0

Konnte Sie stellen einen Link zu diesem Entwickler-Dokument zur Verfügung? Sie liefern nicht so viele Details unter [this link] (https://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#shouldShowRequestPermissionRationale (android.app.Activity,% 20java.lang .String)). – jk7

+0

folgen Sie diesem Link https://developer.android.com/training/permissions/request.html –

-1

Verstehen Sie den Steuerfluss von Laufzeitberechtigungen

if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED && 
      ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) { 
     if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_COARSE_LOCATION) || 
       ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { 

      //Block1 

     } else { 

      //Block2 

     } 
}else{ 
//Do something here 
} 

gibt es die Fälle, in denen Block1 und Block2 werden 1
Fall rufen werden: wenn jeder versuchen wir zu zeigen, Berechtigungspopup zum ersten Mal (Erlaubnisdialog wird nicht angezeigt nie wieder fragen Kontrollkästchen) Block2 wird aufgerufen.

Fall 2: Wenn Benutzer zum ersten Mal verweigern, wenn Sie den gleichen Code von nächstem Mal (zum zweiten Mal an) rufen Block1 wird und zeigt den Dialog mit nie wieder fragen Kontrollkästchen aufgerufen werden.

Fall 3: Wenn Sie überprüfen nie wieder fragen dann aus dieser Zeit, wenn Sie den gleichen Code ausführen wird es nennen Block2 aber nicht dialog/Popup-Anzeige direkt wird es auslösen DENY automatisch und onRequestPermissionsResult Methode wird mit demy ausgelöst.

1

Arbeitete mit Gmail API und fand eine andere Option in seinem Beispielcode in Bezug auf Android-Berechtigungen. Sie möchten vielleicht EasyPermissions verwenden, die von Google selbst bereitgestellt wurde, um, wie gesagt, "Android M-Systemberechtigungen zu vereinfachen".

0

Überprüfen Sie diese Implementierung. funktioniert ziemlich gut für mich. Im Grunde überprüfen Sie die Berechtigungen in der checkPermissions() -Methode und übergeben eine Liste von Berechtigungen. Sie überprüfen das Ergebnis der Berechtigungsanforderung für onRequestPermissionsResult(). Mit der Implementierung können Sie beide Fälle ansprechen, wenn der Benutzer "Nie mehr fragen" auswählt oder nicht. Wenn in dieser Implementierung se "Nie erneut fragen" ausgewählt wird, hat der Dialog eine Option, um ihn zur App-Einstellungsaktivität zu führen.

All dieser Code ist in meinem Fragment. Ich dachte, dass es besser wäre, eine spezialisierte Klasse dafür zu erstellen, wie einen PermissionManager, aber ich bin mir nicht sicher.

/** 
    * responsible for checking if permissions are granted. In case permissions are not granted, the user will be requested and the method returns false. In case we have all permissions, the method return true. 
    * The response of the request for the permissions is going to be handled in the onRequestPermissionsResult() method 
    * @param permissions list of permissions to be checked if are granted onRequestPermissionsResult(). 
    * @param requestCode request code to identify this request in 
    * @return true case we already have all permissions. false in case we had to prompt the user for it. 
    */ 
    private boolean checkPermissions(List<String> permissions, int requestCode) { 
     List<String> permissionsNotGranted = new ArrayList<>(); 
     for (String permission : permissions) { 
      if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) 
       permissionsNotGranted.add(permission); 
     } 

     //If there is any permission we don't have (it's going to be in permissionsNotGranted List) , we need to request. 
     if (!permissionsNotGranted.isEmpty()) { 
      requestPermissions(permissionsNotGranted.toArray(new String[permissionsNotGranted.size()]), requestCode); 
      return false; 
     } 
     return true; 
    } 

    /** 
    * called after permissions are requested to the user. This is called always, either 
    * has granted or not the permissions. 
    * @param requestCode int code used to identify the request made. Was passed as parameter in the 
    *      requestPermissions() call. 
    * @param permissions Array containing the permissions asked to the user. 
    * @param grantResults Array containing the results of the permissions requested to the user. 
    */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case YOUR_REQUEST_CODE: { 
       boolean anyPermissionDenied = false; 
       boolean neverAskAgainSelected = false; 
       // Check if any permission asked has been denied 
       for (int i = 0; i < grantResults.length; i++) { 
        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { 
         anyPermissionDenied = true; 
         //check if user select "never ask again" when denying any permission 
         if (!shouldShowRequestPermissionRationale(permissions[i])) { 
          neverAskAgainSelected = true; 
         } 
        } 
       } 
       if (!anyPermissionDenied) { 
        // All Permissions asked were granted! Yey! 
        // DO YOUR STUFF 
       } else { 
        // the user has just denied one or all of the permissions 
        // use this message to explain why he needs to grant these permissions in order to proceed 
        String message = ""; 
        DialogInterface.OnClickListener listener = null; 
        if (neverAskAgainSelected) { 
         //This message is displayed after the user has checked never ask again checkbox. 
         message = getString(R.string.permission_denied_never_ask_again_dialog_message); 
         listener = new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           //this will be executed if User clicks OK button. This is gonna take the user to the App Settings 
           startAppSettingsConfigActivity(); 
          } 
         }; 
        } else { 
         //This message is displayed while the user hasn't checked never ask again checkbox. 
         message = getString(R.string.permission_denied_dialog_message); 
        } 
        new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme) 
          .setMessage(message) 
          .setPositiveButton(getString(R.string.label_Ok), listener) 
          .setNegativeButton(getString(R.string.label_cancel), null) 
          .create() 
          .show(); 
       } 
      } 
      break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

    /** 
    * start the App Settings Activity so that the user can change 
    * settings related to the application such as permissions. 
    */ 
    private void startAppSettingsConfigActivity() { 
     final Intent i = new Intent(); 
     i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     i.addCategory(Intent.CATEGORY_DEFAULT); 
     i.setData(Uri.parse("package:" + getActivity().getPackageName())); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
     getActivity().startActivity(i); 
    } 
Verwandte Themen