Android 电话类型和电子邮件类型不工作?
我的项目中的电话类型和电子邮件类型有一些问题。我正在使用2.1平台,在添加电话类型和电子邮件类型之前,我的项目中没有问题,在使用这些电话类型和电子邮件类型之后,当我试着运行项目时,它会打开一个消息框,显示应用程序已停止并强制关闭。我的xml文件有一个按钮和ListView。我正在使用这个代码 代码Android 电话类型和电子邮件类型不工作?,android,Android,我的项目中的电话类型和电子邮件类型有一些问题。我正在使用2.1平台,在添加电话类型和电子邮件类型之前,我的项目中没有问题,在使用这些电话类型和电子邮件类型之后,当我试着运行项目时,它会打开一个消息框,显示应用程序已停止并强制关闭。我的xml文件有一个按钮和ListView。我正在使用这个代码 代码 public class GetAllDatas extends Activity { ListView lvItem; private Button btnAdd; String Ptype,
public class GetAllDatas extends Activity {
ListView lvItem;
private Button btnAdd;
String Ptype, Etype;
int contactPhoneType;
String displayName="", emailAddress="", phoneNumber="";
ArrayList<String> contactlist=new ArrayList<String>();
ArrayAdapter<String> itemAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lvItem = (ListView)this.findViewById(R.id.lvitems);
btnAdd = (Button)this.findViewById(R.id.btnAddItem);
itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactlist);
lvItem.setAdapter(itemAdapter);
btnAdd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
readContacts();
}
});
}
private void readContacts()
{
ContentResolver cr =getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext())
{
displayName = "" ;
ArrayList<String> phoneNumber = new ArrayList<String>();
ArrayList<String> emailAddress = new ArrayList<String>();
displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
/* Email */
Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null, null);
while (emails.moveToNext())
{
emailAddress.add(emails.getString(emails.getColumnIndex(Email.DATA)));
}
contactPhoneType = emails.getInt(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
switch(contactPhoneType){
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
Etype = "Home";
break;
}
emails.close();
/* Phone Number and Type */
if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
{
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
while (pCur.moveToNext())
{
phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
switch(contactPhoneType){
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
Ptype = "Home";
break;
}
pCur.close();
}
int phoneNumberCount = phoneNumber.size();
int emailCount = emailAddress.size();
// Add arraylist data to contactlist..
if(phoneNumberCount > emailCount) {
for (int i=0; i<phoneNumberCount; i++)
{
if(emailCount>i)
{
contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n");
}
else
{
contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + " , " + "\n");
}
}
}
else
{
for (int i=0; i<emailCount; i++)
{
if(phoneNumberCount>i)
{
contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n");
}
else
{
contactlist.add(displayName + " , " + " , " + " , " + Etype + " , " + emailAddress.get(i) + "\n");
}
}
}
}
Collections.sort(contactlist);
itemAdapter.notifyDataSetChanged();
cursor.close();
}
可能是这句话:
while (cursor.moveToNext())
对我来说,这看起来像是在读取第一个光标位置之前就移动了光标,得到了一个CursorIndexOOB exeption
尝试一个do-while循环,看看是否有帮助
此外,请检查您的应用程序是否具有读取联系人数据的权限
uses-permission android:name="android.permission.READ_CONTACTS"
我在你的代码中找到了错误。将光标移到最后一条记录之外后,您将检查电话类型和电子邮件类型(在
之后的pCur.moveToNext(),而循环超出最后一条记录)。您需要在while
循环中检查它,而不是在if之后。更改以下内容:
while (pCur.moveToNext())
{
phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
int contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
switch(contactPhoneType){
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
Ptype = "Home";
break;
}
}
对emailType也做同样的更正。因为索引的问题看起来很严重
android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
gor正在获取电话。TYPE可以根据此密码尝试以下代码
正如Dheresh所说,你必须改变这种情况,我得到了答案。你的代码是正确的,首先非常感谢你,但是一个联系人有两个号码和两封电子邮件,显示的是相同的类型。我会尽力改正的。别忘了我…电子邮件类型和电话类型出现了,但顺序不正确我添加了HOME、WORK MOBILE和其他…但随机出现了一些联系人\n你的意思是此声明需要任何更改吗?我检查了代码并尽可能编辑,没有得到错误,但没有区别,代码33需要参考实际错误,我也改变了,但没有区别,我通过随机电话和电子邮件类型得到了相同的答案。我检查了你的代码,但我没有得到解决方案,我必须参考你的答案,问德雷什实际问题。
android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
// Get all phone numbers.
//
Cursor phones = cr.query(Phone.CONTENT_URI, null,
Phone.CONTACT_ID + " = " + contactId, null, null);
while (phones.moveToNext()) {
String number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
switch (type) {
case Phone.TYPE_HOME:
// do something with the Home number here...
break;
case Phone.TYPE_MOBILE:
// do something with the Mobile number here...
break;
case Phone.TYPE_WORK:
// do something with the Work number here...
break;
}
}
phones.close();