2012-07-31 6 views
5

私はあなたのソーシャルメディアネットワークの選択肢を使用して画像を共有できるようにするためのボタンを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); 
} 

}

+0

これを理解できましたか?私はまだそれがfacebookのために働くのを見たことがある。 – selsine

答えて

1

おかげで、あなたの質問に解決鉱山;) 私はあなたの正確逆問題を抱えていた:すべてのサービスは、G +以外に働くだろう。 クエリメソッドでnullが返されました。これはg +クラッシュになりました。

画像を実際に公開する唯一の方法は、openFile()を実装することでした。 私のイメージはファイルシステムに保存されていますが、資産ではありませんが、 はをAssetFileDescriptorから入手して返信することができます。

@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); 
} 

これは私がG +を除くACTION_SEND意図と一緒にインストールされているすべてのサービスのために動作します: 私openFile()方法は、このようになります。 クエリメソッドを使用すると、google plusでも機能します。

+0

fb、bluetooth、twitterなどのコンテンツプロバイダを使用して画像を添付できない場合はどうぞ教えてください – user3233280