AndroidのIntentからこういうことを実現したい
- TwitterとかSNSを起動
- 画像だけをシェアさせたい
- アプリ連携も不要でやりたい
- とにかく画像単体をシェア
こういうことって不可能だと思ってました。
アプリ連携が必要なのかなと思ったり
でも実は画像単体でやる方法があったので、
IntentからTwitterとかに画像シェアする方法をまとめ。
このページの目次
画像単体をInetntからシェアする手順とコード例
こういった手順で上手くいきました。
手順1.画像保存のパーミッションを付与する
まずパーミッションの追加から
次の2つが必要になります。
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
シェアする時にこの2つが必要でした。
実際にはAndroidManifest.xmlに記入します。
▼ パーミッション追加のコード例
1 2 3 4 5 6 7 |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.example"> <!-- この2つを追加 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
外部ストレージへの読み書きを許可。
でもこれだけで十分なのはAPIレベル23未満の環境のみです。APIレベル23以上からは許可ダイアログの表示も必要になった模様です。詳しくは次記事などを参照
コード自体はなんてことないです。
ほんの数行のコードを追加すればOK
手順2.シェア画像を外部キャッシュに一時保存する
お次はシェアする画像の保存
一時的なものの、やはり画像保存は必要です。
なのでキャッシュディレクトリを利用します。
▼ このようなコードを書いてみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/// このBitmapを画像シェアしたい Bitmap bitmap = null; /// bitmapの作成・初期化... /// 重複しないファイル名を生成 UUID uuid = UUID.randomUUID(); String uuidStr = uuid.toString().replace("-", ""); String tmpFileName = 'tmp_'+uuidStr+".png"; /// キャッシュに一時的に保存 File file = new File( this.getExternalCacheDir(), tmpFileName); FileOutputStream fOut = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); fOut.close(); file.setReadable(true, false); |
何をしているかは細かく解説しません。
大事なのは保存画像(ここではBitmap)を getExternalCacheDir() のキャッシュディレクトリに保存し、画像シェアする時の一時的なファイルを作ってることですね。
あと外部キャッシュは全アプリに解放されてます。だからファイル名を重複させないために UUID を使ってファイル名を生成してます。(関係ありそうな記事 : https://pisuke-code.com/web-create-absolutely-unique-id/)
自分の環境に応じて色々書き換えてください。
手順3.Intent起動してTwitterなどに画像共有
最後にIntentからTwitterとかの外部アプリ起動
ここでは次のようなコードを書いてみました。
▼ 画像共有のIntent起動コード例
1 2 3 4 5 |
final Intent intent = new Intent(Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); intent.setType(mimeType); startActivity(Intent.createChooser(intent, "Share image via")); |
画像共有なので Intent.ACTION_SEND を指定するのは当然。
でも今回は画像単体をシェアしてほしいので intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); のようなパラメーターを渡してます。画像URIを Intent.EXTRA_STREAM に渡すのがポイント
後は特に大事なところはなし。
実際にTwitterで画像単体をシェアした所...
こういう感じでできました。
▼ いつものようにシェア画面が出てくる
▼ 画像単体でツイートできた!
Twitterアプリとかの設定も必要なし
画像シェアのやり方って意外と簡単みたいです。
ここまでのTwitterへの画像シェアの全体コード
全体のコードを載せておきます。
▼ Activity内にて以下コードを追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
try { /// このBitmapを画像シェアしたい Bitmap bitmap = null; /// bitmapの作成・初期化 /// 重複しないファイル名を生成 UUID uuid = UUID.randomUUID(); String uuidStr = uuid.toString().replace("-", ""); String tmpFileName = 'tmp_'+uuidStr+".png"; /// キャッシュに一時的に保存 File file = new File( this.getExternalCacheDir(), tmpFileName); FileOutputStream fOut = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); fOut.flush(); fOut.close(); file.setReadable(true, false); final Intent intent = new Intent(Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); intent.setType(mimeType); startActivity(Intent.createChooser(intent, "Share image via")); } catch (Exception e) { Log.d(TAG, "error : " + e.getMessage()); } |
環境に合わせて書き換えが必要です。そのままコピペではたぶんエラーが出てしまうのでご注意(笑)多分大丈夫だろうと思うけど、念のために付け加えておきます。
以上、AndroidでIntentから画像シェアでした。
もし間違いがあればご指摘を。ではまた(@^^)/~~~