2016-09-22 2 views
0

Ich bin bereit, eine App zu erstellen, die Bilder in der Antwort auf die android.intent.action.GET_CONTENT Absicht sendet. Mein Anwendungsfall ist die Messenger-App aus dem Play Store, der wahrscheinlich gebräuchlichsten SMS/MMS-App.senden Bild als Antwort auf android.intent.action.GET_CONTENT

Ich habe versucht, das Bild zu senden, aber es funktionierte nicht gut. Wenn die MMS an Android-Telefone gesendet werden, erhalten sie es richtig, aber iPhones scheinen es als ein falsches Video anzuzeigen, das nie spielt.
Ich weiß, dass es durch meinen oder die ausländischen Betreiber MMSC-Server verursacht werden kann, dass es klug und transcodiert die Daten zu dem, was es denkt, errät ist ein gutes Format.

Wenn jedoch die gleiche Absicht auf eine andere App (versuchte Fotos App von Google und Solid Explorer), es funktioniert gut mit Android und iPhones.

Meine Vermutung ist, dass Fotos und Solid Explorers die Daten in einem geeigneten Format zurücksenden, das die MMS-Apps korrekt an das MMSC senden, das das Bild liefert wie es ist.

Hier ist, was ich versucht:

  1. eine einfache Uri meiner Datei im Cache senden (über Content#getExternalCacheDir(): nicht
  2. eine Uri meiner Datei senden Arbeit einen StreamProvider verwenden, CommonWare's CWAC lib verwenden, durch eine Einstellung LocalPathStrategy mit Context#getExternalCacheDir() als Root - Pfad: funktioniert nicht

Beide Strategien enden mit dem Bild zurück an die MMS-App richtig, die es anzeigt und die Schaltfläche wird "Send MMS"; dann auf Android ist es als Bild erhalten, und auf iOS ist es ein falsches Video, das nicht funktioniert.

Wie soll ich die Daten zurück an die aufrufende App senden?

Nur tatsächlich zu erklären, was ich tat, hier ist die erste Strategie:

Intent result = new Intent(); 
result.setData(Uri.fromFile(localImage)); 
setResult(Activity.RESULT_OK, result); 
finish(); 

Hier ist das zweite:

Intent result = new Intent(); 
result.setData(PROVIDER 
     .buildUpon() 
     .appendPath(StreamProvider.getUriPrefix(AUTHORITY)) 
     .appendPath(localImage.getName()) 
     .build()); 
result.setFlags(FLAG_GRANT_READ_URI_PERMISSION); 
setResult(Activity.RESULT_OK, result); 
finish(); 

Ich glaube, ich die Bitmap-Bytes als Daten in der Absicht passieren kann, aber ich habe keinen Weg gefunden, dies zu tun.

+1

Testen Sie mit etwas anderem als MMS und sehen Sie, welche Unterschiede zwischen den Ansätzen bestehen. Zum Beispiel senden Sie es als E-Mail-Anhang. Oder erstellen Sie einen ACTION_GET_CONTENT-Client, testen Sie die verschiedenen Szenarien und vergleichen Sie, was Sie zurückbekommen. Sie könnten auch in Erwägung ziehen, den MIME-Typ an die Antwort "Intent" anzuhängen, falls das hilft. – CommonsWare

+0

Ich werde mit der Client-Route gehen, das ist großartig. Ich hätte darüber nachdenken sollen! Vielen Dank. –

+0

Der einzige Unterschied zwischen meiner Absicht und dem Solid Explorer besteht darin, dass ich Flags auf 1 gesetzt habe ('FLAG_GRANT_READ_URI_PERMISSION'), und sie haben den MIME-Typ definiert. Ich nehme an, dass ihr Provider nicht die gleiche Sicherheitsstufe wie Ihre für die Flaggen hat. Ich habe den MIME-Typ adeded, schlägt immer noch fehl. Google Fotos hat Flags = 1 und zusätzliche Clip-Daten, bei denen es sich um eine "Text/URI-Liste" eines Elements handelt, das denselben URI wie der Inhalt enthält. Da mein Ergebnis fast dasselbe ist wie Solid Explorer und Google Fotos, vermute ich, dass es auf der Seite des Anbieters ist. Gibt es dort einen MIME-Typ? –

Antwort

1

Ja, es sieht aus wie setResult() auch eine Intent mit FLAG_GRANT_READ_URI_PERMISSION und/oder FLAG_GRANT_WRITE_URI_PERMISSION benötigt, wenn Sie ein ContentProvider für das Ergebnis Uri verwenden.

addFlags() funktioniert diese Flags auf die Intent, zumindest wieder auf API-Ebene 19 die ich getestet habe nicht als das ältere hinzufügen, so kann es Versionen geben, in denen Sie die ClipData Trick verwenden:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT) { 
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
} 
else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) { 
    ClipData clip= 
    ClipData.newUri(getContentResolver(), "A photo", outputUri); 

    i.setClipData(clip); 
    i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
} 
else { 
    List<ResolveInfo> resInfoList= 
    getPackageManager() 
     .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

    for (ResolveInfo resolveInfo : resInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    grantUriPermission(packageName, outputUri, 
     Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
    } 
} 
Verwandte Themen