2012年4月20日金曜日

startActivity()実行時のSecurityExceptionに悩まされる

タスク切り替えを行うAndroidアプリを公開しているのだが、
以前からどうしても回避できない問題が1つ残っていた。
それは、他のアプリを呼び出す際にstartActivity()で
SecurityExceptionが発生してしまう問題である。
ググると同様の報告が結構出てくる。(例えば下記リンク)

■ startActivity() crash...
https://groups.google.com/d/topic/android-beginners/iwxogql9q-Y/discussion

Logcatに「SecurityException ~ reqires <パーミッション名>」と
出力されていれば話は単純なのだが、「requires null」となっている場合は
何が問題点なのか全く分からない。
そこで色々と調べた結果を簡単にまとめておく。

【概要】
以下に簡単な処理の流れを示す。

・ActivityManager#getRecentTasksからタスク履歴を取得する。
(マニフェストファイルに「android.permission.GET_TASKS」を設定)
・GridViewのAdapterにアプリケーションアイコンと名称を設定する。
・アイテムをクリックするとstartActivity()を実行する。
・特定のアプリケーションでSecurityExceptionが発生する。
Logcatには「requires null」と出力される。
(具体的に発生したアプリは「jigtwi」など)

【予想し得る原因】
(1)自身のアプリのマニフェストファイルでActivityを2重登録している。
(2)呼び出し先アプリのActivityに「android:exported="false"」が設定されている。
(3)サードパーティアプリから呼び出し不可のアプリを呼び出している。
(4)実はパーミッションが不足している。

【調査】
・予想(1)について
マニフェストファイルを確認したが2重登録していなかったため該当せず。

・予想(2)について
Androidアプリのアストロファイルマネージャを使ってアプリをバックアップし、
中身のマニフェストファイルをデコードして確認したが
「android:exported="false"」が設定されていなかったため該当せず。

・予想(3)について
HOMEボタン長押しでAndroid標準のタスク切り替えアプリを起動して、
アプリを実行するとSecurityExceptionが発生しない。

Androidの最新ソースコードからRecentApplicationsDialog.javaの
reloadButtons()の処理を確認してみたが、インテントのフラグ設定などに
問題は無さそうだった。
サードパーティアプリからサードパーティアプリを呼び出せない事は
考えにくいため該当せず。

・予想(4)について
試しに某競合アプリとの差異を比較してみた所、下記のパーミッションが
自身のアプリには存在していなかった。
「android.permission.REORDER_TASKS」

リファレンスを確認すると下記のように記載してある。
「Allows an application to change the Z-order of tasks」
アプリケーションのZオーダーの順序を変更可能にするらしい。

まさかと思ってマニフェストファイルに追加してみたら…
問題なくアプリを起動する事出来た!
一体何故これで…という思いしかないので、時間がある時に
調べてみようと思う。

【結果】
startActivity()を実行してSecurityExceptionが発生した場合は
「android.permission.REORDER_TASKS」のパーミッションを追加する。
もし追加済みであるならばインテントのフラグ設定を見直す。


【2012/4/21 追記】
「なまず速報:詳細」は起動出来なかった…。
上記対策でも起動できないタスクが存在するようだ。

【2012/6/17 追記】
上記パーミッションおよびランチャーとなるActivityで起動するように
修正した所、SecurityExceptionが発生する事がなくなった。
下記リンクにサンプルコードを記載したので参考にして欲しい。

■ 続:startActivity()実行時のSecurityExceptionに悩まされる
http://hascha.blogspot.jp/2012/06/startactivitysecurityexception.html

0 件のコメント:

コメントを投稿