从Android的联系人装载机获取电话号码:投影崩溃 [英] Get phone number from contact loader in android: projection crash

查看:508
本文介绍了从Android的联系人装载机获取电话号码:投影崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用从谷歌教程<样品code / A>。投影是我指定我要收集的数据。我如何指定我想在电话号码?从谷歌的样品没有得到电话号码。但我想获得的电话号码,所以我添加字段为 Phone.NUMBER 。但是,当我这样做,应用程序总是崩溃。这是我的投影。

  //的为CursorLoader查询投影。这是联系人列的列表
        //提供商应该返回的光标。
        @燮pressLint(InlinedApi)
        最后静态的String [] =投影{            //联系人的行ID
            Contacts._ID,            //一个指针,在保证比_ID更长久的联系。特定
            //联系人的当前_ID价值和LOOKUP_KEY,联系人提供商可以生成
            //永久联系URI。
            Contacts.LOOKUP_KEY,            //在平台3.0及更高版本,联系人表中包含
            // DISPLAY_NAME_PRIMARY,它要么包含联系人的显示名称或
            //其它一些有用的标识符,如电子邮件地址。此列不
            //在早期版本的Andr​​oid,所以你必须使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆