2010/09/02 16:13
안드로이드에서 전화번호부는 URI와 Cursor를 쓰면 쉽게 받아올 수 있다.
하지만 SDK 버전업이 되면서 기존에 쓰던 소스에 문제가 발생해서
살짝 뜯어 고치느라 애를 먹었다 -.-;
그냥 단순히 SimpleCursorAdapter를 쓰면 되지만(ApiDemo에도 있듯이)
리스트뷰에 체크박스를 추가하게 되면 체크가 풀렸다가 생겼다가... 생각처럼 잘 컨트롤이 되지 않는 문제가 생긴다.
어느 블로그에서 보니, ui를 최적으로 돌리려다 보니 position을 기억못하는 문제로 봤었는데.
거기서도 SimpleCursorAdapter가 아닌 ListAdapter를 쓰고 있었따... -_-;
ListAdapter에서 전화번호부를 가져오는 방법을 여기저기서 찾다가...
결국은 깨끗하게 포기하고 오늘도 막코딩에 돌입했다.
프로젝트 소스 다운은 여기를... ->
package com.GetContact;
import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class GetContact extends ListActivity
{
String tag = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Cursor cursor = getURI(); // 전화번호부 가져오기
int end = cursor.getCount(); // 전화번호부의 갯수 세기
Log.d(tag, "end = "+end);
String [] name = new String[end]; // 전화번호부의 이름을 저장할 배열 선언
int count = 0;
if(cursor.moveToFirst())
{
// 컬럼명으로 컬럼 인덱스 찾기
int idIndex = cursor.getColumnIndex("_id");
do
{
// 요소값 얻기
int id = cursor.getInt(idIndex);
name[count] = cursor.getString(1);
// LogCat에 로그 남기기
Log.d(tag, "id=" + id +", name["+count+"]=" + name[count]);
count++;
} while(cursor.moveToNext() || count > end);
}
setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_multiple_choice, name));
final ListView listView = getListView();
listView.setItemsCanFocus(false);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
private Cursor getURI()
{
// 주소록 URI
Uri people = Contacts.CONTENT_URI;
// 검색할 컬럼 정하기
String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.HAS_PHONE_NUMBER };
// 쿼리 날려서 커서 얻기
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(people, projection, null, selectionArgs, sortOrder);
}
}
main.xml은 원래 그대로 둬도 된다. android에서 제공하는 simple_list_item_multiple_choice.xml을 가져와 쓴다.
다른 xml로 바꾸어 보았으나... VM 떡실신 ㅠㅠ 커스텀어댑터로 사용하는 방법은 더 찾아봐야 할듯하다.
왼쪽 사진.
log.d로 본 목록들. 맨 위에 end = 92는 저장된 전화번호의 갯수를 뜻한다.
92명의 이름을 String 배열에 넣고 뽑아봤는데 log.d에서는 아직 한글을 지원못하는가보다. =_=a 방법이 없을까나... 흠.
오른쪽 사진.
위 소스코드를 실행한 화면. 여기서 bottom부분에 확인 취소버튼을 고정시키는 커스텀어댑터를 만드는게 목적이었으나;
오늘은 여기까지만...
하면 할수록 느끼는 거지만
1. 불가능은 없다 와
2. 하나를 알면 열을 알아야한다 라는거...-_ㅜ
'Android' 카테고리의 다른 글
| 안드로이드 숫자를 한글(String)으로 변환하기 & TTS에 적용까지. (46) | 2010/09/09 |
|---|---|
| 안드로이드 10초에 한 번씩 현재 시간을 출력하는 서비스 (4) | 2010/09/08 |
| 안드로이드 전화번호부(Contacts) 가져오기 예제 소스 (13) | 2010/09/02 |
| 안드로이드 TextView에 현재 날짜와 시간을 1초 단위로 보여주는 프로그램 (12) | 2010/09/01 |
| android, 메뉴 만들기. (버튼 가능) (9) | 2010/08/30 |
| Android AudioTrack Buffer troubles (실시간 오디오 재생을 위한 방법) (9) | 2010/08/30 |
GetContact.zip
댓글을 달아 주세요
안녕하세요 우연히 검색하다 들른 홈페이지인데~ 잘정리되어있는듯하네요 잠시 궁금한게 하나 생겨서 질문드릴께요
저는 블로그라든지 사용하고 있는것이 없어서 메일로 답변을 요구드립니다........whitelhg@naver.com
질문의 요지는 안드로이드를 실행하면 메뉴버튼이 있자나요 거기를 누르면 현재 설치되어있는 모든 어플 목록이 죽 나오자나요 그것을 가져오기를 원하는데요 어디에 저장되어있는지 어떻게 가져오는지.. 그리고 어떤 클래스를 사용해야되는지를 모르겠습니다 제가 간단한 어플을 만들고싶은데 정보가 필요한데 어디서얻는지도 잘모르겠고 찾아봐도 이게 나한테 딱맞는건지도 의문입니다 이런것을 어떻게 찾아보는지에 대한 방법도 궁금합니다~ 잘부탁드리겠습니다 이제 안드로이드 공부하는 막 시작하는... 학생입니다~ 도움 부탁드릴께요
메일 드렸습니다.
이홍규님 혹시 백두산부대 나오셨습니까 ㅎ
잘봤습니다. 감사합니다. 궁금한게 있는데 이건 전화번호가 저장되지 않고 전화번호부의 이름만 저장이 되는것이죠?
안녕하세요 지금 학교에서 졸업프로젝트로 안드로이드 어플 만들고 있는 학생입니다.
올려주신 코드로 전화번호부 불러오는것 까지 됐는데
그 아래 버튼을 추가해서 체크된 목록만 따로 리스트로 만드는 부분에서 막혀서요
안드로이드는 처음이라 막막하네요
혹시 도움이나 조언해주실수 있으신가요? ㅜㅜ
tomatojihyun@naver.com 입니다.
min // 욕심을 좀 줄이시던가 아니면 더 공부해보세요. ㅎㅎ
웹사이트 .처럼 우리는 이것이 정말 내 중 하나입니다 이다 재미 에 .
식사 나는 후회 '다시 쓰기를 약간 정말 자주 .
안녕하세요~
실행을 해보니깐 예상치못한 오류라고 다시시도하라고 뜨는데 어떻게해야하나여~~
웹사이트 . 내가 원하는 건 여러분에게 나 페이 스북 을 사랑하지만, 그럼에도 불구하고 찾을 수 없습니다 버튼을 !
숭고한 좋은 블로그 . 나 페이 스북 을 사랑하지만, I를 찾을 수 없습니다로 반대 찾을 수 없습니다 버튼을 !
안녕하세요, 이름 대신 목록에 전화번호를 직접 가져오려고 하면 어떡해야 하나요?
이클립스 환경에서 작업하신거 맞으시죠? 블로그에 위와 같이 소스를 올리려면 어떻게 해야하나요?