ブラウザの「ページを共有」から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(送信側アプリ)では、受信側アプリのタグ内のcategory、mimeType、actionの3つを、システム側で判断させて、起動するアプリを決めています。
今回は、送信側(Ex.)1)で、actionACTION_SENDを、mimeTypetext/plainをそれぞれ設定していますので、受信側でも同様に、actionにACTION_SEND、mimeTypeにtext/plainを設定しています。

ちなみに、暗黙的Intentを用いて画像のギャラリーアプリケーションを呼び出したい場合は、actionACTION_PICKmimeTypeimage/*を設定することで呼びだすことができました。

では、受信した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間だけでなく、アプリケーション間でのオブジェクトの受け渡しを行うことが可能です。