Androidアプリ/日記14
他のアプリと連携してみる
さて、今回はAndroidアプリの肝ともいえるかもしれないIntentを使って、他のアプリとの連携を行ってみます。何をやるかというと、計測した体重を記録する際に、記録を含むテキストを他のアプリで再利用してみます。
SharedPreferencesの読み込み
前回、設定画面を通して、アプリ内共通の設定をSharedPreferencesという仕組みを使って保存しました。・・・PreferenceActivityがほとんどやってくれたので、特にどんな仕組みなのか意識にのぼりませんでしたが。そこで「Twitterに投稿するかどうか?」と「投稿する場合の文言」を設定したので、その設定内容を読み込んでみます。
private SharedPreferences preference;
体重を入力するActivityにSharedPreferencesのインスタンスをプロパティとして持たせます。
preference = PreferenceManager.getDefaultSharedPreferences(this);
Activity.onCreateの中でPreferenceManagerを使ってこのアプリの共通設定を取得します。getDefaultSharedPreferencesメソッドにContextを渡します。
preference.getBoolean("canTwitter", false)
preference.getString("twitFormat", getString(R.string.defaultTweet))
取得した共通設定(SharedPreferences)から設定項目のkeyを指定すると値を取り出します。CheckBoxPreferenceのチェックの有無をgetBooleanで、EditTextPreferenceの文字列はgetStringで取得できます。それぞれ第一引数に設定項目のkeyを、第二引数に設定がなかった場合の初期値を渡しています。
外部アプリの呼び出し
先ほどの設定を確認して、外部アプリを呼び出す場合は新しいIntentを作ってstartActivityで呼び出しています。
if (preference.getBoolean("canTwitter", false)) {
String tweet = preference.getString("twitFormat", getString(R.string.defaultTweet));
tweet = tweet.replace("%w", weightinput.getText().toString())
.replace("%f", fatinput.getText().toString());
Intent twitterIntent = new Intent(Intent.ACTION_SEND);
twitterIntent.setType("text/plain");
twitterIntent.putExtra(Intent.EXTRA_TEXT,tweet);
try {
startActivity(Intent.createChooser(twitterIntent,null));
} catch (ActivityNotFoundException e) {
// 該当するActivityがなかった場合
}
}
テキストの内容に%wが含まれていたら入力された体重値に、%fが含まれていたら入力された体脂肪率値に変換するようにしています。
それでtwitterの公式アプリに値を渡せればいいなと思っていたのですが、どんなIntentを発行するのがいいのかわからなくて、とりあえず上記のコードのようにしておきました。IntentのActionはIntent.ACTION_SENDです。そこに渡す文字列をputExtraで設定し、渡す内容をsetTypeで「text/plain」と設定しました。
この設定したIntentを直接startActivityに渡すのではなく、Intent.createChooserに渡すとIntentを扱うアプリの選択画面を呼び出せるとのことです。
ここまでやって実機で挙動を試してみたら、Twitterの公式アプリはもちろんメーラアプリから何からやたらといっぱいアプリの選択肢がでてきてしまいました。ここから好きなアプリを選んでもらえばいいのでしょうが、あまりにもうっとうしいので何か対策は必要そうです。