SUGARSPOT

Androidアプリ、WEBサービス開発の SUGARSPOT  |Androidブログ「Androidのことなんだけど」もやってます

2011年12月8日木曜日

[Android]ブラウザからアプリを起動する際のメモ

ブラウザからアプリを起動する際のschemeについてメモ

まず、基本的なところから書いておくと起動したいアプリのapplicationにintent-filterを設定する
この時、ブラウザからの呼び出しに呼応するように
<category android:name="android.intent.category.BROWSABLE"/>
の記述が必要

次に、schemeの指定について
ブラウザから<a href="hoge://">ほげ起動</a>のような指定で起動させたい場合は、次のように指定する
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="hoge"/>
</intent-filter>


でも、これだと
<a href="hoge://fuga">
<a href="hoge://hidebu">
でも起動しちゃうので、もう少し条件をつけて<a href="hoge://fuga">の場合だけ起動するようにする
この場合は、hostを指定すればOK
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="hoge" android:host="fuga" />
</intent-filter>


これだけでもほぼ大丈夫だけど、さらに分岐させたい場合
例えば
<a href="hoge://fuga/init">で初期処理をして起動
<a href="hoge://fuga/restart">で前回の続きから起動
とかしたい場合は、pathを指定してpathを判別してから処理を振り分けるなどすれば良い
intent-filterの指定はこんな感じ
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="hoge" android:host="fuga" android:path="/init"/>
</intent-filter>


ここで忘れちゃいけないのが、pathは
android:path="init"
ではなく
android:path="/init"
であること。"/"を忘れないように!

まとめると、URLが <a href="scheme://host/path">といった感じになるので、それに合わせてintent-filterを指定すればOK
他にも色々と指定できるパラメータがあるので、そのあたりは公式なドキュメントをどうぞ

http://developer.android.com/guide/topics/manifest/data-element.html

2011年12月2日金曜日

[Android]UNEXPECTED TOP-LEVEL EXCEPTIONでビルドできない

外部ライブラリを使用している古いアプリ(ADT14以前?)をビルドしようとしたら、次のようなエラーがでた

 [2011-12-02 20:03:16 - xxxxxx] Dx
UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Lxxx/xxxx/xxx/XxxxxxxActivity;
どうやら、ライブラリを重複して登録しようとしてエラーが発生しているようだ

そこで、私がとった対策としては、.classpathのファイルを開いて外部ライブラリの参照を消して再度ビルド。それで問題なく動くようになりました

※ライブラリの参照やら、配置やらを色々と変えて確認したり、色々な方法を試したあとで上記方法を作業しました。ですので、上記方法だけで本当に解消するのか保障はできませんが、いまは再現させられない状態なので、ひとまず参考程度と思ってください