Невозможно получить номер телефона из списка контактов ... код внутри

1

Я новичок в андроиде и программировании вообще (im a linux sys admin/scripting person). И я пытался получить простое приложение для Android, чтобы получить представление о программировании, но у меня возникают некоторые проблемы.

Мне удалось собрать несколько идей и запросов, чтобы получить список всех контактов, но теперь я хотел бы получить номер телефона выбранного контакта, но мне не повезло... Я знаю, что есть вероятно, лучшие способы делать то, что я делаю, но я просто пытаюсь понять это.

Сначала код:

package com.SomeApp;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.database.Cursor;
//import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class CallAppActivity extends ListActivity 
{  /** Called when the activity is first created. */
  private ListAdapter mAdapter;
  @Override
  public void onCreate(Bundle savedInstanceState) 
  { super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Get All information from ContactsContract
    Cursor managedCursor = getContentResolver().query(
      ContactsContract.Contacts.CONTENT_URI, 
      null, 
      null, 
      null, 
      null
    );

    //Activity will manage the cursor lifecycle.
    startManagingCursor(managedCursor);
    String[] columns = new String[] {ContactsContract.Contacts.DISPLAY_NAME};
    int[] names = new int[] {R.id.contact_entry};
    mAdapter = new SimpleCursorAdapter(
      this, 
      R.layout.main, 
      managedCursor, 
      columns, 
      names
   );
   setListAdapter(mAdapter);
  }

  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) 
  { super.onListItemClick(l, v, position, id);

    Cursor lookup = (Cursor) mAdapter.getItem(position); 
    String contactId = lookup.getString(
      lookup.getColumnIndex(
        ContactsContract.Contacts._ID
      )
    );

    Cursor phone_num = getContentResolver().query(
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      null, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, 
      null, 
      null
    );

    String phoneId = phone_num.getString(
      phone_num.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER
      )
    );

    //We are going to print shit to a message box....
    AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
    alertbox.setMessage(phoneId);
    alertbox.show();
  }
}

А теперь лодка...

07-23 11:35:34.469: WARN/dalvikvm(781): threadid=1: thread exiting with uncaught exception (group=0x40015560)
07-23 11:35:34.479: ERROR/AndroidRuntime(781): FATAL EXCEPTION: main
07-23 11:35:34.479: ERROR/AndroidRuntime(781): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

Независимо от того, какой контакт я выбираю, я получаю то же исключение, поэтому я, очевидно, что-то делаю неправильно. Я просто не могу понять это самостоятельно :(

Любая помощь оценивается.

Теги:

1 ответ

2
Лучший ответ

Вы пытались сделать указатель курсора на первую строку на свои данные, такие как cursor.moveToFirst() прежде чем вы получите доступ к данным внутри него? На самом деле, для Cursor phone_num и Cursor phone_id?

  • 0
    Я конечно не сделал, но я только добавил это и низко, и вот оно работает теперь, я ценю быстрый ответ Никола. Может кто-нибудь дать мне быстрое объяснение, зачем это нужно? Мне не совсем понятно, зачем это нужно, когда у меня уже есть запрос, который должен возвращать только это значение?
  • 0
    Важно поместить указатель курсора на первую запись, чтобы вы могли перебирать записи, используя .moveToNext () и проверяя, находится ли этот указатель после последней записи, с помощью usin .isAfterLast (). Запрос не возвращает только то значение (лучше сказать одно значение), он возвращает столько же, сколько имеется данных для условий запроса соответственно. Вы можете использовать курсоры для итерации и просмотра результатов запроса. Я надеюсь, что мое предложение по вашей проблеме сработало, и это быстрое объяснение прояснит вам ситуацию. Приветствия.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню