안드로이드 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.
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
'Android Dev' 카테고리의 다른 글
kandroid - 37기 안드로이드 개발자 교육 II 후기 (0) | 2011.07.23 |
---|---|
[안드로이드] 탭 하단의 위치 시키기!! (TabHost, TabWiget) (2) | 2011.07.14 |
[안드로이드] 슬립 화면 깨우기 (1) | 2011.06.22 |
[안드로이드] 첫화면 로고 (2) | 2011.06.22 |
[안드로이드] 서브 액티비티에서 어플 종료.[퍼옴] (0) | 2011.06.22 |