10

ユーザーが電子メール アドレスを持つ連絡先の中から連絡先を選択できるようにしようとしています。これは、適切なボタンをクリックしたときに実行されるコードです。

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);

これは自分の電話では問題なく機能していますが、アプリをリリースした後、一部のユーザーで次の例外が発生しています。

0       android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=content://com.android.contacts/data/emails }
1   at  android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1638)
2   at  android.app.Instrumentation.execStartActivity(Instrumentation.java:1510)
3   at  android.app.Activity.startActivityForResult(Activity.java:3244)
4   at  com.fitrocket.android.InviteMethodSelectionAct.onClick(InviteMethodSelectionAct.java:59)
5   at  android.view.View.performClick(View.java:3549)
6   at  android.view.View$PerformClick.run(View.java:14400)
7   at  android.os.Handler.handleCallback(Handler.java:605)
8   at  android.os.Handler.dispatchMessage(Handler.java:92)
9   at  android.os.Looper.loop(Looper.java:154)
10  at  android.app.ActivityThread.main(ActivityThread.java:4945)
11  at  java.lang.reflect.Method.invokeNative(Native Method)
12  at  java.lang.reflect.Method.invoke(Method.java:511)
13  at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
14  at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
15  at  dalvik.system.NativeStart.main(Native Method)

私はこれを自分で再現できなかったので、誰かが問題が何であるかを教えてくれませんか?

4

2 に答える 2

3

私が見る限りの問題は、実行したいアクションとデータの組み合わせに応答できるアプリケーションがすべてのユーザーにインストールされていると想定していることです。あなたのケースでは仮定が成り立つ可能性がありますが、一部のユーザーはシステムを台無しにすることを選択し、起動したアクションに応答できない連絡先を管理するアプリケーションをインストールした可能性があります. 理由が何であれ、あなたの に応答するアプリケーションの可用性を常に確認する必要がありますIntent

public static boolean isIntentAvailable(Context context, String action)
{
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);
    List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

このコードはtrue、パラメーターとして指定したアプリケーションが少なくとも 1 つ利用可能な場合に返されactionます。上記の問題に関する公式ドキュメントについては、Intents と Intent Filtersを参照してください。

さて、これで問題ありませんが、何が解決するのでしょうか? まず、ユーザーのアプリケーションはクラッシュしません。次に、できると思っていたように進められないという事実から回復する必要があります。通常、ユーザーにメッセージを表示し、機能を提供することがわかっているアプリケーションをインストールするようユーザーに提案すると、かなりうまく機能します。また、すべてのユーザーが何を必要としているのかが明確になるように、ドキュメントにこの依存関係を記載します。

更新:あなたが見るためのより多くのソース:

後者は、アプリケーションがクラッシュする理由に関する正確な説明を保持していると思います。私は引用します:

"Caution: If you invoke an intent and there is no app available on the device that can handle the intent, your app will crash."

そのセクションには、問題の対処方法に関する詳細情報も含まれています。

于 2013-08-09T09:29:27.597 に答える