2014-12-01 2 views
1

최근에 Lollipop으로 업데이트 한 Nexus 기기에서 이상한 문제가 발생했습니다.Lollipop에서 프로그래밍 방식으로 추가 된 연락처를 삭제할 수 없습니다.

프로그램을 통해 추가 된 연락처는 더 이상 삭제할 수 없습니다. 삭제할 옵션이 없거나, 삭제 된 경우 삭제 자체가 작동하지 않습니다. Funnily만큼, 타사 연락처 응용 프로그램을 다운로드하고 그들을 삭제하는 데 문제가 없습니다.

마찬가지로 프로그램을 통해 삭제할 수 없습니다. 업그레이드 전에 완벽하게 작동하는 모든 것입니다.

는 연락처를 삽입하는 데 사용되는 코드입니다 :

 ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) 
      .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, name) 
      .build()); 

    if(contact.phone != null && contact.phone !=" "){ 
    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, contact.phone) 
      .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK) 
      .build()); 
    } 

    if(contact.phone2 != null && contact.phone2 !=" "){ 
     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, contact.phone2) 
       .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK) 
       .build()); 
    } 

    if(contact.phone3 != null && contact.phone3 !=" "){ 
     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, contact.phone3) 
       .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK) 
       .build()); 
    } 

    if(contact.fax != null && contact.fax !=" "){ 
    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, contact.fax) 
      .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_FAX_WORK) 
      .build()); 
    } 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET,(" ".equals(contact.getAddress())?contact.location:contact.getAddress())) 
      .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY,ctx.getResources().getString(R.string.meuhedet)) 
      .build()); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, Long.parseLong(Groupid)) 
      .build()); 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    Bitmap photo = BitmapFactory.decodeResource(ctx.getResources(),R.drawable.logo_meuhedet); 
    photo.compress(Bitmap.CompressFormat.PNG, 100, baos); 
    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
     .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
     .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE) 
     .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray()) 
     .build()); 

    try { 
     ContentProviderResult [] res =ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     rawContactID = ContentUris.parseId(res[0].uri); 
     Log.d(TAG,"contact added = " + rawContactID); 
     boolean result = db.saveContactsIntoDatabase(rawContactID, index, ContactKey); 

     if(res[0].uri!=null && result){ 
      ((Activity) ctx).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(ctx, R.string.successfully_saved_contact, Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
    } catch (Exception e) { 
    } 
} 

으로 우리는 우리가 다음 삭제에 사용할 수 있도록 ID가 반환 저장 볼 수 있습니다 :

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI) 
       .withSelection(ContactsContract.RawContacts.CONTACT_ID + "=?", new String[]{String.valueOf(rawContactId)}) 
       .build()); 
    try { 
     ContentProviderResult [] res = ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
     Log.d(TAG,"delete count= " + res[0].count); 


     if(res[0].count > 0 && result){ 
      ((Activity) ctx).runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(ctx, R.string.successfully_deleted_contact, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    } catch (Exception e) { 
    } 

삭제는 영향을받은 행 수에 대해 0을 반환하므로 분명히 삭제되지 않습니다.

Lollipop에 문제가 있습니까? 아니면 연락처를 추가하는 방식에 문제가 있습니까?

+0

이상한, 코드 비교 (문자열 비교를 수정하는 등 아주 사소한 변화)를 테스트했으며 연락처를 완벽하게 추가 및 삭제합니다 (Nexus 7, Lollipop). 'rawContactId'로 질의하면 그 연락처에 접근 할 수 있습니까? – matiash

+0

내가 시도 :. \t \t 커서 C1 = ctx.getContentResolver() 쿼리 (RawContacts.CONTENT_URI, 새로운 \t \t 새로운 String [] {RawContacts._ID}, \t \t RawContacts.CONTACT_ID + "=?", \t \t을 String [] {String.valueOf (rawContactId)}, null); \t \t Log.d (TAG, "count ="+ c1.getCount()); 리턴 된 제로 라인을 얻는다. – theblitz

+0

이상한 것은 "연락처 +"라는 응용 프로그램을 다운로드했고 연락처 삭제에 문제가 없다는 것입니다. – theblitz

답변

1

응용 프로그램과 "싸우다"며칠 후 나는 그 원인을 알아 냈습니다.

이제 주소에 유형 (StructuredPostal.TYPE)을 제공해야합니다. 그것 없이는, 그것은 제대로 작동하지 않습니다.

이것은 롤리팝에서만 발생합니다. 우리는 다른 버전에서도 문제가 없는지 테스트했습니다.

입력이 현재 의무적 인 경우 삽입이 실패 할 것으로 예상됩니다.

+0

(Contact +)와 같은 다른 응용 프로그램이 연락처를 삭제할 수있는 방법에 대한 설명? – lujop

0

일부 연락처를 삭제할 수없는 비슷한 문제가 발생했습니다. 그리고 나는

내가 연락처를 삭제 CONTENT_LOOKUP_URI를 사용하여 여기에 StackOverflow의 이유를 알고 있지만 샘플을 많이하지 않는 Contacts.CONTENT_URI 대신 글로벌 Contacts.CONTENT_LOOKUP_URI을 사용했기 때문에 문제는 것을 발견했다.

관련 문제