본문 바로가기

Android Dev

[안드로이드] 주소록 가져오기에서 바뀐점. -스크랩자료.

안드로이드 API바이블- 정보문화사에서

주소록가져오기 예제를 따라하는데 자꾸 소스에 에 줄을 긋는거다 -_-

Contacts.People;

요딴식으로... 그래서 네이뇬을 뒤져봤더니 정답을 찾았다.



출처 : http://gnuteam.tistory.com/41

2.0.1 버전부터 android.provider.Contacts 가 android.provider.ContactsContract로 바뀌었다
는 것을 여러 문서를 통해 알게 되었다. 

하지만.. 실제 코딩에 들어가다 보니 예전 방법으로 하여 중간줄이 끄이는 결과를 가져왔다. 

예를 들어 예전 버전의 소스인 경우 People.CONTENT_URI 가 허용이 되었지만, 현재는 People.CONTENT_URI 와 같이 중간줄이 끄이는 것을 목격할 수 있었다. 

바보같이 이 해결법으로 androidManifest.xml 파일의 퍼미션을 주는 것으로 해결하려 했으니.. 이 또한 예전 방식인것으로 보인다.



아래는 나의 실수를 기재한 것이다. (소스가 더러울 수 있다)
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
package com.example.contacts;
 
import android.app.ListActivity;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.provider.ContactsContract.Contacts;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
 
public class contacts extends ListActivity {
     
    private ListView mlist;
    private LinearLayout mlayout;
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         
        Cursor contactsCursor = this.managedQuery(People.CONTENT_URI, null, null, null, null);
        startManagingCursor(contactsCursor);
         
        String[] columnsToMap = new String[] {People.NAME};
        int[] mapTo = new int[] {android.R.id.text1};
         
        ListAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, contactsCursor, columnsToMap, mapTo);
         
        this.setListAdapter(mAdapter);
 
        setContentView(mlayout);
    }
     
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, id);
        Cursor c = managedQuery(uri, new String[] { People.NUMBER },null, null, null);
         
        c.moveToFirst();
         
        int phoneNumberIndex = c.getColumnIndex(People.NUMBER);
        Uri parsedPhoneNumber = Uri.parse("tel:"+c.getString(phoneNumberIndex));
        Intent i = new Intent(Intent.ACTION_CALL, parsedPhoneNumber);
        startActivity(i);
         
        super.onListItemClick(l, v, position, id);
    }
     
}

출처 : Tutorial Android (소스까지)


위 소스 그대로 에뮬레이터에서 실행하면 에러메시지가 발생한다.
Sorry!
The application contact_test (process com.example.contacts) has stopped unexpectedly. Please try again.

에러 로그를 보면
ERROR/AndroidRuntime(275): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://contacts/people from pid=275, uid=10033 requires android.permission.READ_CONTACTS

여기서 permission관련 에러인거 같아 구글링을 통해 다음과 같은 해결법을 발견했었다.

Add the following uses-permission belows the uses-sdk statement. 
<uses-permission android:name="android.permission.READ_CONTACTS"/>




출처 : Working with Android Contacts

how to call android contacts list

전화번호부 목록 불러오기



위 사이트들은 소스까지 친절히 포함되어있어 참고하기에 좋다.

유명한 블로그인 mSurf Lab 에서도 위와 같은 문제있는 소스를 기재하고 있다.


androidManifest.xml에 위와같은 퍼미션을 추가해도 에뮬레이터에서 

실행되지 않았다.




이렇게 하여 문제가 있는 것을 감지하고.. 다음과 같은 해결방법을 찾았다.


일단 contacts =  Contacts.People.CONTENT_URI; 의 people 부분은 2.0.1부터 없어져서



import android.provider.ContactsContract.Contacts; 쪽으로 들어갔네요.



출처 : androidpub






또한, 완벽하고 친절하게 해결법을 소개한 사이트가 있다.



http://appleandroidjunhulove.tistory.com/tag/Android%20Contacts



현재 위의 해결방법을 보면서

아직 구현중이고, 정확히 테스트 후에 소스와 같이 기재해야겠다.



출처 : http://gnuteam.tistory.com/41