我写了一个需要从用户手机上读取联系人的应用。自从我把它推向市场以来,一些用户告诉我,我的应用程序无法读取他们的联系人列表(它会弹出一条错误消息,说它无法获取联系人列表)。
对于大约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)
{
}
}
答案 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;
}