Android는 커뮤니케이션 수정을 수신하고 수정 사항을 업로드합니다.
28396 단어 android 기초 지식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 "";
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android의 문자열 판단 조건에 대한 일반적인 쓰기판단 조건을 많이 쓰는 사람도 있고, 잘못된 판단 방법을 쓰는 사람도 있습니다.다음은 문자열을 어떻게 쓰는지 판단하는 조건과 흔히 볼 수 있는 오류를 총결해 보겠습니다. 1. 두 문자열의 내용이 같은지 판단 만약 (...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.