Home Cotent Provider 이용하여 연락처 가져오기
Post
Cancel

Cotent Provider 이용하여 연락처 가져오기

연락처 가져오기

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class MainActivity extends AppCompatActivity {  
    TextView textView;  
  
    @Override  
  protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        textView = findViewById(R.id.textView);  
  
        Button button = findViewById(R.id.button);  
        button.setOnClickListener(new View.OnClickListener(){  
            @Override  
			  public void onClick(View v){  
                chooseContacts();  
            }  
        });  
  
    }  
  
    public void chooseContacts(){  
        // 연락처 화면을 띄우기 위한 인텐트  
		Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,  
                ContactsContract.Contacts.CONTENT_URI);  
        startActivityForResult(contactPickerIntent, 101);  
    }  
  
    @Override  
  protected void onActivityResult(int requestCode, int resultCode, Intent data){  
        super.onActivityResult(requestCode, resultCode, data);  
  
        if(resultCode == RESULT_OK){  
            if(requestCode == 101){  
                try{  
                    Uri contactsUri = data.getData();  
                    // 선택한 연락처 id값 확인하기  
				    String id = contactsUri.getLastPathSegment();  
                    getContacts(id);  
                }catch (Exception e){  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
  
    public void println(String data){  
        textView.append(data + "\n");  
    }  
  
    public void getContacts(String id){  
        Cursor cursor = null;  
        String name ="";  
  
        try{  
            // ContentResolver 객체의 query 메서드 호출하기  
					cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI,  
                    null,  
                    ContactsContract.Data.CONTACT_ID + "=?",  
                    new String[] { id},  
                    null);  
  
            if(cursor.moveToFirst()){  
                name = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));  
                println("Name : " + name);  
  
                String columns[] = cursor.getColumnNames();  
                for(String column : columns){  
                    int index = cursor.getColumnIndex(column);  
                    String columnOutput = ("#" + index + " -> [" + column + "]" + cursor.getString(index));  
                    println(columnOutput);  
                }  
                cursor.close();  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
}

onActivityResult 란 ? 액티비티에는 main이 있고 sub가 있다. main액티비티에서 sub액티비티를 호출하여 넘어갔다가, 다시 main 액티비티로 돌아올때 사용되는 기본 메소드 이다.

sub액티비티에서 뒤로가기 버튼을 만들던 핸드폰 내에있는 뒤로가기 버튼을 누르던 onActivityResult() 메소드는 실행이 된다.

인텐트 객체를 만들 때 첫 번째 매개 변수로 Intent.ACTION_PICK이라는 액션 정보를 전달하는데 이것은 데이터로부터 아이템을 선택하고 선택한 아이템을 리턴시키라는 액션이다.

그리고 두 번째 매개 변수는 연락처 정보를 조회하는데 사용하는 URI 값이다.

startActivityForReuslt 메서드가 호출되면 연락처를 선택할 수 있는 화면이 표시된다. 이 메서드로 전달되는 인텐트 객체의 getData 메서드를 호출하면 선택된 연락처 정보를 가르키는 Uri 객체가 반환된다.

getLastPathSegment 메서드는 Uri 객체의 id 값을 확인하는데 사용된다. id 값을 확인하는 이유는 선택한 연락처의 상세 정보가 다른 곳에 저장되어 있기 때문이다.

getContacts 메서드를 호출하면서 id값을 매개 변수로 전달하고 getContacts 메서드를 추가한다.

getContacts 안에서는 ContentResolver 객체의 query 메서드를 호출한다.

query 메서드의 첫 번째 매개 변수로는 ContactsContract.Data.CONTENT_URI를 전달한다. 이 Uri 값은 앞에서 인텐트를 만들 때 넣어 주었던 Uri 값과는 다르다. 왜냐하면 이 Uri 값은 연락처의 상세 정보를 조회하는데 사용되는 Uri이다.

세 번째 매개 변수로는 id 칼럼의 이름과 함께 =? 라는 글자를 붙여서 전달하였다. 연락처의 상세 정보를 저장하는 테이블에는 많은 칼럼들이 있는데 그 칼럼의 이름 중에서 id 칼럼의 이름은 ContactsContract.Data.CONTACT_ID 상수로 확인할 수 있다.


연락처를 조회 하려면 READ_CONTACTS와 WRITE_CONTACTS 권한이 필요하다.

매니페스트 파일을 열고 이 두개의 권한을 추가한다.

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  package="org.techtown.contacts">  
  
    <uses-permission android:name="android.permission.READ_CONTACTS"/>  
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>  
		....
  
</manifest>

결과

스크린샷 2022-01-29 오전 12 41 37

This post is licensed under CC BY 4.0 by the author.