そのため、私のアプリは同期アダプターをAndroidネイティブの連絡先マネージャーに統合しようとしています。連絡先が同期されると更新できないことを除いて、これはすべてスムーズに実行されています。この特定の問題の詳細はここにあります:Android:コンテンツリゾルバークエリが0行を返す必要がないのに、間違ったURIをクエリしているため、コンテンツリゾルバークエリが0の値を返すと言うだけで要約できます。信じる。
生の連絡先IDを電話に書き込むときは、次のコードを使用して書き込みます。
public ContactSyncOperations(Context context, String username,
String accountName, BatchOperationForSync batchOperation) {
this(context, batchOperation);
mBackReference = mBatchOperation.size();
mIsNewContact = true;
mValues.put(RawContacts.SOURCE_ID, username);
mValues.put(RawContacts.ACCOUNT_TYPE, "com.tagapp.android");
mValues.put(RawContacts.ACCOUNT_NAME, accountName);
mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);
mBatchOperation.add(mBuilder.build());
}
このコンストラクターメソッドは、同期リストに新しい連絡先を追加するときに呼び出されます。
private static void addContact(Context context, String account, Contact contact, BatchOperationForSync batchOperation) {
ContactSyncOperations contactOp = ContactSyncOperations.createNewContact(context, contact.getUsername(), account, batchOperation);//constructor called @ this line
contactOp.addName(contact.getFirstName(), contact.getLastName());
contactOp.addEmail(contact.getEmail());
contactOp.addPhone(contact.getPhoneNumber(), Phone.TYPE_MOBILE);
contactOp.addPhone(contact.getHomePhone(), Phone.TYPE_HOME);
contactOp.addPhone(contact.getWorkPhone(), Phone.TYPE_WORK);
contactOp.addProfileAction(contact.getUsername());
Log.e("Adding contact", "Via sync");
}
コンストラクターでわかるように、私はnewInsertCpoというメソッドを呼び出しています。これは、次の場所で確認できます。
private void addInsertOp() {
if(!mIsNewContact) {
mValues.put(Phone.RAW_CONTACT_ID, mRawContactId);
}
mBuilder = newInsertCpo(addCallerIsSyncAdapterParameter(Data.CONTENT_URI), mYield);
mBuilder.withValues(mValues);
if(mIsNewContact) {
mBuilder.withValueBackReference(Data.RAW_CONTACT_ID, mBackReference);
}
mYield = false;
mBatchOperation.add(mBuilder.build());
}
コードが表示されたので、問題について説明します。生の連絡先IDを作成して書き込むときは、RawContacts.CONTENT_URIに書き込みます。
mBuilder = newInsertCpo(RawContacts.CONTENT_URI, true).withValues(mValues);
ただし、uriをクエリすると、次のようにクエリされます。
Cursor cursor = resolver.query(Data.CONTENT_URI, DataQuery.PROJECTION, DataQuery.SELECTION, new String[] {String.valueOf(rawContactId)}, null);
Data.CONTENT_URIから。これが私の問題が発生している場所だと思います。Androidの公式開発サイトのサンプルコードを使用して、自分の用途に合わせて調整しましたが、この部分は例にかなり当てはまります。しかし、それは機能していません。私のリードは私が言ったことです。私はあるウリに手紙を書き、別のウリに質問しています。しかし、クエリをRawContacts.CONTENT_URI(例外の原因)に変更しようとしました。また、Data.CONTENT_URIに書き込むURIも変更しました。これも例外の原因です。さらに紛らわしいのは、lookupRawContactIdメソッドを実行するときにData.CONTENT_URIから生の連絡先IDを取得することです。
private static long lookupRawContact(ContentResolver resolver, String username) {
Log.e("Looking up Raw Contact", username);
long authorId = 0;
Cursor cursor = resolver.query(Data.CONTENT_URI, UserIdQuery.PROJECTION, UserIdQuery.SELECTION, new String[] {username}, null);
try {
if(cursor != null && cursor.moveToFirst()) {
authorId = cursor.getLong(UserIdQuery.COLUMN_ID);
}
} finally {
if(cursor != null) {
cursor.close();
}
}
return authorId;
}
そうです、rawcontactIdを返すカーソルを取得した場合、同じrawcontactIdを使用して同じUriをクエリする0の値を取得するのはなぜですか?意味がありません!誰かが何か洞察を持っていますか?皆さんありがとう。