android无法从某些手机获取联系人

时间:2012-03-06 01:09:49

标签: android contact

我写了一个需要从用户手机上读取联系人的应用。自从我把它推向市场以来,一些用户告诉我,我的应用程序无法读取他们的联系人列表(它会弹出一条错误消息,说它无法获取联系人列表)。

对于大约80%的用户来说,一切正常,但其他人都有这个问题。

在我的MainActivity中,我称之为方法:GetContacts()

如果该方法未返回任何联系人,则我致电:GetContacts2()

如果应用仍然无法获取联系人,则会弹出错误消息。以下是我正在使用的两种方法。有些手机,这是行不通的,是Droid X2和HTC Incredible。

我还在清单中将所需的API级别设置为8,以便删除旧手机。我也没有这些用户的日志文件。

注意:为了简单起见,我删除了仅将联系人放在数组中的额外代码。

关于为什么这些方法不适用于所有手机的任何想法?

非常感谢任何帮助!!

标记

private void GetContacts()
{
    try
    {
        Context context = getApplicationContext(); 
        Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

        while (cursor.moveToNext()) 
        { 
            contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
            contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
            hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 

            if (Integer.parseInt(hasPhone)==1) 
            { 
                Cursor phone = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null); 

                while (phone.moveToNext())
                {   
                    phoneNo = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    phoneType = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                }
            } 
        }
    }
    catch (Exception e)
    {
    }
}   

private void GetContacts2()
{
    try
    {
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        if (cur.getCount() > 0) 
        {
            while (cur.moveToNext()) 
            {
                contactId = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                contactName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                {
                     if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
                     {
                         Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{contactId}, null);
                         while (pCur.moveToNext()) 
                         {
                            phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            phoneType = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                         } 

                         pCur.close();
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
    }
}

2 个答案:

答案 0 :(得分:0)

我同意。例外绝对不应被抛在一边。他们是例外;他们表示某些事情是严重错误的,需要加以研究。我建议您至少记录它们,以便遇到问题的用户可以向您发送LogCat。如果您不希望用户必须解决这些问题,请将数据写入SD卡(公共)上的文件,以便他们可以访问并发送给您。

答案 1 :(得分:0)

  //declaration   
Cursor cursor;
int cNameIndex = 0;
int cNumIndex = 0;
String [] arrPosDrawn= null;


//oncreate  
TelephonyManager telMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        int simState = telMgr.getSimState();
                switch (simState) {
                    case TelephonyManager.SIM_STATE_ABSENT:
                        AlertDialog.Builder alert = new AlertDialog.Builder(
                                ContactList.this);

                        alert.setMessage("Please insert Sim card.")
                                .setTitle("Alert")

                                .setNeutralButton("OK",
                                        new DialogInterface.OnClickListener() {

                                            public void onClick(
                                                    DialogInterface dialog,
                                                    int which) {
                                                // TODO Auto-generated method stub

                                            }
                                        }).show();
                        break;
                    case TelephonyManager.SIM_STATE_READY:
                        cursor = refreshContactsCursor();
                         //contacts.setAdapter(new EfficientAdapter(this));
                        break;  
                }
//function
public Cursor refreshContactsCursor()
    {
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        startManagingCursor(cursor);
        cursor.moveToFirst();
        cNameIndex = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);
        cNumIndex = cursor.getColumnIndex(ContactsContract.Data.DATA1);
        arrPosDrawn = new String[cursor.getCount() - 1];
        for (int j=0; j < arrPosDrawn.length; j++) 
        {
            arrPosDrawn[j] = "";

        }
        return cursor;  
    }