У меня проблемы с учебным приложением от Professional Android 2 Application Development.Я разрабатываю для Android 2.3, и кажется, что код немного изменился в ревизиях.
В основном у меня есть два действия, одно из которых запускает другое, чтобы получить список контактов, а затем вернуть выбранный контакт обратно в первое действие, которое затем отобразит его на экране. Я знаю, что на Android есть что-то, чтоуже делает это, но я пытаюсь узнать здесь: p
Вся коммуникация между действиями осуществляется с использованием намерений.Первое действие запускает другое действие нормально, я могу выбрать контакт, и он возвращает его к первому действию.Работает onReturnActivity()
все нормально.Но когда я пытаюсь создать курсор (используя 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 или с записью, возвращенной из другого действия, не содержащей ничего.Но я более склонен полагать, что это первое.
Все разрешения установлены, и я могу получить доступ к базе данных контактов в другом действии нормально.
Был бы очень признателен за помощь в этом, я застрял в течение последних 2 дней: /
РЕДАКТИРОВАТЬ
Вот вызов второй деятельности:
public void onClick(View _view) {
Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://android.provider.ContactsContract")) ;
startActivityForResult(intent, PICK_CONTACT) ;
}
На самом деле я не использую 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 ;
}
}