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);
}
}
Konnten Sie das herausfinden? Ich muss es noch für Facebook arbeiten sehen. – selsine