2013-08-14 16 views
9

Muszę programowo pobrać uprawnienia z pliku manifest.xml aplikacji na Androida i nie wiem, jak to zrobić.Programowe pobieranie uprawnień z pliku manifest.xml w Androidzie

Czytam the post here, ale nie jestem całkowicie zadowolony z odpowiedzi. Podejrzewam, że w interfejsie API Androida powinna istnieć klasa, która umożliwiłaby pobranie informacji z manifestu.

Dziękuję.

+1

Nie jest to odpowiedni format dla postu StackOverflow w stylu FAQ. Zadaj pytanie, a następnie odpowiedz na własne pytanie. – CommonsWare

+0

Ho ... Zamierzam edytować pytanie zgodnie z twoją uwagą. –

+0

Nie mogę jeszcze opublikować odpowiedzi, ale dla tych, którzy chcieliby ją przeczytać, sugeruję zapoznać się z klasą [PackageManager] (http://developer.android.com/reference/android/content/pm/PackageManager .html) –

Odpowiedz

12

Można użyć tej metody:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE" 
public boolean hasPermission(String permission) 
{ 
    try { 
     PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); 
     if (info.requestedPermissions != null) { 
      for (String p : info.requestedPermissions) { 
       if (p.equals(permission)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+2

NIE jest to, co OP poprosił o ... –

+0

To nie jest dokładnie to, o co prosiłem, ale skłonił mnie do znalezienia sposobu robienia tego, co chciałem, za pomocą większości sugerowanego kodu i bez konieczności analizowania manifestu. W PO powiedziałem również, że chcę uniknąć rozwiązań przedstawionych gdzie indziej, które polegają głównie na analizie manifestu. –

-4

Można używany tej funkcji:

public boolean hasPermission(Context ctx,String permission){ 
     return ctx.getPackageManager().checkPermission(permission, ctx.getPackageName()) 
       == PackageManager.PERMISSION_GRANTED); 
} 

Zastosowanie:

hasPermission(this,Manifest.permission.GET_ACCOUNTS); 
+2

To jest bardzo zła odpowiedź. Ponieważ pytanie nie dotyczyło sprawdzenia uprawnień do systemu (jeśli zostało przyznane). Pytanie dotyczy listy uprawnień, które są zadeklarowane w pliku "AndroidManifest.xml" – StefMa

+0

. Ma to na celu sprawdzenie, czy uprawnienie do wykonywania jest dostępne, czy nie. Należy sprawdzić, czy pozwolenie zostało dodane do manifestu, czy też nie. –

0

Użyj tego:

public static String getListOfPermissions(final Context context) 
{ 
    String _permissions = ""; 

    try 
    { 
     final AssetManager _am = context.createPackageContext(context.getPackageName(), 0).getAssets(); 
     final XmlResourceParser _xmlParser = _am.openXmlResourceParser(0, "AndroidManifest.xml"); 
     int _eventType = _xmlParser.getEventType(); 
     while (_eventType != XmlPullParser.END_DOCUMENT) 
     { 
      if ((_eventType == XmlPullParser.START_TAG) && "uses-permission".equals(_xmlParser.getName())) 
      { 
       for (byte i = 0; i < _xmlParser.getAttributeCount(); i ++) 
       { 
        if (_xmlParser.getAttributeName(i).equals("name")) 
        { 
         _permissions += _xmlParser.getAttributeValue(i) + "\n"; 
        } 
       } 
      } 
      _eventType = _xmlParser.nextToken(); 
     } 
     _xmlParser.close(); // Pervents memory leak. 
    } 
    catch (final XmlPullParserException exception) 
    { 
     exception.printStackTrace(); 
    } 
    catch (final PackageManager.NameNotFoundException exception) 
    { 
     exception.printStackTrace(); 
    } 
    catch (final IOException exception) 
    { 
     exception.printStackTrace(); 
    } 

    return _permissions; 
} 
// Test: Log.wtf("test", getListOfPermissions(getApplicationContext())); 
+2

Cześć. Dziękuję za odpowiedź, chociaż jest to dwuletnie pytanie, które już dawało odpowiedź. Jeśli chodzi o twoją odpowiedź, nadal używałbym zaakceptowanej odpowiedzi jako podstawy rozwiązania, ponieważ używa klasy zaprojektowanej do pobierania informacji o aplikacji. Uważam, że jest to bardziej wiarygodne niż analizowanie manifestu, który ma strukturę, która może potencjalnie zmieniać się w zależności od docelowej wersji Androida. Jest również krótszy. Przy okazji, czy zgodziłeś się na PO? –

+0

@AlexisLeCompte No. –

+0

Zamiast sprawdzać różne uprawnienia dla każdej innej aplikacji, którą musisz zdefiniować w kodzie, ten jest naprawdę wygodny, szczególnie w systemie Android 6 i nowszych wersjach. Uratowałem mój dzień i dostałem przegraną! :-) – Anticro

4

Oto użyteczna metoda użyteczności, która właśnie to robi.

public static String[] retrievePermissions(Context context) { 
    try { 
     return context 
       .getPackageManager() 
       .getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS) 
       .requestedPermissions; 
    } catch (PackageManager.NameNotFoundException e) 
     throw new RuntimeException ("This should have never happened.", e); // I'd return null and Log.wtf(...) in production 
}