2016-03-16 13 views
13

hier ist mein Code und es funktioniert einwandfrei.Überprüfen Android Berechtigungen in einer Methode

if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
    mMap.setMyLocationEnabled(true); 
} 

Aber ich mag es nicht so ein großen Code auf jedem Scheck, und will sie ein Verfahren in meiner Utility-Klasse delegieren.

if (Utils.hasMapLocationPermissions(getActivity())) { 
    mMap.setMyLocationEnabled(true); 
} 

Aber setMyLocationEnabled hat Anmerkung @RequiresPermission Und so kann ich es nicht auf ein Verfahren delegieren, weil Flusen und Editor zeigt es als Fehler.

Gibt es eine Anmerkung, um auf meine Hilfsmethode zu schreiben und Flusen zu unterdrücken?

So etwas wie dieses

@ChecksPermission 
public boolean hasMapLocationPermissions(Activity activity) { 
    return // my checking logic.. 
} 
+0

Try 'setMyLocationEnabled' in einem' Try-catch' setzen und Griff 'SecurityException'. Sollte ohne Anmerkung funktionieren. – Rohit5k2

+0

Der Code ist immer noch groß und sieht hässlich aus. Ich möchte mit ordentlichem kleinen Code lösen. –

Antwort

28

Sie Ihre Methode als checkLocationPermission(Activity activity) umbenennen. Ich habe festgestellt, dass der Name Ihrer Methode mit "check" beginnen und mit "Permission" enden muss, um die Warnmeldungen von Lint zu übergeben.

Zum Beispiel:

public static boolean checkLocationPermission(Context context) { 
    return ActivityCompat.checkSelfPermission(context, 
      Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
      && ActivityCompat.checkSelfPermission(context, 
      Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
} 
+2

Ausgezeichnete Antwort! Ich wusste, dass da so etwas war. Vielen Dank. Jetzt sieht mein Code gut aus und es gibt auch keine Warnmeldungen. –

+0

Ha-ha, Hacking Lint es so ist wirklich nett –

1

Was ich haven getan ist eine Klasse erstellen und in ihm einen Konstruktor machen, wie unten dargestellt:

public MarshMallowPermission(Activity activity) { 
     this.activity = activity; 
    } 

    public boolean checkPermissionForRecord() { 
     int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO); 
     if (result == PackageManager.PERMISSION_GRANTED) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

Dann in Ihnen Klasse Ihre Funktionen aufrufen wie

if (!marshMallowPermission.checkPermissionForRecord()) { 
     marshMallowPermission.requestPermissionForRecord(); 
    } 

und vor dem Aufruf der Funktion in Ihrer Klasse tun Sie dies

MarshMallowPermission marshMallowPermission = new MarshMallowPermission(getActivity()); 
+1

MarshMallowPermission ist kein sehr geeigneter Name, da wir diese Funktion auch in den oberen APIs haben. –

+0

MarshMallowPermission ist ein Name, mit dem Sie verstehen können, was die Klasse tut. –

+0

@IoaneSharvadze: Wenn die Antwort entsprechend Ihrem Bedarf ist, akzeptieren Sie bitte und stimmen Sie meine Antwort ab. Danke –

12

Sie können mit @SuppressWarnings("MissingPermission") von annotieren Ihre Methode sowohl im Editor und in lint berichtet diesen Fehler unterdrücken, oder Sie können für nur eine einzige Anweisung der Fehler unterdrücken, indem //noinspection MissingPermission oberhalb dieser Linie setzen.

Zum Beispiel:

@SuppressWarnings("MissingPermission") 
public boolean hasMapLocationPermissions(Activity activity) { 
    // your checking logic 
} 

Oder:

if (Utils.hasMapLocationPermissions(getActivity())) { 
    //noinspection MissingPermission 
    mMap.setMyLocationEnabled(true); 
} 
+0

Gute Antwort, wird mehrere Tage warten, und wenn es die beste Antwort ist, werde ich Ihnen Kopfgeld geben. Danke. –

Verwandte Themen