AndroidアプリでBitmap画像をtwitterに投稿したい時にうまく投稿できない場合の対処方法を紹介します。

ContentProviderに画像を保存したときのuriをセットする

intentでtwitterに画像を添付して投稿したい場合には、assetフォルダに格納されているファイルパスを指定するのではなく、ContentProviderにて画像アルバムに保存し、保存したときに生成される画像のuriをセットして投稿します。

public void twiPostWithBitmap(){
    //画像を保存
    try {
        InputStream is = getResources().getAssets().open("type"+bodyType + ".png");
        Bitmap bm = BitmapFactory.decodeStream(is);
        ContentResolver cr = getContentResolver();
        Uri imageuri = addImageAsApplication(cr,bm);
        Intent intent = new Intent(); 
        intent.setAction(Intent.ACTION_SEND);
        //intent.setClassName("com.twitter.android","com.twitter.android.PostActivity");
        intent.setType("image/png");
        intent.putExtra(Intent.EXTRA_STREAM, imageuri);
        intent.putExtra(Intent.EXTRA_TEXT, "投稿したいテキスト");
        startActivity(intent);
    } catch (IOException e) {
            /* 例外処理 */
    }
}

//画像保存
private static final String TAG = "ImageManager";  
private static final String APPLICATION_NAME = "PATOM";  
private static final Uri IMAGE_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  
private static final String PATH = Environment.getExternalStorageDirectory().toString() + "/" + APPLICATION_NAME;  

public static Uri addImageAsApplication(ContentResolver cr, Bitmap bitmap) {  
    long dateTaken = System.currentTimeMillis();  
    String name = createName(dateTaken) + ".jpg";  
    return addImageAsApplication(cr, name, dateTaken, PATH, name, bitmap, null);  
}  

private static String createName(long dateTaken) {  
    return DateFormat.format("yyyy-MM-dd_kk.mm.ss", dateTaken).toString();  
} 

public static Uri addImageAsApplication(ContentResolver cr, String name,  
        long dateTaken, String directory,  
        String filename, Bitmap source, byte[] jpegData) {
    OutputStream outputStream = null;  
    String filePath = directory + "/" + filename;  
    try {  
        File dir = new File(directory);  
        if (!dir.exists()) {  
            dir.mkdirs();  
            Log.d(TAG, dir.toString() + " create");  
        }  
        File file = new File(directory, filename);  
        if (file.createNewFile()) {  
            outputStream = new FileOutputStream(file);  
            if (source != null) {  
                source.compress(CompressFormat.JPEG, 75, outputStream);  
            } else {  
                outputStream.write(jpegData);  
            }  
        }  

    } catch (FileNotFoundException ex) {  
            Log.w(TAG, ex);  
            return null;  
    } catch (IOException ex) {  
        Log.w(TAG, ex);  
        return null;  
    } finally {  
        if (outputStream != null) {  
            try {  
                outputStream.close();  
            } catch (Throwable t) {  
            }  
        }  
    }  

    ContentValues values = new ContentValues(7);  
    values.put(Images.Media.TITLE, name);  
    values.put(Images.Media.DISPLAY_NAME, filename);  
    values.put(Images.Media.DATE_TAKEN, dateTaken);  
    values.put(Images.Media.MIME_TYPE, "image/jpeg");  
    values.put(Images.Media.DATA, filePath);  
    return cr.insert(IMAGE_URI, values);  
}

ContentProviderへの画像アルバムの保存は上記のとおりContentResolverを使って保存します。そのときにuriが取得できますのでそれをintentに渡しています。

ただたんに画像をtwitterに投稿するだけなのですが結構コードが増えるのが難点ですね。