2016-06-28 12 views
2

Dies ist meine implizite Absicht Bildbearbeitung Anwendungen auf dem Gerät aufzurufen:android implizite Absicht bearbeiten fehlgeschlagen Bild laden

startActivity(new Intent(Intent.ACTION_EDIT).setDataAndType(myUri, 
    getMimeType(myUri)).setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | 
    Intent.FLAG_GRANT_WRITE_URI_PERMISSION)); 

Und das ist, wie ich getMimeType:

public String getMimeType(Uri uri) { 
    String mimeType = null; 
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { 
     ContentResolver cr = getContentResolver(); 
     mimeType = cr.getType(uri); 
    } else { 
     String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri 
       .toString()); 
     mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
       fileExtension.toLowerCase()); 
    } 
    return mimeType; 
} 

Für einige Anwendungen es Abstürze zum Laden:

Auf der App wird nur eine unsichtbare Seite geladen und die Interaktion mit meiner App deaktiviert.

Auf der App AirBrush lädt es die App aber stürzt mit dieser Meldung ab "Bild konnte nicht geladen werden".

Bezieht es sich auf minimale SDK-Version als meine ist 16? Ich habe dies auf mindestens SDK-Version von 9 zu und keine Änderung im Ergebnis getestet.

Gibt es noch etwas, das ich hinzufügen sollte, um mit allen Apps zu arbeiten?

Ich habe putExtra auch versucht, und es hilft nicht:

.putExtra(Intent.ACTION_EDIT, myUri); 

Ich habe einige Galerie apps auf meinem Gerät und alle von ihnen starten Sketch_Camera und AirBrush ohne Probleme.

Was passiert hier? Ich bin so verwirrt nach zwei Tagen des Kampfes mit diesem Phänomen.

+1

Was ist der Wert von 'myUri'?Warum verwenden Sie 'image/*' anstelle des eigentlichen MIME-Typs (wie es * Ihr * Inhalt ist, also * wissen Sie * was der MIME-Typ ist)? – CommonsWare

+0

myUri ist ein URI aus einer Image-Datei >> 'Uri.fromFile (myFile)' und warum verwende ich 'image/*' anstelle des tatsächlichen MIME-Typs? Ich habe den Code vom Stapel abgeholt. Jetzt habe ich die Frage basierend auf Ihrem Leitfaden bearbeitet. Aber trotzdem bekomme ich das gleiche Ergebnis. – Eftekhari

+1

"myUri ist ein URI aus einer Bilddatei" - und wo ist diese Datei? 'Intent.FLAG_GRANT_READ_URI_PERMISSION' und' Intent.FLAG_GRANT_WRITE_URI_PERMISSION' sind in diesem Fall nutzlos, da sie nicht zu 'file'' Uri' Werten gehören. – CommonsWare

Antwort

2

Es ist eine Datei vom Pfad einer Medienspeicherdatei erstellt von MediaStore.Images.Media.EXTERNAL_CONTENT_URI Abfrage

Es gibt keine Garantie, dass die anderen App Rechte an diesen Ort hat, oder sogar, dass Ihre App hat Rechte an diesem Ort. Zum Beispiel könnte das Bild auf removable storage sein. Außerdem, the fileUri scheme is being banned for cross-app usage, wie auch immer. Verwenden Sie stattdessen contentUri. Zum Beispiel in this sample app, frage ich MediaStore für Videos. ein Cursor namens row an einem bestimmten Video positioniert Given, erzeuge ich die Uri für sie über:

videoUri= 
    ContentUris.withAppendedId(
     MediaStore.Video.Media.EXTERNAL_CONTENT_URI, row.getInt(row.getColumnIndex(MediaStore.Video.Media._ID))); 

Diese Uri beide Werke für meine eigenen Zwecke (zB Hand zu Picasso ein Miniaturbild, Hand VideoView für die Wiedergabe zu erhalten) und zur Weitergabe an Apps von Drittanbietern (z. B. ACTION_VIEW zur Wiedergabe).

Abgesehen von der Änderung der Basis Uri zu der, die Sie abgefragt haben (MediaStore.Images.Media.EXTERNAL_CONTENT_URI), sollte der gleiche grundlegende Code für Sie arbeiten.

Auch loswerden die Fahnen von Ihrem Intent. Diese sind nur für die Intent Punkte auf Ihre eigenen ContentProvider, die nicht in Ihrem ursprünglichen Code oder mit der Uri, die Sie aus withAppendedId() erstellen.