2016-03-16 11 views
13

tutaj jest mój kod i to działa idealnie dobrze.Sprawdź uprawnienia Android w metodzie

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); 
} 

Ale nie podoba mi się taki duży kod przy każdym czeku i chcę go przekazać do metody w mojej klasie narzędziowej.

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

Ale setMyLocationEnabled ma adnotacji @RequiresPermission I tak nie mogę przekazać ją do metody, ponieważ szarpie i redaktor pokazuje go jako błąd.

Czy jest jakaś adnotacja do napisania na mojej metodzie użyteczności i pomijać kłaczki?

coś takiego

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

spróbuj umieścić '' setMyLocationEnabled' w try-catch' i uchwyt 'SecurityException'. Powinien działać bez adnotacji. – Rohit5k2

+0

Kod jest nadal duży i wygląda paskudnie. Chcę rozwiązać ze zgrabnym małym kodem. –

Odpowiedz

28

Można zmienić nazwę metody jako checkLocationPermission(Activity activity). Odkryłem, że nazwa twojej metody musi zaczynać się od "sprawdź", a kończy się na "Pozwolenie", aby przekazać ostrzeżenia Lint.

Na przykład:

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

Doskonała odpowiedź! Wiedziałem, że coś takiego jest. Dziękuję. Teraz mój kod wygląda świetnie, a także nie ma ostrzeżeń lint. –

+0

Ha-ha, hackowanie nitek w ten sposób jest naprawdę miłe –

1

Co ja przystań sporządzona jest utworzyć klasę, a wewnątrz niego zrobić konstruktor, jak pokazano poniżej:

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; 
     } 
    } 

Następnie wewnątrz ciebie klasa nazywają swoje funkcje jak

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

Przed wywołaniem funkcji wewnątrz klasy wykonaj to

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

MarshMallowPermission nie jest bardzo odpowiednią nazwą, ponieważ mamy tę funkcję także w wyższych API. –

+0

MarshMallowPermission to nazwa nadana, abyś mógł zrozumieć, co robi klasa. –

+0

@IoaneSharvadze: Jeśli odpowiedź jest zgodna z twoją potrzebą, zaakceptuj i oddaj głosowanie moją odpowiedzią. Dziękuję –

12

można stłumić ten błąd zarówno w edytorze iw raportach szarpie przez opisywanie metodę z @SuppressWarnings("MissingPermission"), czy można stłumić błąd na tylko jednym rachunku poprzez umieszczenie //noinspection MissingPermission powyżej tej linii.

Na przykład:

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

Lub:

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

Dobra odpowiedź, będzie czekać kilka dni, a jeśli to najlepsza odpowiedź, dam ci nagrodę. Dzięki. –

Powiązane problemy