2012-07-31 3 views
5

Ich versuche, eine Schaltfläche in meiner Android-App zu erstellen, die es dem Benutzer ermöglicht, ein Bild mithilfe seiner Wahl von Social Media-Netzwerk zu teilen. Die Bilddatei wird im Ordner "Assets" der App gespeichert.Android: Zuverlässig teilen Sie ein Bild von Vermögenswerten über Messaging, G +, Twitter, Facebook?

Mein Plan ist es, einen benutzerdefinierten ContentProvider zu implementieren, um externen Zugriff auf das Bild zu geben, und dann eine TYPE_SEND-Absicht zu senden, die die URL des Bildes in meinem Inhaltsanbieter angibt.

Ich habe dies getan und es funktioniert für Google+ und GMail, aber für andere Dienste schlägt es fehl. Der schwierigste Teil war das Finden von Informationen darüber, was ich von der query() - Methode meines ContentProviders zurückgeben soll. Einige Apps geben eine Projektion an (z. B. fragt Google+ nach _id und _data), während einige Apps als Projektion null übergeben. Auch wenn die Projektion angegeben ist, habe ich keine Ahnung, welche tatsächlichen Daten (Typen) in den Spalten erwartet werden. Ich kann dazu keine Dokumentation finden.

Ich habe auch die openAssetFile-Methode des ContentProvider implementiert und diese wird aufgerufen (zweimal von Google+!), Aber dann wird zwangsläufig auch die Abfrage-Methode aufgerufen. Nur das Ergebnis der Abfragemethode scheint zu zählen.

Irgendwelche Ideen, wo ich falsch liege? Was soll ich von meiner Abfrage-Methode zurückgeben?

-Code unten:

// my intent 

Intent i = new Intent(android.content.Intent.ACTION_SEND); 
i.setType("image/jpeg"); 
Uri uri = Uri.parse("content://com.me.provider/ic_launcher.jpg"); 
i.putExtra(Intent.EXTRA_STREAM, uri);  
i.putExtra(android.content.Intent.EXTRA_TEXT, text); 
startActivity(Intent.createChooser(i, "Share via")); 

// my custom content provider 

public class ImageProvider extends ContentProvider 
{ 
private AssetManager _assetManager; 

public static final Uri CONTENT_URI = Uri.parse("content://com.me.provider"); 

// not called 
@Override 
public int delete(Uri arg0, String arg1, String[] arg2) 
{ 
    return 0; 
} 

// not called 
@Override 
public String getType(Uri uri) 
{ 
    return "image/jpeg"; 
} 

// not called 
@Override 
public Uri insert(Uri uri, ContentValues values) 
{ 
    return null; 
} 

@Override 
public boolean onCreate() 
{ 
    _assetManager = getContext().getAssets(); 
    return true; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 
{ 
    MatrixCursor c = new MatrixCursor(new String[] { "_id", "_data" }); 

    try 
    { 
        // just a guess!! works for g+ :/ 
     c.addRow(new Object[] { "ic_launcher.jpg", _assetManager.openFd("ic_launcher.jpg") }); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 

    return c; 
} 

// not called 
@Override 
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 
{ 
    return 0; 
} 

// not called 
@Override 
public String[] getStreamTypes(Uri uri, String mimeTypeFilter) 
{ 

    return new String[] { "image/jpeg" }; 
} 

// called by most apps 
@Override 
public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException 
{ 

    try 
    { 
     AssetFileDescriptor afd = _assetManager.openFd("ic_launcher.jpg"); 
     return afd; 
    } catch (IOException e) 
    { 
     throw new FileNotFoundException("No asset found: " + uri); 
    } 
} 

// not called 
@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
     throws FileNotFoundException 
{ 

    return super.openFile(uri, mode); 
} 

}

+0

Konnten Sie das herausfinden? Ich muss es noch für Facebook arbeiten sehen. – selsine

Antwort

1

Dank, Ihre Frage gelöst mein;) Ich war das genau umgekehrte Problem von Ihnen mit: jeder Dienst außer g + funktionieren würde. Ich gab null in der Abfrage-Methode zurück, die g + zum Absturz brachte.

Das einzige, was meine Bilder tatsächlich belichtete, war openFile() zu implementieren. Ich habe meine Bilder auf dem Dateisystem gespeichert, nicht in den Assets, aber ich nehme an, Sie könnten einen ParcelFileDescriptor von Ihrem AssetFileDescriptor bekommen und es zurückgeben. Meine openFile() Methode sieht wie folgt aus:

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
     throws FileNotFoundException { 
    String path = uri.getLastPathSegment(); 
    if (path == null) { 
     throw new IllegalArgumentException("Not a Path"); 
    } 
    File f = new File(getContext().getFilesDir() + File.separator + "solved" + path + ".jpg"); 
    int iMode; 
    if ("r".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_ONLY; 
    } else if ("rw".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_WRITE; 
    } else if ("rwt".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_TRUNCATE; 
    } else { 
     throw new IllegalArgumentException("Invalid mode"); 
    }  
    return ParcelFileDescriptor.open(f, iMode); 
} 

Diese für jeden Dienst arbeitet ich mit den ACTION_SEND Absichten außer g + installiert haben. Mit Ihrer Abfrage-Methode funktioniert es auch für Google Plus.

+0

können Sie bitte mir helfen, ich bin nicht in der Lage, Bild mit Inhaltsanbieter mit fb, Bluetooth, Twitter usw – user3233280