明示的intentにて外部アプリケーションを起動する

4,196 views
Skip to first unread message

小山

unread,
Mar 23, 2009, 4:51:49 AM3/23/09
to 日本Androidの会
こんにちは。小山と申します。

先日、Google様にてHackathonに参加してきました。
Toolチームにて加速度センサーに対応したランチャーを作るというものでした。

明示的なIntentを投げた場合にActivity not foundが発生するという現象にずっと悩んでいたのですが、それが解決したのでご報告
します。

String clazz = "com.android.calculator2.Calculator";
Intent intent = new Intent(Intent.ACTION_MAIN);

int idx = clazz.lastIndexOf('.');
String pkg = clazz.substring(0, idx);

intent.setClassName(pkg, clazz);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

IntentのsetClassName(pakage name、 class name)のクラス名にはパッケージ名を含むフルネームが必要である
というだけでした。
FLAG_ACTIVITY_NEW_TASKの追加は必須です。

こちらに同じ現象で悩んでいる人がいたために解決しました。
http://groups.google.com/group/android-beginners/browse_thread/thread/9f67b905ab60d1be

以上です。
チームの皆のメールアドレスがわからないためこちらに投稿させて頂きます。
よろしくお願いいたします。

Makoto Anjo

unread,
Mar 24, 2009, 3:25:44 AM3/24/09
to android-g...@googlegroups.com
安生です。

小山さん、こんにちは。Hackathonおつかれさまでした。

解決の報告ありがとうございます、それとすみませんでした。私としてはこれは既知の問題だったので、
小山さんのチームがここではまっていることに当日気づいていれば解決できたのかと思うと申し訳ないです。

それと、一応HackathonはAndroid-SDK-Japanが主催なのでここに書くよりは
http://groups.google.co.jp/group/android-sdk-japan )に投稿した方がチームの方々にはリーチしやすい
のではないかと思いますよ。メンバー的にはかなりかぶってるので、どっちでも良いかもしれませんが。

それと、チームごとに共有しているドキュメント(Google Docs)があるはずなので、
そこで共有者全員にメールする機能を使えば簡単に連絡がとれると思います。もし共有されていないようでしたら
私に言ってください。



2009/3/23 小山 <koy...@gmail.com>:
--
------------
安生 真
Makoto Anjo
Google API Expert (Android)
tenn...@gmail.com
http://sites.google.com/site/apiexperts/

Kenichi Takahashi

unread,
Mar 24, 2009, 3:58:08 AM3/24/09
to android-g...@googlegroups.com
小山さん、

高橋@{コンテンツWG, エイチアイ}です。

> 解決の報告ありがとうございます、それとすみませんでした。私としてはこれは既知の問題だったので、
> 小山さんのチームがここではまっていることに当日気づいていれば解決できたのかと思うと申し訳ないです。

チューターとして参加していた我々も、
「小山さんのチームと有山さんのチームは大丈夫に違いない」
と勝手に安心してしまっておりました。

私からも申し訳ありません。m_o_m
チューターとして参加したからには全てのテーブルに気を配るべきでした。


2009/03/24 16:25 Makoto Anjo <tenn...@gmail.com>:
--
------------------:-)
Kenichi Takahashi

小山

unread,
Mar 24, 2009, 12:46:25 PM3/24/09
to 日本Androidの会
安生さん、高橋さん、

こんにちは。小山です。

なんか色々とすみません。恐縮です。

あの現場で時間切れの後、皆のプレゼンの間ゴソゴソしていたり、発表最後だったり、発表でなんかゴニョゴニョ言っていたのはこれが原因でした。
(^^;
結果的には何の問題にもなりませんでした。
お気づかいありがとうございます。
あと安生さん、GoogleDocにそのような機能があるのですね。気付きませんでした。
後で試してみます。

なぜsetClassNameかと言えば外部アプリはClassクラスのインスタンスが取れないからでした。
で、別解として今amコマンドのソースをパチってきました。

http://preview.tinyurl.com/dklqhl

124 String str = nextOptionData();
125 ComponentName cn =
ComponentName.unflattenFromString(str);
126 if (cn == null) {
127 System.err.println("Error: Bad component
name: " + str);
128 showUsage();
129 return null;
130 }
131 intent.setComponent(cn);

-nオプションのIntent作成方法です。
nextOptionData()では-nオプションの引数がわたされます。
この方法ですと"com.android.calculator2/.Calculator"といった風に"/"が必要になります。
なぜ"/"なのかはComponentName#unflattenFromStringメソッドの説明に書いてありました。

It splits the string at the first '/', taking the part before as the
package name and the part after as the class name. As a special
convenience (to use, for example, when parsing component names on the
command line), if the '/' is immediately followed by a '.' then the
final class name will be the concatenation of the package name with
the string following the '/'. Thus "com.foo/.Blah" becomes
package="com.foo" class="com.foo.Blah".

この説明を見るとなぜクラス名がフルネームである必要があるのかわかるような気がしますね。
以上です。
失礼いたしました。

On 3月24日, 午後4:58, Kenichi Takahashi <ken1.takaha...@gmail.com> wrote:
> 小山さん、
>
> 高橋@{コンテンツWG, エイチアイ}です。
>
> > 解決の報告ありがとうございます、それとすみませんでした。私としてはこれは既知の問題だったので、
> > 小山さんのチームがここではまっていることに当日気づいていれば解決できたのかと思うと申し訳ないです。
>
> チューターとして参加していた我々も、
> 「小山さんのチームと有山さんのチームは大丈夫に違いない」
> と勝手に安心してしまっておりました。
>
> 私からも申し訳ありません。m_o_m
> チューターとして参加したからには全てのテーブルに気を配るべきでした。
>
> 2009/03/24 16:25 Makoto Anjo <tennet...@gmail.com>:
>
>
>
>
>
>
>
> > 安生です。
>
> > 小山さん、こんにちは。Hackathonおつかれさまでした。
>
> > 解決の報告ありがとうございます、それとすみませんでした。私としてはこれは既知の問題だったので、
> > 小山さんのチームがここではまっていることに当日気づいていれば解決できたのかと思うと申し訳ないです。
>
> > それと、一応HackathonはAndroid-SDK-Japanが主催なのでここに書くよりは
> > (http://groups.google.co.jp/group/android-sdk-japan)に投稿した方がチームの方々にはリーチしやすい
> > のではないかと思いますよ。メンバー的にはかなりかぶってるので、どっちでも良いかもしれませんが。
>
> > それと、チームごとに共有しているドキュメント(Google Docs)があるはずなので、
> > そこで共有者全員にメールする機能を使えば簡単に連絡がとれると思います。もし共有されていないようでしたら
> > 私に言ってください。
>
> > 2009/3/23 小山 <koya...@gmail.com>:
>
> >> こんにちは。小山と申します。
>
> >> 先日、Google様にてHackathonに参加してきました。
> >> Toolチームにて加速度センサーに対応したランチャーを作るというものでした。
>
> >> 明示的なIntentを投げた場合にActivity not foundが発生するという現象にずっと悩んでいたのですが、それが解決したのでご報告
> >> します。
>
> >> String clazz = "com.android.calculator2.Calculator";
> >> Intent intent = new Intent(Intent.ACTION_MAIN);
>
> >> int idx = clazz.lastIndexOf('.');
> >> String pkg = clazz.substring(0, idx);
>
> >> intent.setClassName(pkg, clazz);
> >> intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
>
> >> startActivity(intent);
>
> >> IntentのsetClassName(pakage name、 class name)のクラス名にはパッケージ名を含むフルネームが必要である
> >> というだけでした。
> >> FLAG_ACTIVITY_NEW_TASKの追加は必須です。
>
> >> こちらに同じ現象で悩んでいる人がいたために解決しました。
> >>http://groups.google.com/group/android-beginners/browse_thread/thread...
>
> >> 以上です。
> >> チームの皆のメールアドレスがわからないためこちらに投稿させて頂きます。
> >> よろしくお願いいたします。
>
> > --
> > ------------
> > 安生 真
> > Makoto Anjo
> > Google API Expert (Android)
> > tennet...@gmail.com
Reply all
Reply to author
Forward
0 new messages