2013-08-14 18 views
9

Devo recuperare le autorizzazioni dal manifest.xml di un'applicazione Android e non so come farlo.Recupera le autorizzazioni da manifest.xml in Android.

Ho letto the post here ma non sono completamente soddisfatto dalle risposte. Suppongo che ci dovrebbe essere una classe nell'API di Android che consentirebbe di recuperare informazioni dal manifest.

Grazie.

+1

Questo non è un formato appropriato per un post StackOverflow di tipo FAQ. Fai una domanda, poi rispondi alla tua stessa domanda. – CommonsWare

+0

Ho ... Ho intenzione di modificare la domanda in base al tuo commento quindi. –

+0

Non riesco ancora a postare la mia risposta, ma per coloro che leggeranno questo, suggerisco di dare un'occhiata alla [classe PackageManager] (http://developer.android.com/reference/android/content/pm/PackageManager .html) –

risposta

12

È possibile utilizzare questo metodo:

//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

Questo NON è quello che l'OP chiedeva ... –

+0

Non è esattamente quello che avevo chiesto, ma Mi ha portato a trovare un modo per fare ciò che volevo usando la maggior parte del codice suggerito e senza dover analizzare il manifest. Nell'OP, avevo anche detto che volevo evitare le soluzioni presentate altrove che consistevano principalmente nell'analisi del manifest. –

-4

È possibile utilizzare questa funzione:

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

Usage:

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

Questa è una pessima risposta. Perché la domanda non riguardava il controllo dell'autorizzazione di sistema (se era stata concessa). La domanda riguarda la lista delle autorizzazioni dichiarate in 'AndroidManifest.xml' – StefMa

+0

Questo serve per verificare se l'autorizzazione di runtime è disponibile o meno. La domanda è di verificare se il permesso è stato aggiunto al manifest o meno. –

0

Utilizzare questa:

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

Ciao. Grazie per la risposta, anche se è una domanda di 2 anni che ha già avuto una risposta. Per quanto riguarda la risposta, utilizzerei comunque la risposta accettata come base per una soluzione poiché utilizza la classe progettata per recuperare informazioni sull'applicazione. Credo che questo sia più affidabile dell'analisi del manifest, che ha una struttura che potrebbe cambiare a seconda della versione di Android. È anche più breve. A proposito, hai fatto un downgrade dell'OP? –

+0

@AlexisLeCompte No. –

+0

Piuttosto che controllare le diverse autorizzazioni per ogni diversa app che è necessario definire nel codice, questa è davvero comoda, specialmente con Android 6 e versioni successive. Ho salvato la mia giornata e ottenuto un upvote! :-) – Anticro

4

Ecco un utile metodo di utilità che fa proprio questo.

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 
} 
Problemi correlati