Intentでアプリ内画像をtwitterとかに送る

ブログの最初の方はあまりに書くことがなかったので
メモ用にと色々書き記してましたが
一周回って書くことが無くなって来たので今後色々書き連ねて行こうと思います。
同じような事で悩んでる人用にも。













文字は今まで送ってたけど画像も送りたい!ってことで
色々調べたけど全然出てこない。SDカードに入れてから、とか
そもそもアプリ内画像じゃなくて自分で撮った写真とかしか出てこない。

探し方も悪かったんでしょうが、こんなんに2日もかかってしまいました。
多分きっと同じようなことで困る人が出てくる日が来るでしょうし
忘れた時のメモ用も兼ねて書いときます。






まずは、Assetsとかに入ってる画像をBitmapに変換します。



InputStream is = null;
AssetManager am = getBaseActivity().getResources().getAssets();
try {
    is = am.open("gfx/img.png");
}
catch (IOException e) {
    e.printStackTrace();
}
Bitmap bm = BitmapFactory.decodeStream(is);




getResource().getAssets();でAssetManagerを取得。
Andengineを教本テンプレのまま使ってるので、普通の人はgetBaseActivity()は要りません。

InputStreamにファイルのパスをぶっ込みます。
isに中身が入ったらBitmapFactory.decodeStreamにいれて、Bitmapにします。


とりあえずこれでAssetから指定の画像を探してBitmapにしました。




String imgname = "img_";
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss");
imgname += sdf.format(date);
imgname += ".png";





保存するときの名前を決めます。
なんでもいいっちゃなんでもいいんですが、
なんどもこの処理を行う時毎回同じ名前だと前の画像が残ってしまう時があるので
確実に違う名前にするために今現在の日付時刻を入れます。
pngで保存するので拡張子はpngにしました。

保存名はこれで「img_20150112225811.png」みたいな感じになります。

このまますぐintentで送信するし、
imgnameに保存してあるのでいちいち覚えておく必要はありませんが
よそで呼び出す必要があるならどっかに保存しといてください。



先ほどのBitmapを今の保存名で「内部ストレージ」に保存します。
アプリごとに保存できる領域みたいなもんです。
これは探してた時に出てきた関数を拝借したいと思います。
こちらから拝借したものを取り急ぎクラスにしました。




public static final boolean savePngLocalStorage(String fileName, Bitmap bitmap, Context context) throws IOException {
    OutputStream os = null;
    Bitmap tmp = null;
    try {
        os = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
        tmp = bitmap.copy(Config.ARGB_8888, true);
        return tmp.compress(Bitmap.CompressFormat.PNG, 100, os);
    }
    finally {
         if (tmp != null) {
            tmp.recycle();
            tmp = null;
        }
        try {
            os.close();
        }
        catch (Exception e) {
        }
    }
}




 
FC2ブログにソースコード貼りづら!
インデントの調整をしないといけませんな。

まぁこれで、内部ストレージに書きこめるようになりました。
読み込む方は今回必要ありません。

リンク先では
os = context.openFileOutput(fileName, Context.MODE_PRIVATE);
になっていますが、これだとツイッター側から読めないので
MODE_WORLD_READABLEにします。




try {
    LocalDataManage.savePngLocalStorage(imgname, bm, getBaseActivity());
}
catch (IOException e) {
    e.printStackTrace();
}





書き込みました。
これで内部ストレージ内にさっきの保存名で保存されました。
パスは
「data/data/[パッケージ名]/files/[imgname]」
です。



Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");




Intentをセット。
テキストを入れるならこのあと適当に
String s = "aaa";
intent.putExtra(Intent.EXTRA_TEXT,s);
とかやってください。




intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("data/data/[パッケージ名]/files/"+imgname));




Uriにさっきのパスを入れることで、これで画像を送れるようになりました。
パスは事前にStringで作っといてもいいです。
こんなのに2日もかけちまったよ!

開発中のアレで申し訳ないですが、こんな感じです。やったね。

bloghf0112_0.png



ついでにツイッター限定にするなら、

PackageManager pm = getBaseActivity().getPackageManager();
List activityList = pm.queryIntentActivities(intent, 0);
int len = activityList.size();
for (int i = 0; i < len; i++){
    ResolveInfo app = (ResolveInfo) activityList.get(i);
    if ((app.activityInfo.name.contains("twitter"))) {
        ActivityInfo activity = app.activityInfo;
        ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        intent.setComponent(name);
        getBaseActivity().startActivity(intent);
        break;
    }
}

とやると確実にツイッターで開いてくれます。
これはこちらを参考にさせていただきました。


なんとか出来ました。

しかし、いざツイッターに投稿してみると
なんかものすごい画質が悪くなってます。
Bitmapの変換過程で何か欠落が…!?


と思いきやAndroidの公式ツイッタークライアントは
「画像を強制的にjpgにして投稿する」という仕様でした。おい!







いざ書き終えてからなんですが、
この記事は一週間前に投稿する予定だったので
今はこんな感じになってます。

bloghf0120_0.png


この画像と
bloghf0120_1.png

この画像を
bloghf0120_2.png


アプリ内で合成して一時保存、それを投稿することに成功しました。
やープログラムいじってこういうことできるようになると気分がいいですね!
もうアプリ作ってる人からしたら常識なんでしょうけど、色々出来るようになるのは嬉しいです。

これも一応そのうち記事にします。どうせ書くことないので。

テーマ : ゲーム製作 関連
ジャンル : ゲーム

コメントの投稿

Secret

プロフィール

いすぃ

Author:いすぃ
ゲームを作ってたりゲームしてたり何もしてなかったりしてます

お仕事あれば請け負います。
ゲーム作ってみたい!とか初歩からプログラムやってみたい!って人もご一報ください。

ゲーム面白かったよ!
今後も応援するよ!などなどの意味で下記から心ばかりの支援をしていただけると本当に助かります。
Enty


twitter
ニコニココミュ
pixiv

最新記事
カテゴリ
最新コメント
最新トラックバック
月別アーカイブ
kaunta-
検索フォーム
リンク
スポンサードリンク