ブラウザの「ページを共有」からURLを取り出してみる
Tech Boosterに投稿するつもりだったが、あえなくボツとなってしまったネタ。このままお蔵入りおもったいないので、ここに残す。
Androidでは、暗黙的Intentを用いて、アプリ間でのデータの受け渡しを行うことが可能です。
ここではその一例として、ブラウザのページの共有機能を用いて、ウェブページのURLを取得する方法をご紹介します。
早速、まずはIntentの送信側を見てみましょう。
//Ex.)1
public static final void sharePage(Context c, String title, String url,
Bitmap favicon, Bitmap screenshot) {
Intent send = new Intent(Intent.ACTION_SEND);・・・①
send.setType("text/plain");
send.putExtra(Intent.EXTRA_TEXT, url);・・・②
send.putExtra(Intent.EXTRA_SUBJECT, title);
send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon);
send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot);
try {
c.startActivity(Intent.createChooser(send, c.getString(
R.string.choosertitle_sharevia)));
} catch(android.content.ActivityNotFoundException ex) {
// if no app handles it, do nothing
}
}
こちらは標準ブラウザのソースコードの一部で、メニューから「ページを共有」を選択した際に呼び出される処理です。
②でIntentにURLを格納しているのがわかります。
今回、受信側では、ここで格納されているURLを取り出します。
では、受信側の処理を見てみましょう。
まず、「ページを共有」から起動できるようにするために、AndroidManifest.xmlを以下の記述を追加します。
//Ex.)2
これで、ページを共有の一覧に自分のアプリのアイコンが表示されます。
暗黙的Intent(送信側アプリ)では、受信側アプリの
今回は、送信側(Ex.)1)で、actionにACTION_SENDを、mimeTypeにtext/plainをそれぞれ設定していますので、受信側でも同様に、actionにACTION_SEND、mimeTypeにtext/plainを設定しています。
ちなみに、暗黙的Intentを用いて画像のギャラリーアプリケーションを呼び出したい場合は、actionにACTION_PICK、mimeTypeにimage/*を設定することで呼びだすことができました。
では、受信したintentからURLを取り出します。その前にex.)3を見てみましょう。
//Ex.)3
ここでは、Activityが2つ定義されていますが、アプリケーションを通常起動した場合は「Sample01Activity」に、ページの共有からアプリケーションを起動した場合は「Sample02Activity」が、それぞれ起動するようになっています。
によって、どのタイミングで起動させたいかを定義しているのです。
さて、今回はページの共有からの暗黙的Intentによる呼び出しなので、Sample02Activityが起動します。このActivity内でIntentからURLを取り出し、取り出したURLをTextViewで表示してみます。
以下がその一部です。
//Ex.)4
if(Intent.ACTION_SEND.equals(getIntent().getAction())){
//URLを取り出す
CharSequence uri = getIntent().getExtras().getCharSequence(Intent.EXTRA_TEXT); ・・・①
if(uri != null){
TextView textView = new TextView(this);
textView.setText((String)uri);・・・②
layout.addView(textView);
}
}
①でEXTRA_TEXTをキーにURLを取得しています。ここで取得したURLはオブジェクト型なので、今回はTextViewで文字列として表示するため、②でString型でキャストしています。
今回は例として、「ブラウザアプリ」からページを共有機能を用い、「自作アプリケーション」でURLを受け取ってみました。このように、暗黙的Intentを用いれば、同アプリ内でのActivity間だけでなく、アプリケーション間でのオブジェクトの受け渡しを行うことが可能です。