Ho problemi a concedere "autorizzazioni inverse" per le app che I desiderano fornire con dati sensibili in modo controllato.Qual è la corretta gestione delle autorizzazioni quando si inviano dati sensibili per le app come allegato e-mail?
La mia domanda è un tracker tempo e, perché il registro di tempo-tracking potrebbe essere considerato informazioni personali, ho creato un permesso per l'accesso e assegnato il android.permission- group.PERSONAL_INFO gruppo di autorizzazioni.
Per esportare il registro ora dal telefono, aggiungo la possibilità di inviare il registro come allegato di posta elettronica. L'allegato è generato da un provider di contenuti protetto dalla mia autorizzazione appena aggiunta. Il mio codice per l'invio della posta elettronica è simile al seguente:
String email = "[email protected]";
Uri uri = TimeLog.CSVAttachment.CONTENT_URI;
Intent i = new Intent(Intent.ACTION_SEND, uri);
i.setType("text/csv");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{email});
i.putExtra(Intent.EXTRA_SUBJECT, "Time log");
i.putExtra(Intent.EXTRA_TEXT, "Hello World!");
i.putExtra(Intent.EXTRA_STREAM, uri);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(i);
Quando si esegue sul mio telefono HTC, ho una scelta pop-up tra Gmail e la posta HTC. La scelta di Gmail, ottengo questa eccezione in Gmail:
ERROR/AndroidRuntime(8169): Caused by: java.lang.SecurityException:
Permission Denial: reading com.mycompany.timelog.TimeLog uri
content://com.mycompany.timelog/csv_attachment from pid=8169,
uid=10035 requires com.mycompany.timelog.permission.READ_TIME_LOG
io ho android:grantUriPermissions="true"
set sul mio fornitore, ma che non sta aiutando. Ho una teoria sul perché questo accade. Ho avuto atteso FLAG_GRANT_READ_URI_PERMISSION per dare a Gmail il diritto di accesso il mio fornitore di contenuti, ma credo che ciò che realmente accade è che questa autorizzazione viene concessa per com.android.internal.app.ResolverActivity perché non v'è più di una corrispondenza per Intent e Android creano un'attività wrapper per visualizzando la scelta per l'utente.
Così, ho provato codificare questo nella mia app solo per le prove:
grantUriPermission("com.google.android.gm", uri,
Intent.FLAG_GRANT_READ_URI_PERMISSION);
Questo permette di Gmail per visualizzare la posta elettronica in modo corretto e che può premere "Send". Purtroppo, dopo GMail ha chiuso ottengo questa eccezione in com.google.process.gapps:
ERRORE/AndroidRuntime (7617): java.lang.SecurityException: Permesso Denial: lettura com.mycompany.timelog.TimeLog uri contenuti: //com.mycompany.timelog/csv_attachment da pid = 7617, uid = 10011 richiede com.mycompany.timelog.permission.READ_TIME_LOG
si noti che questo viene da un diverso PID e UID. Questo perché la chiamata effettiva a openAssetFile avviene da qualche componente del provider di sincronizzazione appartenente a un altro pacchetto (com.google.android.googleapps?).
Mentre ho avuto qualche speranza di finalmente trovare un modo per concedere le autorizzazioni al destinatario finale del mio ACTION_SEND
intenti, il fatto che la chiamata a openAssetFile accade da qualche praticamente pacchetto non correlato completamente diverso e mi lascia sconcertato da come il permesso di concessione è dovrebbe funzionare.
Quindi, in definitiva, la mia domanda è, dato che il registro è dati sensibili, come consentirei che venga inviato via email come allegato, rispettando la privacy dell'utente (ad es.senza rendere leggibile il mondo degli allegati )?
Cosa intendi per "rendere leggibile il mondo degli allegati"? –
Voglio dire non limitarlo a permessi specifici, quindi consentire a qualsiasi app di accedere all'URI. O, per esempio, mettendolo sulla scheda SD. – flodin
Grande uso delle autorizzazioni. Anche se sarebbe possibile (per il destinatario) utilizzare la crittografia a chiave pubblica per crittografare prima l'allegato e-mail prima che lasci il proprio fornitore di contenuti? O costruisci la possibilità di inviare l'email direttamente dalla tua app? –