下面是我的代码,我得到了android.database.CursorIndexOutOfBoundsException:索引-1请求,大小为2错误.谁能告诉我如何解决它?
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
if (Integer.parseInt(cur.getString(
cur.getColumnIndex(People.PRIMARY_PHONE_ID))) > 0) {
Cursor pCur = cr.query(
Contacts.Phones.CONTENT_URI,
null,
Contacts.Phones.PERSON_ID +" = ?",
new String[]{id}, null);
int i=0;
int pCount = pCur.getCount();
String[] phoneNum = new String[pCount];
String[] phoneType = new String[pCount];
while (pCur.moveToNext()) {
phoneNum[i] = pCur.getString(
pCur.getColumnIndex(Contacts.Phones.NUMBER));
phoneType[i] = pCur.getString(
pCur.getColumnIndex(Contacts.Phones.TYPE));
i++;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图获得所有联系人列表和电子邮件地址.
目前我正在使用此代码,但是我得到了许多重复的名称和电子邮件.我想要的只是一个人和一封电子邮件.有没有办法在查询联系人时合并联系人?
我也只是在寻找> 2.0的解决方案.
private void init() {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id},null);
while (emailCur.moveToNext()) {
String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
Log.e("Email",name+" "+email);
}
emailCur.close();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Android内置电话簿中的名称和电子邮件ID添加到我的页面中,我可以获取姓名,联系人ID,电话号码.但是我无法从Android电话簿中获取电子邮件ID.
public static final int PICK_CONTACT = 1;
@Override
button.setOnClickListener(new OnClickListener() {
public void onClick(View _view) {
Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT);
}
});
}
@Override
public void onActivityResult(int reqCode, int resCode, Intent data)
{
super.onActivityResult(reqCode, resCode, data);
switch(reqCode) {
case (PICK_CONTACT) : {
if (resCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
c.moveToFirst();
String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String name1 = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String ContactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
if(Integer.parseInt(name1) == 1){ …Run Code Online (Sandbox Code Playgroud) (更新)这适用于模拟器,但不适用于我的HTC图例:(
我的ListActivity中有以下方法,并且它没有返回Cursor中的任何值(getCount = 0)
我无法理解为什么.我在列表中点击哪个联系人并不重要.
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Log.d(TAG,"onListItemClick");
//get Telephone number for entry and display in Toast
Uri phoneUri = ContentUris.withAppendedId(Phone.CONTENT_URI, id);
Log.d(TAG,String.valueOf(phoneUri));
String[] projection = new String[]{Phone.NUMBER};
//Get Cursor
Cursor phoneCursor = managedQuery(phoneUri, projection, null, null, null);
while(phoneCursor.moveToNext()){
String dspNumber;
String number = phoneCursor.getString(phoneCursor.getColumnIndexOrThrow(Phone.NUMBER));
if(number==""){
dspNumber = "No number found";
}else{
dspNumber = number;
}
Toast.makeText(this,dspNumber, 3000).show();
}
}
Run Code Online (Sandbox Code Playgroud) 我想获得Android设备的联系人.我在这里找到了很好的示例代码
但是,当尝试使用该代码进行填充ListActivity时ArrayAdapter,需要花费大量时间 - 在galaxy s2上花费大约4秒钟,在旧设备上花费更多时间.我需要改善这种表现.我认为实现Cursor将包含多个维度Cursor,并SimpleCursorAdapter用作列表适配器.
我发现这种方法几乎没有问题:
有更好/更简单的方法吗?
编辑:
这是我的代码:
public List<ContactData> readContacts(){
ContentResolver cr = getContentResolver();
List<ContactData> cd = new ArrayList<ContactData>();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// get the phone number
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id}, null); …Run Code Online (Sandbox Code Playgroud) 现在,我可以检索电话号码并将editText的文本设置为该号码.但是,当我尝试获取姓氏或名字时,它不起作用.请注意我评论的内容.
继承我的代码:
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class main extends Activity {
private static final int CONTACT_PICKER_RESULT = 1001;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button getContacts = (Button)findViewById(R.id.getContacts);
getContacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(i, CONTACT_PICKER_RESULT);
}
});
}
protected void onActivityResult(int reqCode, …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Android联系人列表中检索联系人的姓名,电话号码和地址.名称和电话非常简单,但1.6 api级别的地址似乎无法访问.
有人想出如何获得联系人的地址吗?2.0中还有一个全新的api.如何通过使用1二进制来利用这个并回退到旧的api.如果这是可能的.