私はあなたのソーシャルメディアネットワークの選択肢を使用して画像を共有できるようにするためのボタンをAndroidアプリで作成しようとしています。画像ファイルはアプリのassetsフォルダに保存されています。Android:メッセージ、G +、twitter、facebookを介してアセットから信頼できるイメージを共有できますか?
私の計画は、カスタムContentProviderを実装してイメージに外部からアクセスし、コンテンツプロバイダー内のイメージのURIを指定するTYPE_SENDインテントを送信することです。
私はこれを行いました。これはGoogle+とGmailの両方で機能しますが、他のサービスでは失敗します。最も難しいのは、私のContentProviderのquery()メソッドから返される情報に関する情報を見つけることでした。一部のアプリは投影を指定します(たとえばGoogle+では_idと_dataを求めます)。一部のアプリでは投影としてnullが渡されます。投影が指定されている場合でも、実際のデータ(タイプ)が列にどのように表示されるかはわかりません。私はこれに関する文書を見つけることができません。
私はContentProviderのopenAssetFileメソッドも実装していますが、これは(Google+では2回)呼び出されますが、必然的にクエリメソッドも呼び出されます。クエリメソッドの結果のみがカウントされるようです。
私は間違っていますか?クエリメソッドから何を返す必要がありますか?以下
コード:
// 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);
}
}
これを理解できましたか?私はまだそれがfacebookのために働くのを見たことがある。 – selsine