2011-07-23 10 views
1

Androidはプログラミングに一般的です(im a linux sys admin/scripting person)。そして、私はプログラミングのための感触を得るために行く単純なアンドロイドアプリを取得しようとしているが、私はいくつかの問題を抱えています。連絡先リストから電話番号を取得することができません...

私はすべての連絡先のリストビューを取得するためにいくつかのアイデアとクエリを組み合わせることができましたが、今では選択された連絡先の電話番号を取得することができますが、私は運がない私はおそらく私がやっていることをするより良い方法があることを知っているが、私はちょうどこれを把握しようとしている。

最初のコード:

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(); 
    } 
} 

そして今、logcat ....どんなに私は同じ例外を取得し、だから私は、明らかに間違って何かをやって選ぶ何コンタクト

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 

..かなり自分でそれを把握:(

感謝任意の助けをちょうどカントI。

答えて

2

ディあなたはそれの中のデータにアクセスする前に、cursor.moveToFirst()のようなデータへの最初の行を指すカーソルポインターを作ろうとしましたか?実際には、Cursor phone_numCursor phone_idについては?

+0

私は確かにしなかったが、私はちょうどそれを追加し、低かったと思う今、私は迅速な対応ニコラに感謝します。誰かが私にそれが必要な理由を簡単に説明することはできますか?なぜ私はすでにその値を返す必要があるクエリを持っているときになぜ必要なのですか? – trey85stang

+0

カーソルポインタを最初のレコードに配置することが不可欠です。したがって、.moveToNext()を使用してレコードを繰り返し処理し、最後のレコードが.isAfterLast()を使用しているかどうかを確認できます。クエリーは、クエリーの条件にデータがある場合と同じくらい多くの値を返します(より良い1つの値)。カーソルを使用して、照会の結果を繰り返して見ることができます。私はあなたの問題に対する私の提案が仕事をしてくれたことを願っています。乾杯。 –

+1

ニコラ、私はあなたの返信が大きな助けとなった説明を感謝します。 – trey85stang

関連する問題