【问题标题】:Problem with opening contacts - Android打开联系人的问题 - Android
【发布时间】:2025-12-06 21:15:01
【问题描述】:

我在我的应用中添加了一项功能,可以打开联系人列表。 问题是一些用户报告说,当他们尝试使用该应用程序时,该应用程序崩溃了。 该功能似乎适用于大多数人(包括我,使用 Nexus S)。

这是我用来打开联系人的代码 -

    call_friend.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Intent i = new Intent();
            i.setComponent(new ComponentName("com.android.contacts", "com.android.contacts.DialtactsContactsEntryActivity"));
            i.setAction("android.intent.action.MAIN");
            i.addCategory("android.intent.category.LAUNCHER");
            i.addCategory("android.intent.category.DEFAULT");
            startActivity(i);
        }
    }); 

这是崩溃的日志 -

            android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.contacts/com.android.contacts.DialtactsContactsEntryActivity}; have you declared this activity in your AndroidManifest.xml?
            at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
            at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
            at android.app.Activity.startActivityForResult(Activity.java:2817)
            at android.app.Activity.startActivity(Activity.java:2923)
            at can.you.drive.dont_drive$1.onClick(dont_drive.java:75)
            at android.view.View.performClick(View.java:2465)
            at android.view.View$PerformClick.run(View.java:8907)
            at android.os.Handler.handleCallback(Handler.java:587)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4627)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
            at dalvik.system.NativeStart.main(Native Method)

我不知道是什么原因造成的。 谢谢!

【问题讨论】:

  • 受影响的用户不会碰巧使用平板电脑,对吗?如果不是,是哪个操作系统版本?
  • 我还想在 Erik 的问题中添加“哪个设备?”;代码似乎假设标准的 Android 联系人应用程序将安装在设备上,但情况可能并非总是如此(例如,如果制造商已将标准应用程序替换为他们自己的应用程序)
  • 我真的对它一无所知,除了它发生在 Galaxy S 上(因为我自己尝试过)。我没有关于操作系统版本或其他设备的任何信息。

标签: android android-intent android-contacts


【解决方案1】:

使用隐式 Intent 启动联系人活动 - 即告诉操作系统您要查看联系人列表,它会找出要使用的正确活动(如果安装了多个联系人应用程序,则会提示用户) .以下 Intent 可以解决问题:

Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse("content://contacts/people/"));
startActivity(i);

尽可能避免使用显式 Intent... 太多不同的设备无法绝对确定某个特定的包/活动将始终存在。

【讨论】:

    【解决方案2】:

    由于您在上面指出 Galaxy S 遇到了问题,您应该查看看起来像是 Galaxy S 上联系人应用程序的 Android Manifest here。看看这个,没有 DialtactsContactsEntry Activity,它可以解释你所看到的。根据清单以及另一个论坛上的message,在这种情况下您需要使用的是“com.sec.android.app.contacts.PhoneBookTopMenuActivity”。这仅涵盖 Galaxy S 的情况 - 其他拥有自己替换联系人的设备可能会有完全不同的东西,并且无法保证 Galaxy 系列的下一版本不会选择更改这一点。

    当然(我相信这对你来说不是新闻),整个练习强调了使用未记录的 API/应用程序功能的固有问题......更好的方法是使用类似 ErikR 在他的回答中描述的东西.

    【讨论】:

      【解决方案3】:

      我认为这是因为 Android 更改了此 App 的编号。如果我使用

      ,我也会遇到类似的问题
      intent.setClassName("com.android.contacts","com.android.contacts.DialtactsActivity");
      

      它可以在 Android 4.1 上运行,但不能在 4.4 上运行。在 4.4 中我不得不像这样更改它

      intent.setClassName("com.google.android.dialer","com.android.dialer.DialtactsActivity");
      

      【讨论】: