簡體   English   中英

使用Loader無效列數據1的Android聯系人電話號碼

[英]Android Contact phone number using Loader Invalid column data1

我以前使用內容解析器獲取聯系人列表及其詳細信息,但仍然有效我想嘗試在后台查詢內容提供程序的Loader方法。 我在這里查看了文檔和示例代碼:

http://developer.android.com/training/contacts-provider/retrieve-details.html

雖然我能夠毫無問題地顯示聯系人列表,但我仍然堅持在點擊它並在詳細信息屏幕上顯示特定聯系人時檢索電話號碼。 上面的演示在詳細屏幕上顯示了用戶的地址,我甚至嘗試修改它。 我已將內容URI從Contacts更改為ContactsContract.CommonDataKinds.Phone,但我一直在改進

java.lang.IllegalArgumentException: Invalid column data1

互聯網上沒有一個詳細的教程顯示它是如何完成的。 這里有人能夠善待一些光明嗎? 閱讀各種其他Stackoverflow問題我很確定它與2個不同的CONTENT URI有關,但我又錯了。 任何幫助或指示將非常感激。 謝謝

我已經看過很少的SO問題:

從android中的聯系裝載機獲取電話號碼:投影崩潰

Logcat說“無效列數據1”

如何在Android中獲取聯系人的電話號碼

從查找URI中獲取電話號碼

他們都沒有解決我的問題。 以下是失敗的相關代碼:

     final static String[] PROJECTION = {
            Contacts._ID,
            Utils.hasHoneycomb() ? ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY : ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
           //ContactsContract.CommonDataKinds.Phone.NUMBER,
    };

代碼工作得很好,但是當我刪除注釋以獲取電話號碼時它就失敗了

就我而言,問題出在URI上

我在用這個:

Uri uri = ContactsContract.Contacts.CONTENT_URI;

我為此更改了( Phone.CONTENT_URI )以解決問題並獲取電話號碼:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

這是代碼的其余部分:

contactos = (TextView) findViewById(R.id.contactos);

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

String [] projection = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER
        };

Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

while (cursor.moveToNext()){
            String nombre = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
            String telefono = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            contactos.append("Name: ");
            contactos.append(nombre);
            contactos.append(" - Phone Number: ");
            contactos.append(telefono);
            contactos.append("\n");
        }

這是我在(工作)代碼中實際執行的操作的摘錄。

這些是我的相關進口:

import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;

鑒於id是一個字符串(表示一個數字,如“1”,“20”,...)

// Query for phone numbers for the selected contact id
final Cursor cur = getContentResolver().query
    (
    Phone.CONTENT_URI, null,
    Phone.CONTACT_ID + "=?",
    new String[] {id}, null
    );

final int phoneIdx = cur.getColumnIndex(Phone.NUMBER);
final int phoneType = cur.getColumnIndex(Phone.TYPE);

// ...

    if(cur.moveToFirst())
    {
        final String name =
            cur.getString
            (
                cur.getColumnIndexOrThrow
                (
                    ContactsContract.Contacts.DISPLAY_NAME
                )
            );
    }

希望它能讓你走上正確的道路

更改您的查詢URI。

您使用的URI不是用於搜索/過濾聯系人上的列(例如電話號碼):

您需要使用可以訪問您要嘗試過濾的列的URI,如下所示:

Uri uri = ContactsContract.Data.CONTENT_URI;

或者也許是因為你正在搜索電話號碼:

Uri uri = ContactsContract.PhoneLookup.CONTENT_FILTER_URI;

Android SDK文檔中 ,使用哪些URI以及何時進行了大量細分:

  • 如果您需要閱讀單個聯系人,請考慮使用CONTENT_LOOKUP_URI而不是CONTENT_URI。

  • 如果您需要通過電話號碼查找聯系人,請使用針對此目的進行優化的PhoneLookup.CONTENT_FILTER_URI。

  • 如果您需要按部分名稱查找聯系人,例如,要生成按類型過濾的建議,請使用CONTENT_FILTER_URI URI。

  • 如果您需要通過電子郵件地址,昵稱等某些數據元素查找聯系人,請對ContactsContract.Data表使用查詢。 結果將包含聯系人ID,姓名等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM