Android는 커뮤니케이션 수정을 수신하고 수정 사항을 업로드합니다.

요구 사항
프로젝트가 필요하기 때문에 앱에 로그인한 후에 로컬 통신록을 가져와 서버에 업로드합니다.그러나 최근 백엔드 친구들은 매번 전단에 전체 통신록을 올린 다음에 백엔드에서 비교를 하고 다시 데이터베이스를 삽입하면 서버에 대한 부담이 크다고 피드백을 해 왔다.자세히 생각해 보면 사용자의 통신록이 바뀌지 않았다면 상소의 모든 조작은 헛수고였다.
그래서 우리 전단은 사용자가 처음 모두 올린 것을 제외하고 이후에 통신록이 바뀔 때만 수정된 일부 통신록을 올릴 수 있도록 해야 한다.
이러한 요구 사항을 충족하기 위해서는 다음과 같은 몇 가지 기능이 필요합니다.
  • 처음으로 로그인하여 모든 통신록을 업로드한 후 로컬 데이터베이스에 저장
  • 연락처의 변경 여부를 수신
  • 연락처에 변화가 발생하면 변경된 연락처와 이전에 로컬에 저장된 연락처를 비교한 후 서버에 업로드
  • 처음으로 모두 업로드하여 로컬 데이터베이스에 저장
    처음 업로드할 때 모든 연락처 데이터를 가져와서 업로드가 완료되면 그린다오에 저장합니다. 여기는 주로 필드 연결, RawContacts.ID 및 RawContacts.VERSION.
    RawContacts._ID: 이 연락처의 존재 여부를 판단하는 데 사용
    RawContacts.VERSION: 연락처를 새로 만들 때 버젼의 기본값은 2이고 나중에 수정할 때마다 1이 증가하기 때문에 연락처의 수정 여부를 판단하는 관건이다
                ContentResolver _contentResolver = getContentResolver();
                Cursor cursor = _contentResolver.query(
                        ContactsContract.RawContacts.CONTENT_URI, null, null, null,
                        null);
    
                //       
                oldContactLists.clear();
                DBHelper.getInstance().getContact2Dao().deleteAll();
    
                while (cursor.moveToNext()) {
                    Long contactID = cursor.getLong(cursor
                            .getColumnIndex(ContactsContract.RawContacts._ID));
    
                    long contactVersion = cursor.getLong(cursor
                            .getColumnIndex(ContactsContract.RawContacts.VERSION));
                    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    
                    Contact2 contact2 = new Contact2();
                    contact2.vesion = contactVersion;
                    contact2.name = name;
                    contact2.phone = getPhoneNumber(contactID);
                    contact2.contactID = contactID;
                    contact2.cid = MyApplication.userAllInfo.cid;
                    oldContactLists.add(contact2);
                }
                cursor.close();
    
                upLoad(oldContactLists);

    다음은 아날로그 업로드 코드가 성공하면 GreenDao에 커뮤니케이션을 저장합니다.
        Log.e("+++","    ");
        Contact2Dao contact2Dao = DBHelper.getInstance().getContact2Dao();
        for (int i = 0; i < removeDuplicateContactLists1.size(); i++) {
        Log.e("+++","   :"+removeDuplicateContactLists1.get(i).name+"  "+removeDuplicateContactLists1.get(i).phone);
         contact2Dao.insert(removeDuplicateContactLists1.get(i));
            }

    다음부터는 연락처의 변화를 감청하기 위한 서비스를 열어야 합니다.
    서비스가 시작될 때:
    getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
        /**
         *        
         */
        private ContentObserver contactObserver = new ContentObserver(new Handler()) {
            @Override
    
            public boolean deliverSelfNotifications() {
    
                return super.deliverSelfNotifications();
    
            }
    
            @Override
    
            public void onChange(boolean selfChange) {
    
                super.onChange(selfChange);
                boolean needUpdate = isContactChanged();
                if (needUpdate) {
                    upLoad(newContactLists);
                    getContentResolver().unregisterContentObserver(contactObserver);
                    needUpdate = false;
                }
    
    
            }
        };

    통신록이 바뀌었다는 소식을 들었을 때 isContactChanged () 방법을 사용해서 연락처가 수정되었는지 판단합니다
      /**
         *        
         *
         * @return
         */
        public boolean isContactChanged() {
            boolean theReturn = false;
            ContentResolver _contentResolver = getContentResolver();
            Cursor cursor = _contentResolver.query(
                    ContactsContract.RawContacts.CONTENT_URI, null, null, null,
                    null);
    
            String phoneNumber = null;
            newContactLists.clear();
            //           
            List tempLists = new ArrayList<>();
    
            while (cursor.moveToNext()) {
                Long contactID = cursor.getLong(cursor
                        .getColumnIndex(ContactsContract.RawContacts._ID));
                long contactVersion = cursor.getLong(cursor
                        .getColumnIndex(ContactsContract.RawContacts.VERSION));
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    
                Contact2 contact2 = new Contact2();
                contact2.vesion = contactVersion;
                contact2.name = name;
                contact2.contactID = contactID;
                contact2.cid = MyApplication.userAllInfo.cid;
                tempLists.add(contact2);
            }
            cursor.close();
    
            //        
            for (int i = 0; i < tempLists.size(); i++) {
                for (int j = tempLists.size() - 1; j > i; j--) {
                    if (tempLists.get(j).name.equals(tempLists.get(i).name)) {
                        tempLists.remove(j);
                    }
                }
            }
    
            //          id
            List ids = new ArrayList<>();
            for (int i = 0; i < oldContactLists.size(); i++) {
                ids.add(oldContactLists.get(i).contactID);
            }
    
            for (int i = 0; i < tempLists.size(); i++) {
                //       
                Long contactID = tempLists.get(i).contactID;
                int index = ids.indexOf(contactID);
                if (ids.contains(contactID)) {
                    //  version
                    long version = oldContactLists.get(index).vesion;
                    //version         ,      
                    if (version != tempLists.get(i).vesion) {
                        phoneNumber = getPhoneNumber(contactID);
                        Contact2 contact2 = new Contact2();
                        contact2.vesion = tempLists.get(i).vesion;
                        contact2.name = tempLists.get(i).name;
                        contact2.phone = phoneNumber;
                        contact2.contactID = tempLists.get(i).contactID;
                        contact2.cid = MyApplication.userAllInfo.cid;
                        newContactLists.add(contact2);
                        theReturn = true;
                    }
                } else {
                    //      ,  
                    phoneNumber = getPhoneNumber(contactID);
                    Contact2 contact2 = new Contact2();
                    contact2.vesion = tempLists.get(i).vesion;
                    contact2.name = tempLists.get(i).name;
                    contact2.phone = phoneNumber;
                    contact2.contactID = tempLists.get(i).contactID;
                    contact2.cid = MyApplication.userAllInfo.cid;
                    newContactLists.add(contact2);
                    theReturn = true;
                }
            }
    
            return theReturn;
        }

    최종적으로 newContactLists의 데이터는 수정된 연락처입니다.그러나 주의해야 할 점은 이전에 사용한 Raw Contacts의 데이터였지만 이 표에는 연락처의 Raw Contacts로만 돌아갈 수 있다는 것이다.id,RawContacts.version 등 데이터는 사용자의 전화번호를 얻을 수 없습니다.그래서 우리는 RawContacts에 근거해야 한다.ID로 사용자의 전화번호를 받습니다.
        /**
         *   contactID       
         *
         * @param contactID
         * @return
         */
        private String getPhoneNumber(Long contactID) {
            Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactID);
            Uri entityUri = Uri.withAppendedPath(rawContactUri, ContactsContract.RawContacts.Entity.CONTENT_DIRECTORY);
            Cursor c = getContentResolver().query(entityUri,
                    new String[]{ContactsContract.RawContacts.SOURCE_ID, ContactsContract.Contacts.Entity.DATA_ID, ContactsContract.RawContacts.Entity.MIMETYPE, ContactsContract.Contacts.Entity.DATA1},
                    null, null, null);
            try {
                while (c.moveToNext()) {
                    if (!c.isNull(1)) {
                        String data = c.getString(3);
                        return data;
                    }
                }
            } finally {
                c.close();
            }
            return "";
        }

    이로써 연락처의 변화를 감청하고 변화된 연락처의 이름과 전화번호를 얻을 수 있게 됐다.
    아래에 온전한 코드를 붙여서 그 중의 업로드 연락처 부분만 바꾸면 온전하게 사용할 수 있다. 물론 이 안의 그린데이 부분은 스스로 실현해야 한다.
    public class ContactIntentService extends IntentService {
        //   
        private List oldContactLists;
        //   
        private List newContactLists;
    
    
        public ContactIntentService() {
            super("contactIntentService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            DBHelper.init(this);
            oldContactLists = new ArrayList<>();
            newContactLists = new ArrayList<>();
            initHashMap();
            getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, contactObserver);
    
        }
    
        /**
         *        
         */
        private ContentObserver contactObserver = new ContentObserver(new Handler()) {
            @Override
    
            public boolean deliverSelfNotifications() {
    
                return super.deliverSelfNotifications();
    
            }
    
            @Override
    
            public void onChange(boolean selfChange) {
    
                super.onChange(selfChange);
                boolean needUpdate = isContactChanged();
                if (needUpdate) {
                    upLoad(newContactLists);
                    getContentResolver().unregisterContentObserver(contactObserver);
                    needUpdate = false;
                }
    
    
            }
        };
    
        /**
         *    RawContacts._ID    version
         */
        public void initHashMap() {
            //           ,       
            if (DBHelper.getInstance().getContact2Dao().queryBuilder().list() == null
                    || DBHelper.getInstance().getContact2Dao().queryBuilder().list().size() <= 0) {
    
                ContentResolver _contentResolver = getContentResolver();
                Cursor cursor = _contentResolver.query(
                        ContactsContract.RawContacts.CONTENT_URI, null, null, null,
                        null);
    
                //       
                oldContactLists.clear();
                DBHelper.getInstance().getContact2Dao().deleteAll();
    
                while (cursor.moveToNext()) {
                    Long contactID = cursor.getLong(cursor
                            .getColumnIndex(ContactsContract.RawContacts._ID));
    
                    long contactVersion = cursor.getLong(cursor
                            .getColumnIndex(ContactsContract.RawContacts.VERSION));
                    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    
                    Contact2 contact2 = new Contact2();
                    contact2.vesion = contactVersion;
                    contact2.name = name;
                    contact2.phone = getPhoneNumber(contactID);
                    contact2.contactID = contactID;
                    contact2.cid = MyApplication.userAllInfo.cid;
                    oldContactLists.add(contact2);
                }
                cursor.close();
    
                //    ,               3 
                for (int i = 0; i < oldContactLists.size(); i++) {
                    for (int j = oldContactLists.size() - 1; j > i; j--) {
                        if (oldContactLists.get(j).name.equals(oldContactLists.get(i).name)) {
                            oldContactLists.remove(j);
                        }
                    }
                }
    
                Log.e("+++", "       :" + oldContactLists.size());
    
    
                upLoad(oldContactLists);
            } else {
                //                              
                oldContactLists.addAll(DBHelper.getInstance().getContact2Dao().queryBuilder().list());
    
            }
        }
    
    
        private void upload( final List removeDuplicateContactLists1) {
                    
                            Log.e("+++","    ");
                            Contact2Dao contact2Dao = DBHelper.getInstance().getContact2Dao();
                            for (int i = 0; i < removeDuplicateContactLists1.size(); i++) {
                                Log.e("+++","   :"+removeDuplicateContactLists1.get(i).name+"  "+removeDuplicateContactLists1.get(i).phone);
                                contact2Dao.insert(removeDuplicateContactLists1.get(i));
                            }
                            getContentResolver().unregisterContentObserver(contactObserver);
                        }
    
        }
    
        /**
         *        
         *
         * @return
         */
        public boolean isContactChanged() {
            boolean theReturn = false;
            ContentResolver _contentResolver = getContentResolver();
            Cursor cursor = _contentResolver.query(
                    ContactsContract.RawContacts.CONTENT_URI, null, null, null,
                    null);
    
            String phoneNumber = null;
            newContactLists.clear();
            //           
            List tempLists = new ArrayList<>();
    
            while (cursor.moveToNext()) {
                Long contactID = cursor.getLong(cursor
                        .getColumnIndex(ContactsContract.RawContacts._ID));
                long contactVersion = cursor.getLong(cursor
                        .getColumnIndex(ContactsContract.RawContacts.VERSION));
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    
                Contact2 contact2 = new Contact2();
                contact2.vesion = contactVersion;
                contact2.name = name;
                contact2.contactID = contactID;
                contact2.cid = MyApplication.userAllInfo.cid;
                tempLists.add(contact2);
            }
            cursor.close();
    
            //        
            for (int i = 0; i < tempLists.size(); i++) {
                for (int j = tempLists.size() - 1; j > i; j--) {
                    if (tempLists.get(j).name.equals(tempLists.get(i).name)) {
                        tempLists.remove(j);
                    }
                }
            }
    
            //          id
            List ids = new ArrayList<>();
            for (int i = 0; i < oldContactLists.size(); i++) {
                ids.add(oldContactLists.get(i).contactID);
            }
    
            for (int i = 0; i < tempLists.size(); i++) {
                //       
                Long contactID = tempLists.get(i).contactID;
                int index = ids.indexOf(contactID);
                if (ids.contains(contactID)) {
                    //  version
                    long version = oldContactLists.get(index).vesion;
                    //version         ,      
                    if (version != tempLists.get(i).vesion) {
                        phoneNumber = getPhoneNumber(contactID);
                        Contact2 contact2 = new Contact2();
                        contact2.vesion = tempLists.get(i).vesion;
                        contact2.name = tempLists.get(i).name;
                        contact2.phone = phoneNumber;
                        contact2.contactID = tempLists.get(i).contactID;
                        contact2.cid = MyApplication.userAllInfo.cid;
                        newContactLists.add(contact2);
                        theReturn = true;
                    }
                } else {
                    //      ,  
                    phoneNumber = getPhoneNumber(contactID);
                    Contact2 contact2 = new Contact2();
                    contact2.vesion = tempLists.get(i).vesion;
                    contact2.name = tempLists.get(i).name;
                    contact2.phone = phoneNumber;
                    contact2.contactID = tempLists.get(i).contactID;
                    contact2.cid = MyApplication.userAllInfo.cid;
                    newContactLists.add(contact2);
                    theReturn = true;
                }
            }
    
            return theReturn;
        }
    
        /**
         *   contactID       
         *
         * @param contactID
         * @return
         */
        private String getPhoneNumber(Long contactID) {
            Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactID);
            Uri entityUri = Uri.withAppendedPath(rawContactUri, ContactsContract.RawContacts.Entity.CONTENT_DIRECTORY);
            Cursor c = getContentResolver().query(entityUri,
                    new String[]{ContactsContract.RawContacts.SOURCE_ID, ContactsContract.Contacts.Entity.DATA_ID, ContactsContract.RawContacts.Entity.MIMETYPE, ContactsContract.Contacts.Entity.DATA1},
                    null, null, null);
            try {
                while (c.moveToNext()) {
                    if (!c.isNull(1)) {
                        String data = c.getString(3);
                        return data;
                    }
                }
            } finally {
                c.close();
            }
            return "";
        }
    }
    

    좋은 웹페이지 즐겨찾기