Преглед на файлове

1.修改Android Apex Mobile点击Service Location Detail弹出联系人信息。

Pen Li преди 8 години
родител
ревизия
e5f9774eda

+ 167 - 0
Apex Mobile/app/src/main/java/com/usai/Contacts/Contact.java

@@ -0,0 +1,167 @@
+package com.usai.Contacts;
+
+import android.graphics.Bitmap;
+import android.provider.ContactsContract;
+
+import java.io.ByteArrayOutputStream;
+
+public class Contact {
+
+    public static final String NUMBER_TYPE_WORK = String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
+    public static final String NUMBER_TYPE_FAX_WORK = String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK);
+    public static final String EMAIL_TYPE_WORK = String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK);
+    public static final String WEB_TYPE_HOMEPAGE = String.valueOf(ContactsContract.CommonDataKinds.Website.TYPE_HOMEPAGE);
+    public static final String POSTAL_TYPE_WORK = String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
+
+    private String id;
+    private String name;
+    private String number;
+    private String numberType;
+    private String fax;
+    private String faxType;
+    private String email;
+    private String emailType;
+    private String homePage;
+    private String homePageType;
+    private String address;
+    private String addressType;
+    private Bitmap photo;
+
+
+    public Contact(){
+    }
+
+    public Contact(Contact contact){
+        copyContact(contact);
+    }
+
+    public void copyContact(Contact contact) {
+        this.name = contact.getName();
+        this.number = contact.getNumber();
+        this.numberType = contact.getNumberType();
+        this.email = contact.getEmail();
+        this.emailType = contact.getEmailType();
+        this.fax = contact.getFax();
+        this.faxType = contact.getFaxType();
+        this.homePage = contact.getHomePage();
+        this.homePageType = contact.getHomePageType();
+        this.address = contact.getAddress();
+        this.addressType = contact.getAddressType();
+        this.photo = contact.getPhoto();
+    }
+
+    public String getEmail() {
+        return email;
+    }
+    public String getEmailType() {
+        if (emailType == null) {
+            return EMAIL_TYPE_WORK;
+        }
+        return emailType;
+    }
+    public String getId() {
+        return id;
+    }
+    public String getName() {
+        return name;
+    }
+    public String getNumber() {
+        return number;
+    }
+    public String getNumberType() {
+        if (numberType == null) {
+            return NUMBER_TYPE_WORK;
+        }
+        return numberType;
+    }
+    public String getFax() {
+        return fax;
+    }
+    public String getFaxType() {
+        if (faxType == null) {
+            return NUMBER_TYPE_FAX_WORK;
+        }
+        return faxType;
+    }
+    public String getAddress() {
+        return address;
+    }
+
+    public String getAddressType() {
+        if (addressType == null) {
+            return POSTAL_TYPE_WORK;
+        }
+        return addressType;
+    }
+
+    public String getHomePage() {
+        if (homePage == null) {
+            return WEB_TYPE_HOMEPAGE;
+        }
+        return homePage;
+    }
+
+    public String getHomePageType() {
+        return homePageType;
+    }
+
+    public Bitmap getPhoto() {
+        return photo;
+    }
+
+    public byte[] getPhotoData() {
+        if (photo == null) {
+            return null;
+        }
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
+        byte[] data = baos.toByteArray();
+        return data;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+    public void setEmailType(String emailType) {
+        this.emailType = emailType;
+    }
+    public void setId(String id) {
+        this.id = id;
+    }
+    public void setName(String name) {
+        this.name = name;
+    }
+    public void setNumber(String number) {
+        this.number = number;
+    }
+    public void setNumberType(String numberType) {
+        this.numberType = numberType;
+    }
+
+    public void setFax(String fax) {
+        this.fax = fax;
+    }
+    public void setFaxType(String faxType) {
+        this.faxType = faxType;
+    }
+
+    public void setHomePage(String homePage) {
+        this.homePage = homePage;
+    }
+
+    public void setHomePageType(String homePageType) {
+        this.homePageType = homePageType;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public void setAddressType(String addressType) {
+        this.addressType = addressType;
+    }
+
+    public void setPhoto(Bitmap photo) {
+        this.photo = photo;
+    }
+}

+ 455 - 0
Apex Mobile/app/src/main/java/com/usai/Contacts/ContactsManager.java

@@ -0,0 +1,455 @@
+package com.usai.Contacts;
+
+import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+public class ContactsManager {
+
+    private ContentResolver contentResolver;
+    private static final String TAG = "ContactsManager";
+
+
+    private static final String COLUMN_CONTACT_ID =
+            ContactsContract.Data.CONTACT_ID;
+    private static final String COLUMN_RAW_CONTACT_ID =
+            ContactsContract.Data.RAW_CONTACT_ID;
+    private static final String COLUMN_MIMETYPE =
+            ContactsContract.Data.MIMETYPE;
+    private static final String COLUMN_NAME =
+            ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME;
+    private static final String COLUMN_NUMBER =
+            ContactsContract.CommonDataKinds.Phone.NUMBER;
+    private static final String COLUMN_NUMBER_TYPE =
+            ContactsContract.CommonDataKinds.Phone.TYPE;
+    private static final String COLUMN_EMAIL =
+            ContactsContract.CommonDataKinds.Email.DATA;
+    private static final String COLUMN_EMAIL_TYPE =
+            ContactsContract.CommonDataKinds.Email.TYPE;
+
+    private static final String COLUMN_WEB =
+            ContactsContract.CommonDataKinds.Website.DATA;
+    private static final String COLUMN_WEB_TYPE =
+            ContactsContract.CommonDataKinds.Website.TYPE;
+
+    private static final String COLUMN_POSTAL =
+            ContactsContract.CommonDataKinds.StructuredPostal.DATA;
+    private static final String COLUMN_POSTAL_TYPE =
+            ContactsContract.CommonDataKinds.StructuredPostal.TYPE;
+
+    private static final String COLUMN_PHOTO =
+            ContactsContract.CommonDataKinds.Photo.PHOTO;
+
+
+    private static final String MIMETYPE_STRING_NAME =
+            ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;
+    private static final String MIMETYPE_STRING_PHONE =
+            ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;
+    private static final String MIMETYPE_STRING_EMAIL =
+            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE;
+    private static final String MIMETYPE_STRING_WEB =
+            ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE;
+    private static final String MIMETYPE_STRING_ADDRESS =
+            ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE;
+    private static final String MIMETYPE_STRING_PHOTO =
+            ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE;
+
+    public ContactsManager(ContentResolver contentResolver) {
+        this.contentResolver = contentResolver;
+    }
+
+
+    public Contact searchContact(String name) {
+        Log.w(TAG, "**search start**");
+        Contact contact = new Contact();
+        contact.setName(name);
+        Log.d(TAG, "search name: " + contact.getName());
+        String id = getContactID(contact.getName());
+        contact.setId(id);
+
+        if(id.equals("0")) {
+            Log.d(TAG, contact.getName() + " not exist. exit.");
+        } else {
+            Log.d(TAG, "find id: " + id);
+            //Fetch Phone Number
+            Cursor cursor = contentResolver.query(
+                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
+                    new String[]{COLUMN_NUMBER, COLUMN_NUMBER_TYPE},
+                    COLUMN_CONTACT_ID + "='" + id + "'", null, null);
+            while(cursor.moveToNext()) {
+                contact.setNumber(cursor.getString(cursor.getColumnIndex(COLUMN_NUMBER)));
+                contact.setNumberType(cursor.getString(cursor.getColumnIndex(COLUMN_NUMBER_TYPE)));
+                Log.d(TAG, "find number: " + contact.getNumber());
+                Log.d(TAG, "find numberType: " + contact.getNumberType());
+            }
+            //cursor.close();
+
+            //Fetch email
+            cursor = contentResolver.query(
+                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
+                    new String[]{COLUMN_EMAIL, COLUMN_EMAIL_TYPE},
+                    COLUMN_CONTACT_ID + "='" + id + "'", null, null);
+            while(cursor.moveToNext()) {
+                contact.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL)));
+                contact.setEmailType(cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL_TYPE)));
+                Log.d(TAG, "find email: " + contact.getEmail());
+                Log.d(TAG, "find emailType: " + contact.getEmailType());
+            }
+            cursor.close();
+        }
+        Log.w(TAG, "**search end**");
+        return contact;
+    }
+
+
+    public String getContactID(String name) {
+        String id = "0";
+        Cursor cursor = contentResolver.query(
+                ContactsContract.Contacts.CONTENT_URI,
+                new String[]{ContactsContract.Contacts._ID},
+                ContactsContract.Contacts.DISPLAY_NAME +
+                        "='" + name + "'", null, null);
+        if(cursor.moveToNext()) {
+            id = cursor.getString(cursor.getColumnIndex(
+                    ContactsContract.Contacts._ID));
+        }
+        return id;
+    }
+
+    public boolean contactExist(String name) {
+        if (name == null) {
+            return false;
+        }
+        String id = getContactID(name);
+        if(!id.equals("0")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+
+    public void addContact(Contact contact,boolean checkExist) {
+        Log.w(TAG, "**add start**");
+
+        if (checkExist) {
+            String id = getContactID(contact.getName());
+            if(!id.equals("0")) {
+                Log.d(TAG, "contact already exist. exit.");
+            } else if(contact.getName().trim().equals("")){
+                Log.d(TAG, "contact name is empty. exit.");
+            } else {
+                addContact(contact);
+            }
+        } else {
+            addContact(contact);
+        }
+
+        Log.w(TAG, "**add end**");
+
+    }
+
+    private void addContact(Contact contact) {
+
+        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(COLUMN_RAW_CONTACT_ID, 0)
+                .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_NAME)
+                .withValue(COLUMN_NAME, contact.getName())
+                .build());
+        Log.d(TAG, "add name: " + contact.getName());
+
+        // photo
+        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_PHOTO)
+                .withValue(COLUMN_PHOTO, contact.getPhotoData())
+                .build());
+
+        // web
+        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_WEB)
+                .withValue(COLUMN_WEB,contact.getHomePage())
+                .withValue(COLUMN_WEB_TYPE, contact.getHomePage())
+                .build());
+
+        // postal
+        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_ADDRESS)
+                .withValue(COLUMN_POSTAL,contact.getAddress())
+                .withValue(COLUMN_POSTAL_TYPE, contact.getAddressType())
+                .build());
+
+        if(!contact.getNumber().trim().equals("")) {
+            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                    .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                    .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_PHONE)
+                    .withValue(COLUMN_NUMBER, contact.getNumber())
+                    .withValue(COLUMN_NUMBER_TYPE, contact.getNumberType())
+                    .build());
+            Log.d(TAG, "add number: " + contact.getNumber());
+        }
+
+        if(!contact.getFax().trim().equals("")) {
+            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                    .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                    .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_PHONE)
+                    .withValue(COLUMN_NUMBER, contact.getFax())
+                    .withValue(COLUMN_NUMBER_TYPE, contact.getFaxType())
+                    .build());
+            Log.d(TAG, "add fax: " + contact.getFax());
+        }
+
+        if(!contact.getEmail().trim().equals("")) {
+            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
+                    .withValueBackReference(COLUMN_RAW_CONTACT_ID, 0)
+                    .withValue(COLUMN_MIMETYPE, MIMETYPE_STRING_EMAIL)
+                    .withValue(COLUMN_EMAIL, contact.getEmail())
+                    .withValue(COLUMN_EMAIL_TYPE, contact.getEmailType())
+                    .build());
+            Log.d(TAG, "add email: " + contact.getEmail());
+        }
+
+        try {
+            contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+            Log.d(TAG, "add contact success.");
+        } catch (Exception e) {
+            Log.d(TAG, "add contact failed.");
+            Log.e(TAG, e.getMessage());
+        }
+    }
+
+
+    public void deleteContact(Contact contact) {
+        Log.w(TAG, "**delete start**");
+        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+
+        String id = getContactID(contact.getName());
+        //delete contact
+        ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI)
+                .withSelection(ContactsContract.RawContacts.CONTACT_ID+"="+id, null)
+                .build());
+        //delete contact information such as phone number,email
+        ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
+                .withSelection(COLUMN_CONTACT_ID + "=" + id, null)
+                .build());
+        Log.d(TAG, "delete contact: " + contact.getName());
+
+        try {
+            contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+            Log.d(TAG, "delete contact success");
+        } catch (Exception e) {
+            Log.d(TAG, "delete contact failed");
+            Log.e(TAG, e.getMessage());
+        }
+        Log.w(TAG, "**delete end**");
+    }
+
+
+    public void updateContact(Contact contactOld, Contact contactNew) {
+        Log.w(TAG, "**update start**");
+        String id = getContactID(contactOld.getName());
+        if(id.equals("0")) {
+            Log.d(TAG, contactOld.getName()+" not exist.");
+        }/* else if(contactNew.getName().trim().equals("")){
+            Log.d(TAG, "contact name is empty. exit.");
+        } else if(!getContactID(contactNew.getName()).equals("0")){
+            Log.d(TAG, "new contact name already exist. exit.");
+        }*/ else {
+
+            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+
+            //update name
+//            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+//                    .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",
+//                            new String[]{id, MIMETYPE_STRING_NAME})
+//                    .withValue(COLUMN_NAME, contactNew.getName())
+//                    .build());
+            Log.d(TAG, "update name: " + contactNew.getName());
+
+            // photo
+            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                    .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",
+                            new String[]{id, MIMETYPE_STRING_PHOTO})
+                    .withValue(COLUMN_PHOTO, contactNew.getPhotoData())
+                    .build());
+
+            // web
+            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                    .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",
+                            new String[]{id, MIMETYPE_STRING_WEB})
+                    .withValue(COLUMN_WEB,contactNew.getHomePage())
+                    .withValue(COLUMN_WEB_TYPE, contactNew.getHomePage())
+                    .build());
+
+            // postal
+            ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                    .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",
+                            new String[]{id, MIMETYPE_STRING_ADDRESS})
+                    .withValue(COLUMN_POSTAL,contactNew.getAddress())
+                    .withValue(COLUMN_POSTAL_TYPE, contactNew.getAddressType())
+                    .build());
+
+            //update number
+            if(!contactNew.getNumber().trim().equals("")) {
+                ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                        .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=? AND " + COLUMN_NUMBER_TYPE + "=?",
+                                new String[]{id, MIMETYPE_STRING_PHONE,contactNew.getNumberType()})
+                        .withValue(COLUMN_NUMBER, contactNew.getNumber())
+                        .withValue(COLUMN_NUMBER_TYPE, contactNew.getNumberType())
+                        .build());
+                Log.d(TAG, "update number: " + contactNew.getNumber());
+            }
+
+            // fax
+            if(!contactNew.getNumber().trim().equals("")) {
+                ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                        .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=? AND " + COLUMN_NUMBER_TYPE + "=?",
+                                new String[]{id, MIMETYPE_STRING_PHONE,contactNew.getFaxType()})
+                        .withValue(COLUMN_NUMBER, contactNew.getFax())
+                        .withValue(COLUMN_NUMBER_TYPE, contactNew.getFaxType())
+                        .build());
+                Log.d(TAG, "update fax: " + contactNew.getNumber());
+            }
+
+
+            //update email if mail
+            if(!contactNew.getEmail().trim().equals("")) {
+                ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
+                        .withSelection(COLUMN_CONTACT_ID + "=? AND " + COLUMN_MIMETYPE + "=?",
+                                new String[]{id, MIMETYPE_STRING_EMAIL})
+                        .withValue(COLUMN_EMAIL, contactNew.getEmail())
+                        .withValue(COLUMN_EMAIL_TYPE, contactNew.getEmailType())
+                        .build());
+                Log.d(TAG, "update email: " + contactNew.getEmail());
+            }
+
+            try {
+                contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
+                Log.d(TAG, "update success");
+            } catch (Exception e) {
+                Log.d(TAG, "update failed");
+                Log.e(TAG, e.getMessage());
+            }
+        }
+        Log.w(TAG, "**update end**");
+    }
+
+
+    public Uri getContactUri(String contactId, Context context)  {
+
+        if (context == null || contactId == null) {
+            return null;
+        }
+
+        //获取联系人信息的Uri
+        Uri uri = ContactsContract.Contacts.CONTENT_URI;
+        //获取ContentResolver
+        ContentResolver contentResolver = context.getContentResolver();
+        //查询数据,返回Cursor
+        Cursor cursor = contentResolver.query(uri, null, null, null, null);
+
+
+        while (cursor.moveToNext()) {
+
+            //获取联系人的ID
+            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
+            //获取联系人的姓名
+            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
+
+            String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
+
+            if (id != null && id.equals(contactId)) {
+
+                return ContactsContract.Contacts.getLookupUri(Integer.valueOf(contactId), lookupKey);
+
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @brief 显示联系人编辑界面
+     * */
+    public void editContact(String contactId,Context context) {
+
+        if (context == null || contactId == null) {
+            return ;
+        }
+
+        Uri uri = getContactUri(contactId,context);
+        if (uri != null) {
+
+            Intent editIntent = new Intent(Intent.ACTION_EDIT);
+            editIntent.setDataAndType(uri,ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+            editIntent.putExtra("finishActivityOnSaveCompleted", true);
+            context.startActivity(editIntent);
+
+        } else {
+
+        }
+    }
+
+    /**
+     * @brief 新建联系人显示编辑界面
+     * */
+    public void insertContact(Contact contact,Context context) {
+
+        if (context == null) {
+            return;
+        }
+
+        Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);
+        intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
+
+        intent.putExtra(ContactsContract.Intents.Insert.NAME, contact.getName());
+
+        intent.putExtra(ContactsContract.Intents.Insert.PHONE, contact.getNumber());
+        intent.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
+
+        intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE, contact.getFax());
+        intent.putExtra(ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK);
+
+        intent.putExtra(ContactsContract.Intents.Insert.EMAIL, contact.getEmail());
+        intent.putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
+
+        intent.putExtra(ContactsContract.Intents.Insert.POSTAL, contact.getAddress());
+        intent.putExtra(ContactsContract.Intents.Insert.POSTAL_TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
+
+        // Insert中没有的类型,通过Data写入
+        ArrayList<ContentValues> data = new ArrayList<ContentValues>();
+
+        ContentValues row1 = new ContentValues();
+        row1.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
+        row1.put(ContactsContract.CommonDataKinds.Website.DATA, contact.getHomePage());
+        data.add(row1);
+
+        ContentValues row2 = new ContentValues();
+        row2.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
+        row2.put(ContactsContract.CommonDataKinds.Photo.PHOTO, contact.getPhotoData());
+        data.add(row2);
+
+//		Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
+
+        intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);
+
+        context.startActivity(intent);
+
+    }
+}
+

+ 41 - 156
Apex Mobile/app/src/main/java/com/usai/apex/InnerMapActivity.java

@@ -2,11 +2,15 @@ package com.usai.apex;
 
 import android.app.AlertDialog;
 import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract;
@@ -23,6 +27,8 @@ import android.view.View;
 import android.widget.TextView;
 
 import com.baidu.mapapi.map.SupportMapFragment;
+import com.usai.Contacts.Contact;
+import com.usai.Contacts.ContactsManager;
 
 import java.util.ArrayList;
 
@@ -134,10 +140,14 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 
 		actionBar.setDisplayShowTitleEnabled(true);
 	}
+
+	private Context mContext;
+
 	@Override
 	protected void onCreate(Bundle savedInstanceState)
 	{
 		super.onCreate(savedInstanceState);
+		mContext = this;
 		PackageInfo packageInfo;
 		try
 		{
@@ -208,8 +218,8 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 
 		setCustomActionBar();
 
-//		LocationDetail detail = new LocationDetail("Kerry Freight (USA), Inc","3200 NW 67th Ave. Bldg. 3 Suite 390 Miami, FL 33122 Miami","+1(305)402-0637","+1(305)747-5035",null,"mario.alfonso@kerrylogistics.com");
-//		markerClicked(detail);
+		LocationDetail detail = new LocationDetail("Kerry Freight (USA), Inc","3200 NW 67th Ave. Bldg. 3 Suite 390 Miami, FL 33122 Miami","+(305)12345678","+(305)4567890",null,"mario.alfonso@kerrylogistics.com");
+		markerClicked(detail);
 	}
 
 	// @Override
@@ -241,179 +251,54 @@ public class InnerMapActivity extends AppCompatActivity implements BaiduMapFragm
 		if (detail == null) {
 			return;
 		}
+		String homePage = "http://www.apexshipping.com";
+		Bitmap photo = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
 
-		ArrayList<String> phoneArr = new ArrayList<>();
-		phoneArr.add(detail.Tel);
-		ArrayList<String> faxArr = new ArrayList<>();
-		faxArr.add(detail.Fax);
-		ArrayList<String> emailArr = new ArrayList<>();
-		emailArr.add(detail.Email);
-
-		final Contact newContact = new Contact();
-		newContact.name = detail.Name;
-		newContact.street = detail.Addr;
-		newContact.phoneArray = phoneArr;
-		newContact.faxArray = faxArr;
-		newContact.emailArray = emailArr;
-
-		Contact contact = null;
-		try {
-			contact = getContact(newContact.name);
-		} catch (Throwable throwable) {
-			throwable.printStackTrace();
-			contact = null;
-		}
-
-		if (contact == null) {
-
-			insertContact(newContact);
+		final Contact contact = new Contact();
+		contact.setName(detail.Name);
+		contact.setAddress(detail.Addr);
+		contact.setNumber(detail.Tel);
+		contact.setFax(detail.Fax);
+		contact.setEmail(detail.Email);
+		contact.setHomePage(homePage);
+		contact.setPhoto(photo);
 
-		} else {
+		final ContactsManager cm = new ContactsManager(this.getContentResolver());
+		if (cm.contactExist(contact.getName())) {
 
-			final Contact deleteContact = contact;
 			new AlertDialog.Builder(this)
 					.setTitle("Warning")
-					.setMessage(contact.name + " has exist in Contacts,do you wan to update it?")
+					.setTitle(contact.getName() + " has exist in contacts,do you want to update it?")
 					.setNegativeButton("No", new DialogInterface.OnClickListener() {
 						@Override
 						public void onClick(DialogInterface dialog, int which) {
-							insertContact(newContact);
+							// 需要用户手动保存
+							cm.insertContact(contact,mContext);
 						}
 					})
 					.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
 						@Override
 						public void onClick(DialogInterface dialog, int which) {
-							try {
-								deleteContact(deleteContact.contactId);
-								insertContact(newContact);
-
-							} catch (Exception e) {
-								e.printStackTrace();
-							}
+							Contact existContact = cm.searchContact(contact.getName());
+							cm.updateContact(existContact,contact);
+							// 显示编辑界面
+							String contactId = cm.getContactID(existContact.getName());
+							cm.editContact(contactId,mContext);
 						}
 					})
 					.show();
+		} else {
+			// 自动保存,然后显示编辑
+//			cm.addContact(contact,true);
+//			// 显示编辑界面
+//			String contactId = cm.getContactID(contact.getName());
+//			editContact(contactId);
+
+			// 需要用户手动保存
+			cm.insertContact(contact,mContext);
 		}
 
 	}
 
 
-	public void deleteContact(String contactId)throws Exception{
-
-		ContentResolver cr = getContentResolver();
-
-		//第一步先删除Contacts表中的数据
-		cr.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{contactId+""});
-		//第二步再删除RawContacts表的数据
-		cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{contactId+""});
-	}
-
-	public Contact getContact(String contactName) throws Throwable {
-
-		if (contactName == null) {
-			return null;
-		}
-
-		//获取联系人信息的Uri
-		Uri uri = ContactsContract.Contacts.CONTENT_URI;
-		//获取ContentResolver
-		ContentResolver contentResolver = getContentResolver();
-		//查询数据,返回Cursor
-		Cursor cursor = contentResolver.query(uri, null, null, null, null);
-
-
-		while (cursor.moveToNext()) {
-
-			//获取联系人的ID
-			String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
-			//获取联系人的姓名
-			String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
-
-			String lookupKey = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
-
-
-
-			if (name != null && name.equals(contactName)) {
-
-				Contact contact = new Contact();
-
-				contact.name = name;
-				contact.contactId = contactId;
-				contact.uri = ContactsContract.Contacts.getLookupUri(Integer.valueOf(contactId), lookupKey);
-				return contact;
-			}
-		}
-		return null;
-	}
-
-	public void insertContact(Contact contact) {
-
-		if (contact == null) {
-			return;
-		}
-		// Creates a new Intent to insert a contact
-		Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);
-// Sets the MIME type to match the Contacts Provider
-		intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
-
-		// Name
-		intent.putExtra(ContactsContract.Intents.Insert.NAME,contact.name);
-
-
-		// Photo
-//        editIntent.putExtra(ContactsContract.Intents.ATTACH_IMAGE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
-
-
-		// HomePage
-//        editIntent.putExtra(ContactsContract.Intents.Insert.IM_HANDLE,);
-//        editIntent.putExtra(ContactsContract.Intents.Insert., ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
-
-		// Street
-		if (contact.city == null) {
-			contact.city = "";
-		}
-		intent.putExtra(ContactsContract.Intents.Insert.POSTAL, contact.city + " " + contact.street);
-		intent.putExtra(ContactsContract.Intents.Insert.POSTAL_TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK);
-
-		// Phone
-		for (int i = 0;i < contact.phoneArray.size(); i++) {
-			String phone = contact.phoneArray.get(i);
-			// Inserts a phone number
-			intent.putExtra(ContactsContract.Intents.Insert.PHONE, phone);
-			intent.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK);
-		}
-
-		// Fax
-		for (int i = 0;i < contact.faxArray.size(); i++) {
-			String fax = contact.faxArray.get(i);
-			// Inserts a phone number
-			intent.putExtra(ContactsContract.Intents.Insert.PHONE, fax);
-			intent.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK);
-		}
-
-		// Email
-		for (int i = 0;i < contact.emailArray.size(); i++) {
-			String email = contact.emailArray.get(i);
-			// Inserts a phone number
-			intent.putExtra(ContactsContract.Intents.Insert.EMAIL, email);
-			intent.putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
-		}
-
-		startActivity(intent);
-
-	}
-
-	public class Contact {
-		ArrayList<String> phoneArray = new ArrayList<>();
-		ArrayList<String> emailArray = new ArrayList<>();
-		ArrayList<String> faxArray = new ArrayList<>();
-		String city;
-		String street;
-		String homePage;
-		String photo;
-		String name;
-
-		Uri uri;
-		String contactId;
-	}
 }