从Android的联系人装载机获取电话号码:投影崩溃 [英] Get phone number from contact loader in android: projection crash
问题描述
//的为CursorLoader查询投影。这是联系人列的列表
//提供商应该返回的光标。
@燮pressLint(InlinedApi)
最后静态的String [] =投影{ //联系人的行ID
Contacts._ID, //一个指针,在保证比_ID更长久的联系。特定
//联系人的当前_ID价值和LOOKUP_KEY,联系人提供商可以生成
//永久联系URI。
Contacts.LOOKUP_KEY, //在平台3.0及更高版本,联系人表中包含
// DISPLAY_NAME_PRIMARY,它要么包含联系人的显示名称或
//其它一些有用的标识符,如电子邮件地址。此列不
//在早期版本的Android,所以你必须使用Contacts.DISPLAY_NAME
//代替。
Utils.hasHoneycomb()? Contacts.DISPLAY_NAME_PRIMARY:Contacts.DISPLAY_NAME, //在Android的3.0和更高版本,缩略图是指向
// PHOTO_THUMBNAIL_URI。在早期版本中,不存在直接指针;代替,
//你生成联系人的ID值和常量定义指针
// android.provider.ContactsContract.Contacts。
Utils.hasHoneycomb()? Contacts.PHOTO_THUMBNAIL_URI:Contacts._ID, //为返回游标的排序顺序列,由AlphabetIndexer使用
排序, // Contacts.HAS_PHONE_NUMBER,
//
CommonDataKinds.Phone.NUMBER, }; //查询列数其映射到每个值在投影
最终静态INT ID = 0;
最终静态INT LOOKUP_KEY = 1;
最终静态INT DISPLAY_NAME = 2;
最终静态INT PHOTO_THUMBNAIL_DATA = 3;
最终静态INT SORT_KEY = 4;
//最后的静态INT HAS_PHONE_NUMBER = 5;
最终静态INT PHONE_NUMBER = 5;
}
下面是错误跟踪
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):致命异常:ModernAsyncTask#1
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):了java.lang.RuntimeException:执行doInBackground发生错误()
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.ModernAsyncTask $ 3.done(ModernAsyncTask.java:137)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.FutureTask.setException(FutureTask.java:219)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.FutureTask.run(FutureTask.java:239)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:573)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.lang.Thread.run(Thread.java:841)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):java.lang.IllegalArgumentException异常:致无效的列数据1
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.content.ContentProviderProxy.query(ContentProviderNative.java:385)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.content.ContentResolver.query(ContentResolver.java:417)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.content.ContentResolver.query(ContentResolver.java:360)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:49)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:35)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:242)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.AsyncTaskLoader $ LoadTask.doInBackground(AsyncTaskLoader.java:51)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.AsyncTaskLoader $ LoadTask.doInBackground(AsyncTaskLoader.java:40)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在android.support.v4.content.ModernAsyncTask $ 2.call(ModernAsyncTask.java:123)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):在java.util.concurrent.FutureTask.run(FutureTask.java:234)
十月12日至18日:20:54.299:E / AndroidRuntime(1909年):... 3个
那是因为这个URI不支持获取 CommonDataKinds.Phone.NUMBER
字段。你应该为 CommonDataKinds.Phone.CONTENT_URI
的请求。看看<一个href=\"http://stackoverflow.com/questions/6587674/android-contacts-display-name-and-phone-numbers-in-single-database-query\">this回答利用这一URI的同时获得这两个联系人姓名和电话。
I am using the sample code from the Google tutorial. The projection is where I specify the data I want to collect. How do I specify that I want the phone numbers? The sample from Google does not get phone number. But I want to obtain the phone number, so I add the field for Phone.NUMBER
. But when I do, the app always crashes. Here is my projection.
// The projection for the CursorLoader query. This is a list of columns that the Contacts
// Provider should return in the Cursor.
@SuppressLint("InlinedApi")
final static String[] PROJECTION = {
// The contact's row id
Contacts._ID,
// A pointer to the contact that is guaranteed to be more permanent than _ID. Given
// a contact's current _ID value and LOOKUP_KEY, the Contacts Provider can generate
// a "permanent" contact URI.
Contacts.LOOKUP_KEY,
// In platform version 3.0 and later, the Contacts table contains
// DISPLAY_NAME_PRIMARY, which either contains the contact's displayable name or
// some other useful identifier such as an email address. This column isn't
// available in earlier versions of Android, so you must use Contacts.DISPLAY_NAME
// instead.
Utils.hasHoneycomb() ? Contacts.DISPLAY_NAME_PRIMARY : Contacts.DISPLAY_NAME,
// In Android 3.0 and later, the thumbnail image is pointed to by
// PHOTO_THUMBNAIL_URI. In earlier versions, there is no direct pointer; instead,
// you generate the pointer from the contact's ID value and constants defined in
// android.provider.ContactsContract.Contacts.
Utils.hasHoneycomb() ? Contacts.PHOTO_THUMBNAIL_URI : Contacts._ID,
// The sort order column for the returned Cursor, used by the AlphabetIndexer
SORT_ORDER,
// Contacts.HAS_PHONE_NUMBER,
//
CommonDataKinds.Phone.NUMBER,
};
// The query column numbers which map to each value in the projection
final static int ID = 0;
final static int LOOKUP_KEY = 1;
final static int DISPLAY_NAME = 2;
final static int PHOTO_THUMBNAIL_DATA = 3;
final static int SORT_KEY = 4;
// final static int HAS_PHONE_NUMBER = 5;
final static int PHONE_NUMBER = 5;
}
Here is the error trace
12-18 10:20:54.299: E/AndroidRuntime(1909): FATAL EXCEPTION: ModernAsyncTask #1
12-18 10:20:54.299: E/AndroidRuntime(1909): java.lang.RuntimeException: An error occured while executing doInBackground()
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.lang.Thread.run(Thread.java:841)
12-18 10:20:54.299: E/AndroidRuntime(1909): Caused by: java.lang.IllegalArgumentException: Invalid column data1
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.content.ContentProviderProxy.query(ContentProviderNative.java:385)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.content.ContentResolver.query(ContentResolver.java:417)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.content.ContentResolver.query(ContentResolver.java:360)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:49)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:35)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:242)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40)
12-18 10:20:54.299: E/AndroidRuntime(1909): at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123)
12-18 10:20:54.299: E/AndroidRuntime(1909): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
12-18 10:20:54.299: E/AndroidRuntime(1909): ... 3 more
Thats because this URI does not support getting CommonDataKinds.Phone.NUMBER
field. You should make a request to CommonDataKinds.Phone.CONTENT_URI
. Take a look at this answer to make use of this URI while getting both contact name and phone.
这篇关于从Android的联系人装载机获取电话号码:投影崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!