Contentprovider und grantUriPermissions

L

LittleExpert

Neues Mitglied
0
Hallo,

ich stelle in meiner App Logdateien per Contentprovider zur Verfügung.

Diese werden per ACTION_SEND_MULTIPLE intent versendet.

Code:
public static void sendLogfiles(Activity activity) {
        try {
            File[] logFiles = Logging.getAllLogfiles();
            
            if ( ( logFiles != null ) && ( logFiles.length > 0 ) ) {
                final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
                ArrayList<Uri> uris = new ArrayList<Uri>();
                
                emailIntent.setType("text/plain");
                emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Android Logfiles");
                String osVersion = android.os.Build.VERSION.SDK_INT + ", " + android.os.Build.VERSION.RELEASE;
                String versionName = activity.getPackageManager().getPackageInfo( activity.getPackageName(), 0 ).versionName;
                String body = String.format("Android Logfiles\r\nModel: %s\r\nManufacturer: %s\r\nAndroid OS: %s\r\nApp version: %s",
                                             android.os.Build.MODEL, android.os.Build.MANUFACTURER, osVersion, versionName);
                emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
                for (File logFile : logFiles) {
                    uris.add(Uri.parse( "content://" + LogFileProvider.AUTHORITY + "/" + logFile.getName() ) );
                }
                emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,uris);
                
                activity.startActivity( Intent.createChooser(emailIntent, "Send log files to" ) );
             }  
        } catch (Exception e) {
             Log.error( "sendLogfiles failed, Exception:" + e.toString() );
        }
    }
Auf einigen Geräten (ich vermute mit älteren Android Versionen) funktioniert das.
Dort kann ich dann aus der Liste der Apps die den ACTION_SEND_MULTIPLE intent unterstützen z.B. eine Emailapp auswählen und diese hat die Dateien im Anhang.

Auf anderen Geräten (ich vermute mit neueren Android Versionen) erhalte ich eine java.lang.SecurityException (Provider ... does not allow granting of Uri permissions).

Das hinzufügen der Codezeile emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); um temporären Zugriff zu gewähren ändert nichts.
Wenn ich in mein Manifest für den Provider den Eintrag android:grantUriPermissions="true" (diesen Eintrag gab es bisher nicht) hinzufüge funktioniert es wieder.

Was bedeutet dieser Eintrag für meine App bezüglich Sichertheit etc.?

Was bedeutet der folgende Auszug aus der Doku?

"If you enable this feature, either by setting this attribute to "true" or by defining <grant-uri-permission> subelements, you must call Context.revokeUriPermission() when a covered URI is deleted from the provider."

Bisher rufe ich Context.revokeUriPermission() nicht auf.

Viele Grüße,
LittleExpert
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
111
swa00
swa00
Laser5001
Antworten
3
Aufrufe
646
swa00
swa00
W
Antworten
2
Aufrufe
739
rene3006
R
Zurück
Oben Unten