長文になりますが、ご容赦を。
Androidプログラミングでの技術的質問です。
Intent の startActivity(intent) で端末にインストールされているアプリの
どれかをを起動しようとしているのですが、起動できないアプリがあります。
(エミュレータ<API7> であれば、電話とか連絡先)
エミュレータ<API7> で起動できないときのエラーメッセージは
----------------------------
android.process.acoreが予期せ
ず停止しました。 やり直してく
ださい。
----------------------------
です。
そしてこのエラーは、
try{
startIntent();
}catch(Exception e){
}
で捉えることが出来ませんでした。
○うまく起動できるアプリ
アラーム
ブラウザ
カメラ(アプリ自身は異常動作)
メール
ギャラリー
マップ
メッセージ
音楽
設定
電卓
Spare Parts
Gestures Builder
API Demos
Custom Locale
Dev Tools
○エラーが出て起動できないアプリ
電話
連絡先
※ トップ画面から、アプリアイコンの「電話」や「連絡先」をタップする
方法であればそれぞれのアプリを起動できます。
つまり、アプリケーション自体は正常です。壊れていません。
エミュレータ<API7>の「連絡先」アプリをIntent で実行した時のログです。 抜粋
------------------------------------------------------------------------------------------------------------------
: INFO/ActivityManager(59): Starting activity: Intent { cmp=com.android.contacts/.DialtactsContactsEntryActivity }
: INFO/ActivityManager(59): Process com.android.development (pid 2675) has died.
: INFO/ContactsListActivity(2687): Called with action: com.android.contacts.action.LIST_DEFAULT
: WARN/dalvikvm(2687): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
: ERROR/AndroidRuntime(2687): Uncaught handler: thread main exiting due to uncaught exception
: ERROR/AndroidRuntime(2687): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.contacts/com.android.contacts.DialtactsActivity}: java.lang.NullPointerException
: ERROR/AndroidRuntime(2687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
------------------------------------------------------------------------------------------------------------------
startActivity() で、開始した Activity と実行時例外を起こしている
Activity とが異なります。
開始した Activity .DialtactsContactsEntryActivity
例外の Activity .DialtactsActivity
「.DialtactsActivity」は電話アプリの Activity ですので、「電話」アプリ
を起動してみました。
エミュレータ<API7>の「電話」アプリをIntent で実行した時のログです。 抜粋
------------------------------------------------------------------------------------------------------------------
: INFO/ActivityManager(59): Starting activity: Intent { cmp=com.android.contacts/.DialtactsActivity }
: INFO/FundedDataDisk(344): refund()
: INFO/DeviceStorageMonitorService(344): checkRefund
: INFO/DeviceStorageMonitorService(344): checkSeriouslyLow() : false
: INFO/DeviceStorageMonitorService(344): Fund data available.
: WARN/dalvikvm(2701): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
: ERROR/AndroidRuntime(2701): Uncaught handler: thread main exiting due to uncaught exception
: ERROR/AndroidRuntime(2701): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.contacts/com.android.contacts.DialtactsActivity}: java.lang.NullPointerException
: ERROR/AndroidRuntime(2701): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
------------------------------------------------------------------------------------------------------------------
結局、電話アプリで例外が発生しているので、スルーされて「連絡先」でも
例外となっているようです。
実機(IS11CA)で「電話」アプリをIntent で実行した時のログです。 抜粋
------------------------------------------------------------------------------------------------------------------
: INFO/ActivityManager(344): Starting: Intent { cmp=com.android.contacts/.DialtactsActivity } from pid 21076
: WARN/ActivityManager(344): Unable to start service Intent { act=com.nuance.android.vsuite.vsapi.IVSAPI }: not found
: INFO/SocialContacts(21093): SocialContactsActivity -> onCreate!
: INFO/SocialContacts(21093): SocialContactsActivity -> onTabChanged!
: WARN/dalvikvm(21093): threadid=1: thread exiting with uncaught exception (group=0x40015560)
: ERROR/AndroidRuntime(21093): FATAL EXCEPTION: main
: ERROR/AndroidRuntime(21093): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.contacts/com.android.contacts.SocialContactsActivity}: java.lang.NullPointerException
------------------------------------------------------------------------------------------------------------------
なぜ「電話」アプリを私のアプリから Intent で起動できないのでしょうか。
わかる方やヒントをお持ちの方はアドバイスください。
必要であれば、ソースも公開します。
なお、ここで起動しているアプリ(Activity)は、Manifest には記述されていません。
後藤です.お疲れ様です.
Googleにて「Android intent 電話 連絡先」として検索すると
幾つか事例がありますので,その成功例の記述を試してみては
いかがでしょう?
※)実は,当初,セキュリティの都合でアプリからのアクセスが
制限されているのかな?と思ったのですけど,検索してみると
いろいろありますので,セキュリティではないのかも?です.
連絡先のアクセスについて,HPに以下のような記述がありますね.
いかがでしょう?
http://blog.livedoor.jp/gphonebook-development/archives/51726307.html
======================================================================
まず、AndroidManifest.xmlに
<uses-permission android:name="android.permission.READ_CONTACTS"/>
を追加します。
======================================================================
さっそくのアドバイスありがとうございます。
Fri, 04 Nov 2011 11:55:29 +0900 の
Re: [android-group-japan-oita:667] アプリの起動
に関するメールについてのお返事です。
Gotoh> Googleにて「Android intent 電話 連絡先」として検索すると
Gotoh> 幾つか事例がありますので,その成功例の記述を試してみては
Gotoh> いかがでしょう?
検索して、数件を見てみましたがいずれも「電話を掛ける」アプリを作る場
合には、とても役に立つ情報ですが、ちょっと私のやりたいこととは異なりま
す。
私のやりたいことは、アプリアイコン一覧画面(トップ画面)で、アプリのア
イコンをタップしたと同じ状況を作り出したいのです。
「アラーム」アイコンをタップしたら「アラーム」アプリが起動する。
「ブラウザ」アイコンをタップしたら「ブラウザ」アプリが起動する。
同じように
「電話」アイコンをタップしたら「電話」アプリが起動します。
こういう状況と同じように、Intent を使って、統一したやり方で
「アラーム」や「ブラウザ」や「電話」を起動したいのです。
「電話」だけを特別扱いせずに統一した方法で起動したいのです。
私のアプリでは、アプリ一覧を表示し、その中からユーザが選択したアプリ
を実行するようにしたいのです。何をユーザーが選択するかはプログラミング
時点ではわかりません。
どうしても Intent で起動できないアプリがあるのでしたら、それをプログ
ラムで判別するやり方がわかりさえすればアプリ一覧表示に表示しないという
逃げ方もできます。
また、ユーザーが実行時に起動しようとして起動できなかったことがプログ
ラムで判別できれば、別の逃げ方(メッセージ表示等)ができると思います。
しかし、今のところ例外キャッチもできません。
後藤です.お疲れ様です.
> 合には、とても役に立つ情報ですが、ちょっと私のやりたいこととは異なりま
補足情報をありがとうございます.
若干意図とは異なるとのこと,了解です.
こちらでももう少し調べてみようと思います.
取り急ぎ.
Fri, 4 Nov 2011 14:11:26 +0900 の
Re: [android-group-japan-oita:671] アプリの起動
に関するメールについてのお返事です。
Kd> インストール済みアプリ一覧を取得できればよろしんでしょうか?
いえ、それはできているんです。
その一覧を表示してユーザーにアプリを選択してもらうのですが、選択した
アプリによっては startIntent() した後、例外が発生するのです。
しかも、その例外を把握しきれない。
Kd> あとエラーのログを見る限りNullPointerでエラーになっているようです。
Kd>
Kd> try catchはOutOfMemoryErrorでさえもキャッチできた覚えがあります。
Kd>
Kd> おそらくキャッチ以外の場所でNullPointerが発生してるっぽいです。
NullPointer は、たぶん(全くの想像ですが)電話番号を渡していないからだ
と思っています。
トップ画面からアイコンタッチで起動できるのですから、電話番号情報を渡
さなくても起動できると思うのですが。
intent=new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(
new ComponentName(packageName,className));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); Fri, 4 Nov 2011 14:33:36 +0900 の
Re: [android-group-japan-oita:673] アプリの起動
に関するメールについてのお返事です。
Kd> いや僕もやったことないのですが、Intentの書き方ではないかと。
Kd>
Kd> ソースコード見つけました。
Kd>
Kd> http://www.saturn.dti.ne.jp/npaka/android/HomeEx/index.html
Kd>
Kd> これの
Kd>
Kd> AppInfo.java
Kd>
Kd> のソースコードな書き方すればうまく起動できるんではないかと。
Kd>
Kd> intent=new Intent(Intent.ACTION_MAIN);
Kd> intent.addCategory(Intent.CATEGORY_LAUNCHER);
Kd> intent.setComponent(
Kd> new ComponentName(packageName,className));
Kd> intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
Kd> |Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
おお、すばらしい。
電話も連絡先も電話帳もナビも今まで起動できなかったアプリが起動できる
ようになりました。
もちろん、今まで起動できていたものも当然起動できます。
エミュレーターでも実機でも。
これこそ僕の知りたかったことでした。
必要な部分だけ抽出すれば
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(packageName, className);
の2行となりました。
私の元のソースとの違いは
Intent intent = new Intent(); // 動作しない
Intent intent = new Intent(Intent.ACTION_MAIN); // 動作する
の違いだけでした。
工藤さん、どうもありがとうございました。
のどの小骨が取れました。
Fri, 4 Nov 2011 15:47:57 +0900 の
Re: [android-group-japan-oita:675] アプリの起動
に関するメールについてのお返事です。
Kd> マニュフェストファイルで、
Kd>
Kd> <intent-filter>
Kd> <action android:name="android.intent.action.MAIN" />
Kd> <category android:name="android.intent.category.LAUNCHER" />
Kd> </intent-filter>
Kd>
Kd> とかいてあるActivityを探しだすからだと思います。
なるほどですね。同様な Intent フィルターが必要だと。
上の行については動的に探すからプログラムでこれを記述する必要があるわ
けですね。
下の行については、インストールアプリ一覧を作るときに、"android.intent.category.LAUNCHER"
でフィルタをかけて抽出したので、このカテゴリのものしか抽出していなくて
ここではわざわざ明示的に
intent.addCategory(Intent.CATEGORY_LAUNCHER);
を書く必要がなかったという寸法ですね。
よくわかりました。
ありがとうございました。