본문
주소록(이)가 중지되었습니다 오류 해결하기
어느 순간부터 안드로이드에서 다이얼 화면을 띄우자면 위 화면이 나타나기 시작하였다. 주소록을 통해 기존에 저장된 사람과는 통화할 수 있다 쳐도 번호가 저장되어있지 않은경우 전화를 걸수도 없고, 최근 걸려온 전화에 대해 답신을 할 수 없으니 답답한 노릇이었다. 대개 권한 설정이나 캐시 삭제로 문제가 해결되지만 이번에는 통하지 않자 logcat으로 어떤곳에 문제가 생겼는지 확인해보기로 했다.
E/AndroidRuntime( 1189): FATAL EXCEPTION: Thread-123
E/AndroidRuntime( 1189): java.lang.NullPointerException
E/AndroidRuntime( 1189): at android.text.SpannableStringBuilder.<init>(SpannableStringBuilder.java:43)
E/AndroidRuntime( 1189): at android.telephony.PhoneNumberUtils.formatNumber(PhoneNumberUtils.java:1169)
E/AndroidRuntime( 1189): at com.android.contacts.dialpad.T9Search.getAll(T9Search.java:95)
E/AndroidRuntime( 1189): at com.android.contacts.dialpad.T9Search.<init>(T9Search.java:74)
E/AndroidRuntime( 1189): at com.android.contacts.dialpad.DialpadFragment$2.run(DialpadFragment.java:528)
E/AndroidRuntime( 1189): at java.lang.Thread.run(Thread.java:856)W/ActivityManager( 284): Force finishing activity
이를통해 알아낸 사실은...
1. com.google.android/android/4.0.4_r2.1/android.telephony.PhoneNumberUtils 에서 해당 라인을 찾아보니 다음과 같았다. SpannableStringBuilder의 생성자에서 NullPointerException오류가 발생하는것을 보니 들어오는 String source에 문제가 있는것으로 확인되었다.
public static String formatNumber(String source, int defaultFormattingType) {
SpannableStringBuilder text = new SpannableStringBuilder(source);
formatNumber(text, defaultFormattingType);
return text.toString();
}
2. android_packages_apps_Contacts/src/com/android/contacts/dialpad/T9Search.java 의 getAll()에서 위 메소드를 호출하는 아래 라인을 찾을 수 있었다(즉, phone.getString(0)으로 값을 받아오지 못하는 상황임을 알 수 있다)
Cursor phone = mContext.getContentResolver().query(Phone.CONTENT_URI, PHONE_PROJECTION, PHONE_ID_SELECTION, PHONE_ID_SELECTION_ARGS, PHONE_SORT);
phone.moveToFirst();
while (phone.getLong(1) == contactId) {
String num = phone.getString(0);
ContactItem contactInfo = new ContactItem();
contactInfo.number = PhoneNumberUtils.formatNumber(num);
}
3. 이것은 /data/data/com.android.providers.contacts/databases/contact2.db 에서 값을 읽어오는것이다. 물론 분석하면 무엇인가 나오겠지만 귀찮아서 동일한 이름의 빈파일을 새로 만들었다. (확인은 하지 않았지만 파일접근 권한 문제일 수 있다). 이후 다이얼러를 실행시켰더니 잘 동작하였다.
댓글