У меня возникли проблемы с учебным приложением от 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 ;
И здесь я вызываю manageQuery() в первый раз (где это работает):
final Cursor c = managedQuery(data, null, null, null, null) ;
Вот активность onReturn:
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 ;
}
}