Android managedQuery () IllegalArgumentException при открытии возвращенного пути URI для одного контакта - PullRequest
1 голос
/ 17 января 2012

У меня проблемы с учебным приложением от 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 ;
     }
 }

1 Ответ

2 голосов
/ 18 января 2012

Я почти уверен, что URI плохой. Я почти уверен, что перед номером 15 должна быть косая черта, например: content: //com.android.contacts/contacts/15. Я в настоящее время не могу проверить это для вас, хотя. Я не могу отличить многое другое от кода; извините, но если вы сможете разобраться с этой частью, я думаю, вы решите проблему. Это, вероятно, как ваше второе действие возвращает URI. Надеюсь, это поможет.

...