2015-07-25 16 views
5

Possiedo un fornitore di contenuti esportato che è condiviso tra molte delle mie app e per il quale una terza parte potrebbe essere libera di scrivere le proprie app una volta pubblicata l'API.Applicare le autorizzazioni di proprietà dell'articolo sul provider di contenuto

In questo momento qualsiasi app client può eseguire qualsiasi operazione CRUD su qualsiasi elemento nel provider di contenuti. Voglio applicare alcune autorizzazioni di accesso in modo che un'app possa modificare o eliminare solo gli elementi creati, consentendo comunque a qualsiasi app di leggere tutti gli elementi nel provider e creare nuovi elementi.

Esiste un modo per accedere all'ID della app chiamante e archiviarlo con gli elementi appena creati, quindi confrontarlo con quello delle operazioni future? Sarebbe meglio usare il nome del pacchetto? Presumo che l'UID potrebbe cambiare se l'utente ha disinstallato e reinstallato un'app e non voglio che perderà l'accesso a tali elementi se lo fanno.

risposta

1

Sì, è possibile eseguire un controllo del nome del pacchetto. Ecco come è possibile recuperare il nome del pacchetto in base alla uid chiamata:

private static Collection<String> getCallingPackages(Context context) { 
    int callingUid = Binder.getCallingUid(); 
    if (callingUid == 0) { 
     return Collections.emptyList(); 
    } 

    String[] packages = context.getPackageManager().getPackagesForUid(callingUid); 
    return new ArrayList<>(Arrays.asList(packages)); 
} 

Questo restituisce un elenco di nomi di pacchetti, perché, per citare la documentazione:

Nella maggior parte dei casi, questo sarà un singolo nome del pacchetto, il pacchetto a cui è stato assegnato quell'ID utente.

Dove ci sono più pacchetti che condividono lo stesso ID utente tramite il meccanismo "sharedUserId" , verranno restituiti tutti i pacchetti con quell'id.