我无法获得联系电话号码,我在日志猫中不断收到错误
02-24 19:40:42.772: ERROR/CursorWindow(21467): Bad request for field slot 0,-1. numRows = 1, numColumns = 24
Run Code Online (Sandbox Code Playgroud)
这是我的代码
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.Button;
import android.widget.SimpleCursorAdapter;
import android.os.Bundle;
public class Contacts extends Activity {
private ListView mContactList;
private Button mAddContact;
private boolean mShowInvisible = false;
boolean set;
public String name = "";
public String id;
public String phone;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.contact_listview); …
Run Code Online (Sandbox Code Playgroud) 我已经构建了以下方法,以使用从Contacts表中获取的id从RawContacts表中获取id.此方法无法进行异常处理.
public int getRawContactId(int contactId)
{
String[] projection=new String[]{ContactsContract.RawContacts._ID};
String selection=ContactsContract.RawContacts.CONTACT_ID+"=?";
String[] selectionArgs=new String[]{String.valueOf(contactId)};
Cursor c=context.getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,projection,selection,selectionArgs , null);
int rawContactId=c.getInt(c.getColumnIndex(ContactsContract.RawContacts._ID));
Log.d(TAG,"Contact Id: "+contactId+" Raw Contact Id: "+rawContactId);
return rawContactId;
}
Run Code Online (Sandbox Code Playgroud)
相应的Logcat如下所示:
FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null,
request=1, result=-1, data=Intent {
dat=content://com.android.contacts/contacts/lookup/3844i21/993 flg=0x1 }} to
activity {com.example.contactbadger/com.example.contactbadger.MainActivity}:
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a
size of 1
at android.app.ActivityThread.deliverResults(ActivityThread.java:3367)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410)
at android.app.ActivityThread.access$1100(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at …
Run Code Online (Sandbox Code Playgroud) 我已经将联系人添加到我的通讯录中,该通讯录具有如下多个号码。
我想使用ContactsContract
内容uri 提取“用户”的所有3个数字 。通过使用以下代码,我只有一个联系人。
Cursor cursorAddressBook = mContentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (cursorAddressBook != null) {
while (cursorAddressBook.moveToNext()) {
String dataName = cursorAddressBook.getString(cursorAddressBook.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String dataNumber = cursorAddressBook.getString(cursorAddressBook.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
int dataType = cursorAddressBook.getInt(cursorAddressBook.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA2));
String contactId = cursorAddressBook.getString(cursorAddressBook.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
Log.e("last updat Name last", dataName);
Log.e("last updated No last", dataNumber);
Log.e("last updated Type last", dataType);
}
cursorAddressBook.close();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码来创建新联系人.它紧跟Android提供的ContactManager示例.问题是,创建的联系人不会出现在Android附带的"联系人"应用中.然而,当我从电话簿加载所有联系人时,我可以看到新创建的联系人.
private void insertPBEntry()抛出RemoteException,OperationApplicationException {
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "Account type")
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "Account name")
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "TOTAL_NEW")
.build());
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "9090")
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_MOBILE)
.build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
Run Code Online (Sandbox Code Playgroud)
我努力搜索但尚未找到答案.我找到了一个答案,表明问题可能与我的字符串"帐户类型"和"帐户名称"有关.就我而言,我不需要创建任何帐户.我想要的是添加一个新的联系人姓名,电子邮件/邮件地址,电话.
多谢你们!
我试图通过他们的contactId查找联系人的电话号码,bll结果返回 - 电话号码:1
我尝试过围绕SO使用其他示例,但我一直在光标上得到0计数
Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, contactId);
Log.i(TAG, "Locate Contact by Id: " + contactId + " at Uri: " + uri.toString());
Cursor cursor = this.getContentResolver().query(uri, null, null, null, null);
try {
if (cursor.moveToFirst()) {
Log.i(TAG, "Phone Number: " + cursor.getString(cursor.getColumnIndex(Phone.NUMBER)));
}
} finally {
cursor.close();
}
Run Code Online (Sandbox Code Playgroud) 我需要通过电子邮件获取联系人信息(光标).它们必须是截然不同的 如果他收到电子邮件,每个联系人必须有一个条目.怎么做?我的目标是新的联系人API附带2.0.
1)我尝试使用CursorJoiner来做,但发生了一件奇怪的事情.这是我的代码:
MatrixCursor matCur = new MatrixCursor(
new String[]{
Contacts._ID,
Contacts.DISPLAY_NAME,
"photo_id",
"starred"
}
);
Cursor newContactCursor = managedQuery(
ContactsContract.Contacts.CONTENT_URI,
new String[]{
Contacts._ID,
Contacts.DISPLAY_NAME,
"photo_id",
"starred"
},
null,
null,
null//Contacts._ID
);
newContactCursor.moveToFirst();
Cursor emailCur = managedQuery(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
new String[] {
Email.CONTACT_ID,
Email.DATA1
},
null,
null,
Email.CONTACT_ID
);
emailCur.moveToFirst();
CursorJoiner joiner = new CursorJoiner(
newContactCursor,
new String[]{Contacts._ID},
emailCur,
new String[] {Email.CONTACT_ID}
);
for (CursorJoiner.Result joinerResult : joiner) {
switch (joinerResult) {
case LEFT:
// handle case where a row in …
Run Code Online (Sandbox Code Playgroud) 我希望能够自动将信息输入到创建帐户表单中,并根据用户已输入设备的信息(如姓名,电子邮件地址,电话号码)建议可能性.我需要一种与API级别8兼容的方法.
android google-account contactscontract accountmanager android-contacts
我必须使用内容解析器获得不同的原始联系人ID.
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));
System.out.println("id............"+id+"..."+name);
}
}
Run Code Online (Sandbox Code Playgroud)
我已将所有联系人插入本机联系人.然后使用上面的代码我得到所有本机联系人ID.插入1个联系人后,如何一次获得一个id.请帮帮我.谢谢.
我想为现有联系人添加新的电子邮件地址.
我用这个代码:
ArrayList<ContentProviderOperation> insertEmailList =
new ArrayList<ContentProviderOperation>();
Uri uri=null;
for (ContactEmail contactEmail : emails) {
values.put(ContactsContract.Data.RAW_CONTACT_ID, id);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Email.ADDRESS, contactEmail.getEmailAddress());
values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_CUSTOM);
uri=contentResolver.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
}
Run Code Online (Sandbox Code Playgroud)
当运行这段代码uri
是content://com.android.contacts/data/2135
,但我的联系方式也不无例外updated.my应用程序运行.
java android contactscontract android-contacts android-studio
我成功地将联系人插入到地址簿中,我需要在我的应用程序中保存联系人的参考.我认为保存引用的最佳方法是获取RawContacts ID本身.
有没有办法让我在插入新联系人后立即从地址簿中取回ID?或者我是否必须获取所有记录并将其与我的数据进行比较以获取RawContacts ID?
我使用此代码执行插入操作:
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = ops.size();
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)
.withValue(RawContacts.ACCOUNT_NAME, null)
.withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DISABLED)
.build());
Run Code Online (Sandbox Code Playgroud)
我感谢任何输入,无论是变通方法还是API.谢谢!
android ×10
contactscontract ×10
contacts ×1
cursor ×1
email ×1
java ×1
rawcontactid ×1
rawcontacts ×1
uri ×1