2013年10月19日土曜日

Androidならではのアプリ開発講座(アプリ間連携編)

いきなりですがAndroidアプリ開発講座です!
いつまで続くかは若干怪しいですがよろしくお願いします。

どんな講座?

この講座ではAndroidならではのアプリを作って行く予定です。
つまりiOSなどでは実装できない気がするようなアプリを作ります。
(Androidらしいデザインのアプリを期待した人すいません)
危ないアプリという意味ではなくAndroidの自由度の高さを利用したアプリということです。

扱う内容についての説明をしてから簡単なアプリを実際に作ってみる流れの予定です。
Androidアプリの開発環境構築、基本的なJavaの知識については取り扱いません。

第一回:アプリ間連携を使ってみる

Androidといえば強力なアプリ間連携ですね!
うまくアプリ間連携を利用すればちょっとしたアプリでも便利になったりするものです。

よくあるアプリ間連携

アプリ間連携は多分Androidを使っている人ならだれでも経験しているはずです。

URLをクリックしてブラウザを開く

一番ありそうなのはこれです。
メールやSNSでURLをクリックしてそのままブラウザを開くというのは当然のようにやると思いますが、これもアプリ間連携です。
この操作はiOSでも出来ますが、あちらではブラウザを内蔵しているアプリが比較的多いような気がします。
Androidでは大抵外部のブラウザ任せですね。
自分で何かアプリを作ったとしてもWebページを開く部分はブラウザに任せられるので楽ちんです。

ブラウザで見ているページをSNSに共有する

大抵のブラウザには共有ボタンがあり、インストールされている各種アプリと連携出来ます。
SNSへの投稿やメモ帳への保存など様々な用途に使用できます。


このようにAndroidでは自分のアプリの担当以外はすべて他のアプリに任せます。
うまく使うことで単純なアプリでも高機能なものにすることが出来ます。

Intentによる画面遷移

AndroidではIntentというものを使用して画面遷移を行います。
Intentには明示的Intentと暗黙的Intentの2種類があり、アプリ間連携に使用するのは後者です。

明示的Intent

明示的Intentは基本的にアプリ内での画面遷移に使用します。
使い方は大体こんな感じで遷移先のActivityを指定します。

startActivity(new Intent(this, NextActivity.class));

暗黙的Intent

暗黙的Intentでは動作(Action)とデータ(必要なら)を指定して画面遷移を行います。
あとはOSが勝手に対応しているアプリを勝手に表示してくれます。

例えばブラウザでGoogleを開きたければこんなコードになります。
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/")));
もし対応しているアプリ(上の例ではブラウザ)が複数存在する場合は選択画面になりますが、ユーザーがデフォルトアプリを設定していればそちらが優先されます。
逆に一つも存在しない場合は例外が発生するので注意が必要です。

アプリを必ず選択させるChooser

テキストの共有などではデフォルトアプリを指定されたくない(必ずアプリを選択させたい)場合があると思います。
そんなときはChooserを使います。

使い方は簡単で、Intentを作ってからIntent.createChooserするだけ!
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setExtra(Intent.EXTRA_TEXT, "Hogehoge");

startActivity(Intent.createChooser(intent, "ChooserTitle");
こうすることで必ずアプリ選択画面が出ます。
また、もし対応するアプリが無くてもエラーにならないので楽ちんです。

Intentを中継するアプリを作ってみる

Intentをうまく使うことで簡単かつちょっと便利なアプリが簡単に作れるようになります。

例えば画像をメールで送信するとき通常は

画像ビューワ→メールソフト

となりますが、これを

画像ビューワ→画像を圧縮→メールソフト

のように変更できれば便利になります。
(このようなアプリは既にマーケットにいくつかあります)

私が少し前に作ったPxIntentも似たようなアプリです。
ブラウザ用Intentを受け取れないPixiv公式アプリのために中身を少し変えてIntentを送っているだけです。

今回作るアプリ

上で紹介した画像を扱うようなアプリは難しいので今回は作りません。
代わりに検索エンジンを変更するアプリを作ります。

実はAndroid 3.0以降ではブラウザで選択したテキストをそのままウェブ検索することが出来ます。


通常はGoogleで検索されるのですが、今回はここをBing(マイクロソフト提供の検索エンジン)に変更します。

Intentを受け取る

ブラウザからウェブ検索を選んだ場合、Actionがandroid.intent.action.WEB_SEARCHな暗黙的Intentが使用されます。
つまり、このIntentを受け取ってあれこれすればいいわけです。

アプリでIntentを受け取るにはAndroidManifest.xmlにIntentFilterを定義します。
<activity android:name="MainActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar">
    <intent-filter>
        <action android:name="android.intent.action.WEB_SEARCH"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>
Categoryにandroid.intent.category.DEFAULTが指定されていますが、これは暗黙的インテントを受け取るときに必要になるものです。

Intentのデータを取り出す

ウェブ検索のIntentから検索ワードを取り出すには以下のようにします。
Intent intent = getIntent();

//検索テキストの取得
String searchText = intent.getStringExtra(SearchManager.QUERY);
ウェブ検索以外のIntentを扱う場合も似たような方法でデータを取り出すことが出来ます。
一般的な共有(android.intent.action.SEND)の場合はIntent.EXTRA_TEXTを指定することででテキストが取り出せます。

ブラウザを起動する

検索キーワードがわかればURLは決まるので、あとはブラウザを起動するだけです。
String SEARCH_URL = "http://www.bing.com/search?q=";

//検索用URL
Uri searchUri = Uri.parse(SEARCH_URL + Uri.encode(searchText));

//ブラウザ起動用インテント
Intent browserIntent = new Intent(Intent.ACTION_VIEW, searchUri);
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(browserIntent);

アプリ完成

一部処理は省いていますが、大体こんな感じでアプリ完成です。
全部合わせてもたった数十行なので簡単ですね。

アプリをインストールした状態でウェブ検索を行うとこのようにアプリ選択画面になります。
(Dolphin Browserは今回のアプリとは関係ありません)


ここで自分で作ったアプリを選ぶことでBing検索ができるはずです。
単純なアプリですが、実用性もありますね。

※当然ですが、このアプリで変更されるのは文字選択からのウェブ検索のみでアドレスバーからの検索はブラウザ側の設定に依存します。

さらなる応用

Intentにはまだまだ種類があるので、自分が普段使っている機能を便利になるようなアプリを作ってみましょう。
Android側で定義されているAction一覧は公式サイトにあるので確認してください。

"Intent | Android Developers"

ダウンロード

今回作ったアプリのソースとapkを置いておきます。
もっと詳しくソースが見たい!という人はソースを、プログラミングは嫌だけどBingで検索したい!という人はapkをダウンロードして下さい。



次回予告

Intentの続きとして面倒な処理を他のアプリに丸投げ!というのをやる予定。
ただしいつになるかは不明…

0 件のコメント:

コメントを投稿