2017-02-03 4 views
0

Ich bin neu bei Android. Ich versuche Berechtigungen von der benutzerdefinierten Klasse zu erteilen. Ich habe zwei Schnittstellen und eine Singleton-Klasse, wie dieseVerwenden Sie die benutzerdefinierte Klasse, um die Berechtigung zu erteilen

public interface RequestPermissionsResultInterface 
{ 
    void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults); 
} 

public interface PermissionManagerInterface 
{ 
    void onPermissionGranted(String message, int requestCode); 
    void onPermissionDenied(String message, int requestCode); 
} 

public class PermissionManager 
{ 
    private Activity mActivity; 
    private static volatile PermissionManagerInterface mManagerInterface; 


    public static PermissionManager getInstance(Context context) 
    { 
     if (mPermissionManager == null) 
     { 
      synchronized (PermissionManager.class) 
      { 
       if (mPermissionManager == null) 
       { 
        mPermissionManager = new PermissionManager(context); 
       } 
      } 
     } 
     return mPermissionManager; 
    } 

    private boolean isReadStorageAllowed() 
    { 
     int result = ContextCompat.checkSelfPermission(this.mActivity, Manifest.permission.READ_EXTERNAL_STORAGE); 
     return ((result == PackageManager.PERMISSION_GRANTED)); 
    } 

    public RequestPermissionsResultInterface askPermission(
     Activity mActivity, 
     String permissionName, 
     final PermissionManagerInterface managerInterface, 
     final int requestCode) 
    { 
     boolean isReadExternalStorageAllowed = isReadStorageAllowed(); 
     if(isReadExternalStorageAllowed == false) 
     { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permissionName)) 
      { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 
       builder.setMessage("Please allow all permissions in App Settings for additional functionality."); 
       builder.setCancelable(false); 
       builder.setPositiveButton("Allow", new DialogInterface.OnClickListener() { 
        public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
         managerInterface.onPermissionGranted("Permission Granted", requestCode); 
        } 
       }); 
       builder.setNegativeButton("Deny", new DialogInterface.OnClickListener() { 
        public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
         managerInterface.onPermissionDenied("Permission Denied", requestCode); 
        } 
       }); 

       final AlertDialog alert = builder.create(); 
       alert.show(); 
      } 
     } 
     else managerInterface.onPermissionGranted("Permission Already Granted", requestCode); 
    } 
} 

Und hier ist, wie ich diese Klasse in MainActivity verwenden

PermissionManager permManager = PermissionManager.getInstance(); 
permManager.askPermission(
      MainActivity.this, 
      Manifest.permission.READ_EXTERNAL_STORAGE, 
      mPermissionManagerInterface,    // assume this exists 
      EXTERNAL_STORAGE_PERMISSION_CODE); 

wieder .... es ist nicht persistent. Wenn ich die Erlaubnis gebe, dann stoppe und starte die App erneut ... das fragt mich erneut um Erlaubnis. Was könnte falsch sein ?? Danke

+0

Wenn Sie neu bei Android sind, versuchen Sie es auf die dokumentierte Art und Weise, bevor Sie sich selbst überholen, indem Sie versuchen, Ihren eigenen Dreh darauf zu setzen. – Kuffs

Antwort

0

Wenn Sie entschlossen sind, die "benutzerdefinierte" Methode zu gehen, müssen Sie noch bestimmte Dinge behandeln.

  1. shouldShowRequestPermissionRationale gilt nur, wenn Sie zuvor eine Genehmigung beantragt und wurde verweigert. Sie scheinen es zu verwenden, um einen Dialog anzuzeigen, der sagt "bitte gewähren Sie Berechtigungen" aber das System nicht wirklich fordert, das Erlaubnisanforderungsdialogfeld anzuzeigen.

  2. Der Befehl zur tatsächlichen Anforderung von Berechtigungen lautet ActivityCompat.requestPermissions. Kann dies nicht in Ihrem Code sehen. Der Benutzer kann keine Berechtigung erteilen, es sei denn, Sie fragen tatsächlich danach.

  3. onRequestPermissionsResult ist, wo Sie Ihre Schnittstelle aufrufen sollten, um zu sagen, dass Erlaubnis gewährt wurde.

Vollständige Anweisungen finden Sie in der Dokumentation.

https://developer.android.com/training/permissions/requesting.html

+0

Danke ... das hat funktioniert. Das war jedoch nur ein Teil des Problems. Siehe meine Antwort unten. –

+0

Wenn Sie noch einmal schauen, werden Sie in Punkt 2 sehen, dass ich keine Berechtigungen angefordert habe, also gab ich Ihnen eine vollständige Antwort. Bitte akzeptieren Sie die Antwort. http://stackoverflow.com/help/someone-answers Dies ist kein Forum. Danke – Kuffs

+0

Ja. In gewissem Sinne ist deine Antwort vollständig. Ich habe (fälschlicherweise) erwartet, dass mein benutzerdefinierter Dialog damit umgehen kann. Es war nicht. Wenn ich mein benutzerdefiniertes Dialogfeld verwende, muss ich immer noch Berechtigungen über ActivityCompat.requestPermissions anfordern. Also zeige ich ZWEI Dialogfelder an (was ärgerlich ist, wenn ich weiß, dass mein benutzerdefinierter Dialog wertlos ist). Ich hoffe ich mache Sinn. Immer noch volle Anerkennung für dich. Ich habe nicht 15 Ruf, also kann ich nicht upvote. –

0

Von Android Dokumentation

Hinweis: Wenn Ihre App requestPermissions() aufrufen, zeigt das System ein Standard-Dialogfeld für den Benutzer. Ihre App kann dieses Dialogfeld nicht konfigurieren oder ändern.

Ich habe versucht, Erlaubnis durch benutzerdefinierten Dialog zu erteilen, der nie zur Arbeit gehen würde. Dies war nur ein Teil des Problems.

Ich habe keine Erlaubnis in benutzerdefinierten Dialogcodeabschnitt angefordert (was schlecht gewesen wäre, weil ich am Ende 2 Dialoge zeige: Standard + mein benutzerdefinierter Dialog). Also entferne ich meinen benutzerdefinierten Dialog und halte mich an den Standarddialog.

Kudos geht an kuffs weil er mich in die richtige Richtung brachte.

Verwandte Themen