我在使用 Professional Android 2 Application Development 的教程应用程序时遇到问题。我正在为 android 2.3 开发,并且似乎代码在修订中发生了很大变化。
基本上我有两个活动,一个启动另一个,以获取联系人列表,然后将选择的联系人返回到第一个活动,然后将其显示在屏幕上,我知道android已经有这样做的东西,但我我想在这里学习:p
活动之间的所有通信都使用意图处理。第一个活动很好地启动了另一个活动,我可以选择一个联系人并将其返回到第一个活动。它运行onReturnActivity()
良好。但是当我尝试在其中创建一个游标(Using managedQuery()
)onReturnActivity()
来打开单个返回的联系人数据库条目时,一切都变成了梨形,我得到了一个 IllegalArgumentException。
返回的 URI 路径是:content://com.android.contacts/contacts15(或其他数字)。
错误是:
java.lang.RuntimeException: Failure delivering result ResultInfo {
who=null, request=1, result=-1, data=Intent {
dat=content://com.android.contacts/contacts15 }}
to activity {com.paad.contactPicker/com.paad.contactPicker.ContactPickerTester}:
java.lang.IllegalArgumentException:
URI: content://com.android.contacts/contacts15,
calling user: com.paad.contactPicker,
calling package:com.paad.contactPicker
不过,在其他活动中创建光标还可以,所以我唯一能想到的事情(由于我对 Android 的了解非常有限)是 uri 路径或从其他活动返回的条目不包含任何内容的问题。但我更倾向于相信这是第一个。
所有权限集,我可以在其他活动中访问联系人数据库。
真的很感激这方面的帮助,过去两天我一直被困住:/
编辑
这里调用第二个活动:
public void onClick(View _view) {
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://android.provider.ContactsContract")) ;
startActivityForResult(intent, PICK_CONTACT) ;
}
不过,我实际上并没有使用传递给此 Intent 的 URI,而是将其硬编码到第二个活动中,如下所示:
final Uri data = ContactsContract.Contacts.CONTENT_URI ;
这是我第一次调用 managedQuery() 的地方(它工作的地方):
final Cursor c = managedQuery(data, null, null, null, null) ;
这是 onReturn 活动: public void onActivityResult(int reqCode, int resCode, Intent data) { super.onActivityResult(reqCode, resCode, data) ;
switch(reqCode) {
case(PICK_CONTACT) : {
if(resCode == Activity.RESULT_OK) {
Uri contactData = data.getData() ;
Cursor c = managedQuery(contactData, null, null, null, null) ;
c.moveToFirst() ;
String name = c.getString(c.getColumnIndexOrThrow("DISPLAY_NAME")) ;
TextView tv = (TextView)findViewById(R.id.textView2) ;
tv.setText(name) ;
}
}
break ;
}
}