連絡先を Web サービスと同期するサービスを作成しています。
アカウント設定からアカウントを追加します。次に、それを Web サービスと同期します。全て大丈夫。カスタム アカウントを追加する前に、デバイスにアカウントがありません。また、デバイスの Contact Storage アプリの「データ」値は 0.00B です。
同期後、すべての連絡先が連絡先アプリに表示されます。Contact Storage アプリの「データ」値は 4.53Mb です。
次に、デバイスからアカウントを削除します。Contact Storage アプリで「データ」の値が 3.74Mb と表示されるようになりました。
その後、アカウントを再度追加して、再度同期を開始します。同期が完了すると、連絡先ストレージ アプリに「データ」値が 7.90Mb 表示されます。
前の手順を繰り返すと、連絡先ストレージ アプリの「データ」の値が増え続けます。
では、それはなぜでしょうか。Web サービスからダウンロードしたアバターがクリーンにならないようです。
アカウントを削除するときにそれらを削除するにはどうすればよいですか?
私はそのようなアバターを追加します:
public ContactOperations addAvatar(String avatarUrl) {
contentValues.clear();
if (!TextUtils.isEmpty(avatarUrl)) {
try {
byte[] avatar = NetworkUtils.downloadAvatar(avatarUrl);
byte[] resizedAvatar = resizeBitmap(avatar);
avatar = null;
contentValues.put(Photo.PHOTO, resizedAvatar);
contentValues.put(Photo.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
addInsertOperation();
} catch (IOException e) {
Log.e(ContactOperations.class.toString(), e.getMessage(), e);
}
}
return this;
}
private void addInsertOperation() {
ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValueBackReference(StructuredName.RAW_CONTACT_ID, 0);
builder.withValue(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
builder.withValues(contentValues);
batchOperation.add(builder.build());
}
その後、BatchOperation クラスのメソッドを呼び出します
public List<Uri> execute() {
List<Uri> resultUris = new ArrayList<Uri>();
if (mOperations.size() == 0) {
return resultUris;
}
// Apply the mOperations to the content provider
try {
ContentProviderResult[] results = mResolver.applyBatch(ContactsContract.AUTHORITY,
mOperations);
if ((results != null) && (results.length > 0)){
for (int i = 0; i < results.length; i++){
resultUris.add(results[i].uri);
}
}
} catch (final OperationApplicationException e1) {
Log.e(TAG, "storing contact data failed", e1);
} catch (final RemoteException e2) {
Log.e(TAG, "storing contact data failed", e2);
}
mOperations.clear();
return resultUris;
}