我在我的应用中添加了一项功能,可打开联系人列表。 问题是有些用户报告说应用程序在尝试使用时崩溃了。 该功能似乎适用于大多数人(包括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)
我不知道是什么导致了它。 谢谢!
答案 0 :(得分:13)
使用隐式Intent启动Contacts活动 - 即告诉要查看联系人列表的操作系统,它将确定要使用的正确活动(或如果安装了多个联系人应用程序则提示用户) 。以下Intent将解决这个问题:
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.setData(Uri.parse("content://contacts/people/"));
startActivity(i);
尽可能避免使用显式Intent ...有太多不同的设备可以绝对确保特定的包/活动始终存在。
答案 1 :(得分:1)
由于您上面指出Galaxy S遇到了问题,您应该看一下Galaxy S here上的联系人应用程序的Android Manifest。看看这个,没有DialtactsContactsEntry活动,它可以解释你所看到的内容。基于清单以及另一个论坛上的message,在这种情况下您需要使用的是“com.sec.android.app.contacts.PhoneBookTopMenuActivity”。这仅仅涵盖了Galaxy S的情况 - 其他具有自己的触点更换的设备可能会有一些完全不同的东西,并且无法保证下一轮Galaxy系列不会选择更改它。
当然(我相信这对你来说不是新闻),整个练习强调了使用未记录的API /应用程序功能的固有问题......更好的方法是使用类似ErikR在他的回答中描述的内容
答案 2 :(得分:1)
我认为这是因为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");