File indexing completed on 2024-05-19 04:47:20
0001 package com.kde.maui.tools; 0002 0003 import android.provider.ContactsContract; 0004 import android.database.Cursor; 0005 import android.app.Activity; 0006 import android.os.Build; 0007 import android.graphics.Bitmap; 0008 import android.graphics.BitmapFactory; 0009 import android.net.Uri; 0010 0011 import java.util.ArrayList; 0012 import java.util.HashMap; 0013 import java.util.Map; 0014 import java.util.List; 0015 import java.io.ByteArrayInputStream; 0016 import java.io.InputStream; 0017 import java.text.SimpleDateFormat; 0018 import java.util.Date; 0019 0020 import android.accounts.AccountManager; 0021 import android.accounts.Account; 0022 import android.content.ContentResolver; 0023 import android.content.ContentUris; 0024 import android.content.ContentValues; 0025 import android.content.ContentProviderOperation; 0026 import android.content.ContentProviderOperation.Builder; 0027 import android.content.Intent; 0028 import android.content.IntentFilter; 0029 import android.content.Context; 0030 import android.provider.CallLog.Calls; 0031 import android.provider.CallLog; 0032 0033 import android.telephony.gsm.SmsManager; 0034 0035 public class Union 0036 { 0037 enum KEY 0038 { 0039 N, 0040 TEL, 0041 TEL2, 0042 TEL3, 0043 EMAIL, 0044 EMAIL2, 0045 EMAIL3, 0046 PHOTO, 0047 ORG, 0048 TITLE, 0049 NICK 0050 } 0051 0052 public Union() {} 0053 0054 public static void sendSMS(Activity context, String tel, String subject, String message) 0055 { 0056 SmsManager smsManager = SmsManager.getDefault(); 0057 smsManager.sendTextMessage(tel, null, message, null, null); 0058 } 0059 0060 public static void call(Activity context, String tel) 0061 { 0062 // Intent callIntent = new Intent(Intent.ACTION_CALL); 0063 // callIntent.setData(Uri.parse("tel:" + tel)); 0064 0065 // context.startActivity(callIntent); 0066 0067 0068 0069 Intent callIntent = new Intent(Intent.ACTION_CALL); 0070 // callIntent.setPackage("com.android.phone"); // force native dialer (Android < 5) 0071 callIntent.setPackage("com.android.server.telecom"); // force native dialer (Android >= 5) 0072 callIntent.setData(Uri.parse("tel:" + tel)); 0073 callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 0074 context.startActivity(callIntent); 0075 } 0076 0077 0078 // public static void contacts() 0079 // { 0080 // Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 0081 // startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT); 0082 // } 0083 0084 0085 public static HashMap<String, String> getContact(Context c, String id) 0086 { 0087 HashMap<String, String> res = new HashMap<String, String>(); 0088 0089 String email = "", org = "", title = ""; 0090 0091 ContentResolver cr = c.getContentResolver(); 0092 0093 //ADD E-MAIL DATA... 0094 Cursor emailCursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, 0095 null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 0096 new String[]{id}, 0097 null); 0098 0099 if (emailCursor != null) 0100 if (emailCursor.moveToFirst()) 0101 email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 0102 0103 0104 if (emailCursor != null) 0105 emailCursor.close(); 0106 0107 //ADD ORG DATA... 0108 Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI, 0109 null, ContactsContract.Data.CONTACT_ID + " = ?", 0110 new String[]{id}, 0111 null); 0112 0113 if (orgCur != null) 0114 if (orgCur.moveToFirst()) 0115 { 0116 org = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)) == null ? "" : orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); 0117 title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)) == null ? "" : orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); 0118 } 0119 0120 // //ADD ADDRESS DATA... 0121 // Cursor addrCursor = c.getContentResolver().query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, 0122 // null, ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?", 0123 // new String[]{id}, 0124 // null); 0125 0126 // if (addrCursor != null) 0127 // { 0128 // int i = 0; 0129 0130 // while (addrCursor.moveToNext()) 0131 // { 0132 // if (i > 2) break; 0133 0134 // String city = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 0135 // String state = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 0136 // String country = addrCursor.getString(addrCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 0137 0138 // if (i == 0) 0139 // fetch += "<adr><city>" + city + "</city><state>" + state + "</state><country>" + country + "</country></adr>"; 0140 // else 0141 // fetch += "<adr" + Integer.toString(i) + "><city>" + city + "</city><state>" + state + "</state><country>" + country + "</country></adr>"; 0142 0143 // i++; 0144 // } 0145 // } 0146 0147 // if (addrCursor != null) 0148 // addrCursor.close(); 0149 0150 //Get Instant Messenger......... 0151 // String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 0152 // String[] imWhereParams = new String[]{id, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 0153 // Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI, null, imWhere, imWhereParams, null); 0154 0155 // if (imCur.moveToFirst()) 0156 // { 0157 // String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); 0158 // String imType; 0159 // imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE)); 0160 0161 // fetch += "<im><nickname>" + imName + "</nickname><type>" + imType + "</type></im>"; 0162 0163 // } 0164 0165 // if (imCur != null) 0166 // imCur.close(); 0167 0168 0169 res.put("email", email == null ? "" : email); 0170 res.put("org", org == null ? "" : org); 0171 res.put("title", title == null ? "" : title); 0172 0173 return res; 0174 } 0175 0176 public static Bitmap loadContactPhoto(Context c, String id) 0177 { 0178 System.out.println("GETTIGN CONTACT IMAGE " + id); 0179 ContentResolver cr = c.getContentResolver(); 0180 Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id)); 0181 InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri); 0182 if (input == null) { 0183 System.out.println("GETTIGN CONTACT IMAGE: NO IMAGE"); 0184 0185 return null; 0186 } 0187 0188 System.out.println("GETTIGN CONTACT IMAGE: GOT IMAGE"); 0189 0190 return BitmapFactory.decodeStream(input); 0191 } 0192 0193 0194 // private static String[] convertColumns(String columns) 0195 // { 0196 //// String[] res = new String[]; 0197 0198 //// final HashMap<String, int> map = new HashMap<String, int>(); 0199 //// map.put("fav", ContactsContract.Contacts.STARRED); 0200 //// map.put("fav", ContactsContract.Contacts.STARRED); 0201 //// map.put("fav", ContactsContract.Contacts.STARRED); 0202 0203 //// for(String value : columns.split(",")) 0204 //// { 0205 0206 //// } 0207 0208 //// return res; 0209 0210 // } 0211 0212 private static List<Integer> getRawContactsIdList(Context c) 0213 { 0214 List<Integer> ret = new ArrayList<Integer>(); 0215 0216 ContentResolver contentResolver = c.getContentResolver(); 0217 0218 // Row contacts content uri( access raw_contacts table. ). 0219 // Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI; 0220 Uri rawContactUri = ContactsContract.Contacts.CONTENT_URI; 0221 // Return _id column in contacts raw_contacts table. 0222 final String queryColumnArr[] = {ContactsContract.Contacts._ID}; 0223 // Query raw_contacts table and return raw_contacts table _id. 0224 // final String RAW_CONTACT_SELECTION = ContactsContract.RawContacts.DELETED + " = 0 "; 0225 0226 Cursor cursor = contentResolver.query(rawContactUri,queryColumnArr, null, null, null); 0227 if(cursor!=null) 0228 { 0229 cursor.moveToFirst(); 0230 do{ 0231 int idColumnIndex = cursor.getColumnIndex(ContactsContract.Contacts._ID); 0232 int rawContactsId = cursor.getInt(idColumnIndex); 0233 ret.add(new Integer(rawContactsId)); 0234 }while(cursor.moveToNext()); 0235 } 0236 0237 cursor.close(); 0238 0239 return ret; 0240 } 0241 0242 public static List<HashMap<String, String>> fetchContacts(Context c) 0243 { 0244 System.out.println("FETCHING CONTACTS"); 0245 List<HashMap<String,String>> res = new ArrayList<HashMap<String, String>>(); 0246 0247 0248 0249 ContentResolver cr = c.getContentResolver(); 0250 0251 final String[] projection = new String[] 0252 { 0253 ContactsContract.Contacts._ID, 0254 ContactsContract.Contacts.DISPLAY_NAME, 0255 ContactsContract.Contacts.STARRED, 0256 ContactsContract.Contacts.PHOTO_URI 0257 }; 0258 0259 Cursor mainCursor = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, null); 0260 if (mainCursor != null) 0261 { 0262 while (mainCursor.moveToNext()) 0263 { 0264 String tel = "", accountName = "" , accountType= ""; 0265 String id = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts._ID)); 0266 String fav = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.STARRED)); 0267 String name = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 0268 String photo = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)); 0269 0270 0271 //ADD ACCOUNT DATA... 0272 0273 final String[] accountProjection = new String[] { 0274 ContactsContract.RawContacts.ACCOUNT_NAME, 0275 ContactsContract.RawContacts.ACCOUNT_TYPE 0276 }; 0277 Cursor accountCursor = cr.query(ContactsContract.RawContacts.CONTENT_URI, 0278 accountProjection, 0279 ContactsContract.RawContacts.CONTACT_ID + " = ?", 0280 new String[]{id}, 0281 null); 0282 0283 if (accountCursor != null) 0284 if (accountCursor.moveToFirst()) 0285 { 0286 accountName = accountCursor.getString(accountCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); 0287 accountType = accountCursor.getString(accountCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); 0288 } 0289 0290 0291 if (accountCursor != null) 0292 accountCursor.close(); 0293 0294 Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 0295 new String[] {ContactsContract.CommonDataKinds.Phone.NUMBER}, 0296 ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 0297 new String[]{id}, 0298 null); 0299 0300 if (phoneCursor != null) 0301 if (phoneCursor.moveToFirst()) 0302 tel = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 0303 0304 0305 if (phoneCursor != null) 0306 phoneCursor.close(); 0307 0308 0309 0310 HashMap<String, String> contact = new HashMap<String, String>(); 0311 contact.put("id", id); 0312 contact.put("fav", fav == null ? "" : fav); 0313 contact.put("tel", tel == null ? "" : tel); 0314 // contact.put("email", email == null ? "" : email); 0315 contact.put("n", name == null ? "" : name); 0316 contact.put("account", accountName == null ? "" : accountName); 0317 contact.put("type", accountType == null ? "" : accountType); 0318 contact.put("photo", photo == null ? "" : photo); 0319 res.add(contact); 0320 0321 } 0322 0323 } 0324 0325 if (mainCursor != null) 0326 mainCursor.close(); 0327 0328 0329 //final String[] projection = new String[] { 0330 // ContactsContract.Data.CONTACT_ID, 0331 // ContactsContract.Data.MIMETYPE, 0332 // ContactsContract.Contacts.DISPLAY_NAME, 0333 // ContactsContract.Contacts.STARRED, 0334 // ContactsContract.Contacts.PHOTO_URI, 0335 // ContactsContract.CommonDataKinds.Phone.NUMBER, 0336 // ContactsContract.RawContacts.ACCOUNT_NAME, 0337 // ContactsContract.RawContacts.ACCOUNT_TYPE, 0338 // ContactsContract.CommonDataKinds.Email.ADDRESS 0339 //}; 0340 0341 // List<Integer> rawContactsIdList = getRawContactsIdList(c); 0342 // final int contactListSize = rawContactsIdList.size(); 0343 // System.out.println("ACCOUNTS LIST SIZE:" + contactListSize); 0344 // for(int i=0;i<contactListSize;i++) 0345 // { 0346 // // Get the raw contact id. 0347 // Integer rawContactId = rawContactsIdList.get(i); 0348 // final StringBuffer whereClauseBuf = new StringBuffer(); 0349 // whereClauseBuf.append(ContactsContract.Data.CONTACT_ID); 0350 // whereClauseBuf.append("="); 0351 // whereClauseBuf.append(rawContactId); 0352 0353 // Cursor mainCursor = cr.query(ContactsContract.Data.CONTENT_URI, projection, whereClauseBuf.toString(), null, null); 0354 0355 // if(mainCursor!=null && mainCursor.getCount() > 0) 0356 // { 0357 0358 // mainCursor.moveToFirst(); 0359 // long contactId = mainCursor.getLong(mainCursor.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 0360 // String fav = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.STARRED)); 0361 //// String name = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 0362 // String accountName = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_NAME)); 0363 // String accountType = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.RawContacts.ACCOUNT_TYPE)); 0364 //// String tel = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 0365 //// String email = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 0366 //// String photo = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)); 0367 0368 // HashMap<String, String> contact = new HashMap<String, String>(); 0369 // contact.put("id", Long.toString(contactId)); 0370 // contact.put("fav", fav == null ? "" : fav); 0371 //// contact.put("tel", tel == null ? "" : tel); 0372 //// contact.put("email", email == null ? "" : email); 0373 //// contact.put("n", name == null ? "" : name); 0374 // contact.put("account", accountName == null ? "" : accountName); 0375 // contact.put("type", accountType == null ? "" : accountType); 0376 //// contact.put("photo", photo == null ? "" : photo); 0377 0378 // do 0379 // { 0380 // // First get mimetype column value. 0381 // String mimeType = mainCursor.getString(mainCursor.getColumnIndex(ContactsContract.Data.MIMETYPE)); 0382 0383 // contact.putAll(getColumnValueByMimetype(mainCursor, mimeType)); 0384 0385 0386 // }while(mainCursor.moveToNext()); 0387 0388 // res.add(contact); 0389 0390 // } 0391 0392 // if (mainCursor != null) 0393 // mainCursor.close(); 0394 0395 // } 0396 return res; 0397 } 0398 0399 /* 0400 * Get email type related string format value. 0401 * */ 0402 private static String getEmailTypeString(int dataType) 0403 { 0404 String ret = ""; 0405 0406 if(ContactsContract.CommonDataKinds.Email.TYPE_HOME == dataType) 0407 { 0408 ret = "Home"; 0409 }else if(ContactsContract.CommonDataKinds.Email.TYPE_WORK==dataType) 0410 { 0411 ret = "Work"; 0412 } 0413 return ret; 0414 } 0415 0416 /* 0417 * Get phone type related string format value. 0418 * */ 0419 private static String getPhoneTypeString(int dataType) 0420 { 0421 String ret = ""; 0422 0423 if(ContactsContract.CommonDataKinds.Phone.TYPE_HOME == dataType) 0424 { 0425 ret = "Home"; 0426 }else if(ContactsContract.CommonDataKinds.Phone.TYPE_WORK==dataType) 0427 { 0428 ret = "Work"; 0429 }else if(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE==dataType) 0430 { 0431 ret = "Mobile"; 0432 } 0433 return ret; 0434 } 0435 0436 0437 private static HashMap<String, String> getColumnValueByMimetype(Cursor cursor, String mimeType) 0438 { 0439 HashMap<String, String> res = new HashMap<String, String>(); 0440 0441 switch (mimeType) 0442 { 0443 // Get email data. 0444 // case ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE : 0445 // // Email.ADDRESS == data1 0446 // String emailAddress = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 0447 // // Email.TYPE == data2 0448 // int emailType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 0449 // String emailTypeStr = getEmailTypeString(emailType); 0450 0451 // res.put("email", emailAddress); 0452 // res.put("email_type", Integer.toString(emailType)); 0453 // res.put("email_str_type", emailTypeStr); 0454 // break; 0455 0456 // Get im data. 0457 // case ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE: 0458 // // Im.PROTOCOL == data5 0459 // String imProtocol = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.PROTOCOL)); 0460 // // Im.DATA == data1 0461 // String imId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)); 0462 0463 // res.put("im", imProtocol); 0464 // res.put("im_id", imId); 0465 // break; 0466 0467 // Get nickname 0468 // case ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE: 0469 // // Nickname.NAME == data1 0470 // String nickName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME)); 0471 // res.put("nickname", nickName); 0472 // break; 0473 0474 // // Get organization data. 0475 // case ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE: 0476 // // Organization.COMPANY == data1 0477 // String company = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.COMPANY)); 0478 // // Organization.DEPARTMENT == data5 0479 // String department = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DEPARTMENT)); 0480 // // Organization.TITLE == data4 0481 // String title = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); 0482 // // Organization.JOB_DESCRIPTION == data6 0483 // String jobDescription = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION)); 0484 // // Organization.OFFICE_LOCATION == data9 0485 // String officeLocation = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.OFFICE_LOCATION)); 0486 0487 // res.put("org", company); 0488 // res.put("department", department); 0489 // res.put("title", title); 0490 // res.put("job_description", jobDescription); 0491 // res.put("office_location", officeLocation); 0492 // break; 0493 0494 // Get phone number. 0495 case ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE: 0496 // Phone.NUMBER == data1 0497 String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 0498 // Phone.TYPE == data2 0499 // int phoneTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 0500 // String phoneTypeStr = getPhoneTypeString(phoneTypeInt); 0501 0502 res.put("tel", phoneNumber);/* 0503 res.put("tel_type", Integer.toString(phoneTypeInt)); 0504 res.put("tel_str_type", phoneTypeStr);*/ 0505 break; 0506 0507 // Get sip address. 0508 // case ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE: 0509 // // SipAddress.SIP_ADDRESS == data1 0510 // String address = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS)); 0511 // // SipAddress.TYPE == data2 0512 // int addressTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.SipAddress.TYPE)); 0513 // String addressTypeStr = getEmailTypeString(addressTypeInt); 0514 0515 // res.put("address", address); 0516 // res.put("address_type", Integer.toString(addressTypeInt)); 0517 // res.put("address_str_type", addressTypeStr); 0518 // break; 0519 0520 // // Get display name. 0521 case ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE: 0522 // StructuredName.DISPLAY_NAME == data1 0523 String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 0524 // // StructuredName.GIVEN_NAME == data2 0525 // String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)); 0526 // // StructuredName.FAMILY_NAME == data3 0527 // String familyName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)); 0528 0529 res.put("n", displayName);/* 0530 res.put("name", givenName); 0531 res.put("lastname", familyName);*/ 0532 break; 0533 0534 // // Get postal address. 0535 // case ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE: 0536 // // StructuredPostal.COUNTRY == data10 0537 // String country = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 0538 // // StructuredPostal.CITY == data7 0539 // String city = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 0540 // // StructuredPostal.REGION == data8 0541 // String region = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION)); 0542 // // StructuredPostal.STREET == data4 0543 // String street = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 0544 // // StructuredPostal.POSTCODE == data9 0545 // String postcode = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 0546 // // StructuredPostal.TYPE == data2 0547 // int postType = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 0548 // String postTypeStr = getEmailTypeString(postType); 0549 0550 // res.put("country", country); 0551 // res.put("city", city); 0552 // res.put("region", region); 0553 // res.put("street", street); 0554 // res.put("postcode", postcode); 0555 // res.put("postcode_type", Integer.toString(postType)); 0556 // res.put("postcode_str_type", postTypeStr); 0557 // break; 0558 0559 // // Get identity. 0560 // case ContactsContract.CommonDataKinds.Identity.CONTENT_ITEM_TYPE: 0561 // // Identity.IDENTITY == data1 0562 // String identity = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Identity.IDENTITY)); 0563 // // Identity.NAMESPACE == data2 0564 // String namespace = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Identity.NAMESPACE)); 0565 0566 // res.put("identity", identity); 0567 // res.put("identity_namespace", namespace); 0568 // break; 0569 0570 // Get photo. 0571 case ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE: 0572 // Photo.PHOTO == data15 0573 String photo = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)); 0574 // Photo.PHOTO_FILE_ID == data14 0575 // String photoFileId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Photo.PHOTO_FILE_ID)); 0576 0577 res.put("photo", photo); 0578 // res.put("photo_file_id", photoFileId); 0579 break; 0580 0581 // // Get group membership. 0582 // case ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE: 0583 // // GroupMembership.GROUP_ROW_ID == data1 0584 // int groupId = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID)); 0585 // res.put("group", Integer.toString(groupId)); 0586 // break; 0587 0588 // // Get website. 0589 // case ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE: 0590 // // Website.URL == data1 0591 // String websiteUrl = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL)); 0592 // // Website.TYPE == data2 0593 // int websiteTypeInt = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Website.TYPE)); 0594 // String websiteTypeStr = getEmailTypeString(websiteTypeInt); 0595 0596 // res.put("url", websiteUrl); 0597 // res.put("url_type", Integer.toString(websiteTypeInt)); 0598 // res.put("url_str_type", websiteTypeStr); 0599 // break; 0600 0601 // // Get note. 0602 // case ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE: 0603 // // Note.NOTE == data1 0604 // String note = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE)); 0605 // res.put("note", note); 0606 // break; 0607 0608 } 0609 0610 return res; 0611 } 0612 0613 public static int APIVersion() 0614 { 0615 return Build.VERSION.SDK_INT; 0616 0617 } 0618 0619 0620 0621 public static void addContact(Context c, 0622 String name, 0623 String tel, 0624 String tel2, 0625 String tel3, 0626 String email, 0627 String title, 0628 String org, 0629 String photoUrl, 0630 String accountName, 0631 String accountType) 0632 { 0633 0634 String DisplayName = name; 0635 String MobileNumber = tel; 0636 String HomeNumber = tel2; 0637 String WorkNumber = tel3; 0638 String emailID = email; 0639 String company = org; 0640 String jobTitle = title; 0641 String photo = photoUrl; 0642 0643 ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 0644 0645 ops.add(ContentProviderOperation.newInsert( 0646 ContactsContract.RawContacts.CONTENT_URI) 0647 .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, accountType) 0648 .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, accountName) 0649 .build()); 0650 0651 //------------------------------------------------------ Names 0652 if (DisplayName != null) 0653 { 0654 ops.add(ContentProviderOperation.newInsert( 0655 ContactsContract.Data.CONTENT_URI) 0656 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0657 .withValue(ContactsContract.Data.MIMETYPE, 0658 ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 0659 .withValue( 0660 ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, 0661 DisplayName).build()); 0662 } 0663 0664 //------------------------------------------------------ Photo 0665 if (photo != null) 0666 { 0667 ops.add(ContentProviderOperation.newInsert( 0668 ContactsContract.Data.CONTENT_URI) 0669 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0670 .withValue(ContactsContract.Data.MIMETYPE, 0671 ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 0672 .withValue( 0673 ContactsContract.CommonDataKinds.Photo.PHOTO, 0674 photo).build()); 0675 } 0676 0677 //------------------------------------------------------ Mobile Number 0678 if (MobileNumber != null) 0679 { 0680 ops.add(ContentProviderOperation. 0681 newInsert(ContactsContract.Data.CONTENT_URI) 0682 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0683 .withValue(ContactsContract.Data.MIMETYPE, 0684 ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 0685 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, MobileNumber) 0686 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 0687 ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) 0688 .build()); 0689 } 0690 0691 //------------------------------------------------------ Home Numbers 0692 if (HomeNumber != null) 0693 { 0694 ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 0695 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0696 .withValue(ContactsContract.Data.MIMETYPE, 0697 ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 0698 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, HomeNumber) 0699 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 0700 ContactsContract.CommonDataKinds.Phone.TYPE_HOME) 0701 .build()); 0702 } 0703 0704 //------------------------------------------------------ Work Numbers 0705 if (WorkNumber != null) 0706 { 0707 ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 0708 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0709 .withValue(ContactsContract.Data.MIMETYPE, 0710 ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 0711 .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, WorkNumber) 0712 .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, 0713 ContactsContract.CommonDataKinds.Phone.TYPE_WORK) 0714 .build()); 0715 } 0716 0717 //------------------------------------------------------ Email 0718 if (emailID != null) 0719 { 0720 ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 0721 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0722 .withValue(ContactsContract.Data.MIMETYPE, 0723 ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 0724 .withValue(ContactsContract.CommonDataKinds.Email.DATA, emailID) 0725 .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) 0726 .build()); 0727 } 0728 0729 //------------------------------------------------------ Organization 0730 if (!company.equals("") && !jobTitle.equals("")) 0731 { 0732 ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 0733 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 0734 .withValue(ContactsContract.Data.MIMETYPE, 0735 ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) 0736 .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company) 0737 .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) 0738 .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, jobTitle) 0739 .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) 0740 .build()); 0741 } 0742 0743 // Asking the Contact provider to create a new contact 0744 try 0745 { 0746 c.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 0747 } catch (Exception e) 0748 { 0749 e.printStackTrace(); 0750 // Toast.makeText(myContext, "Exception: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 0751 } 0752 } 0753 0754 public static void updateContact(Context c, String id, String field, String value) 0755 { 0756 0757 ContentResolver cr = c.getContentResolver(); 0758 0759 String firstname = "Contact's first name"; 0760 String lastname = "Last name"; 0761 String number = "000 000 000"; 0762 0763 ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 0764 0765 Builder builder; 0766 switch(field) 0767 { 0768 0769 case "tel" : 0770 { 0771 // Number 0772 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 0773 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?"+ " AND " + ContactsContract.CommonDataKinds.Organization.TYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)}); 0774 builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, value); 0775 ops.add(builder.build()); 0776 break; 0777 } 0778 0779 case "n": 0780 { 0781 // Name 0782 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 0783 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}); 0784 builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, value); 0785 ops.add(builder.build()); 0786 break; 0787 0788 } 0789 0790 case "email": 0791 { 0792 // Name 0793 builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI); 0794 builder.withSelection(ContactsContract.Data.CONTACT_ID + "=?" + " AND " + ContactsContract.Data.MIMETYPE + "=?", new String[]{id, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}); 0795 builder.withValue(ContactsContract.CommonDataKinds.Email.DATA, value); 0796 ops.add(builder.build()); 0797 break; 0798 0799 } 0800 0801 case "fav": 0802 { 0803 0804 System.out.println("UPDATING CONTACT FAV " + field + " " + value); 0805 // Name 0806 builder = ContentProviderOperation.newUpdate(ContactsContract.Contacts.CONTENT_URI); 0807 builder.withSelection(ContactsContract.Contacts._ID + "=?", new String[]{id}); 0808 builder.withValue(ContactsContract.Contacts.STARRED, value); 0809 ops.add(builder.build()); 0810 break; 0811 0812 } 0813 0814 0815 0816 default: return; 0817 0818 } 0819 0820 // Update 0821 try 0822 { 0823 cr.applyBatch(ContactsContract.AUTHORITY, ops); 0824 } 0825 catch (Exception e) 0826 { 0827 e.printStackTrace(); 0828 } 0829 } 0830 0831 public static void shareContact(Context c, String id) 0832 { 0833 String lookupKey = id; 0834 System.out.println("SHARING COINTACT WITH ID "+id); 0835 final Uri shareUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey); 0836 final Intent intent = new Intent(Intent.ACTION_SEND); 0837 intent.setType(ContactsContract.Contacts.CONTENT_VCARD_TYPE); 0838 intent.putExtra(Intent.EXTRA_STREAM, shareUri); 0839 0840 0841 c.startActivity(Intent.createChooser(intent, "Share contact")); 0842 0843 0844 0845 } 0846 0847 public static String getAccounts(Context c) 0848 { 0849 Account[] accountList = AccountManager.get(c).getAccounts(); 0850 0851 String accountSelection = "<root>"; 0852 0853 for (int i = 0; i < accountList.length; i++) 0854 { 0855 String accountName = accountList[i].name; 0856 String accountType = accountList[i].type; 0857 0858 accountSelection += "<account><name>" + accountName + "</name><type>" + accountType + "</type></account>"; 0859 0860 } 0861 0862 accountSelection += "</root>"; 0863 return accountSelection; 0864 } 0865 0866 public static List<HashMap<String, String>> callLogs(Context c) 0867 { 0868 0869 System.out.println("GETTING CALL LOGS"); 0870 List<HashMap<String,String>> res = new ArrayList<HashMap<String, String>>(); 0871 String[] projection = new String[] { 0872 CallLog.Calls.CACHED_NAME, 0873 CallLog.Calls.NUMBER, 0874 CallLog.Calls.TYPE, 0875 CallLog.Calls.DATE, 0876 CallLog.Calls.DURATION, 0877 CallLog.Calls._ID, 0878 0879 }; 0880 // String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 0881 0882 Cursor cursor = c.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, null); 0883 while (cursor.moveToNext()) 0884 { 0885 String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); 0886 String tel = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); 0887 String type = cursor.getString(cursor.getColumnIndex(CallLog.Calls.TYPE)); // https://developer.android.com/reference/android/provider/CallLog.Calls.html#TYPE 0888 long seconds = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); // epoch time - https://developer.android.com/reference/java/text/DateFormat.html#parse(java.lang.String 0889 String duration = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DURATION)); 0890 String id = cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID)); 0891 String dir = null; 0892 switch (Integer.parseInt(type)) 0893 { 0894 case CallLog.Calls.OUTGOING_TYPE: 0895 dir = "OUTGOING"; 0896 break; 0897 0898 case CallLog.Calls.INCOMING_TYPE: 0899 dir = "INCOMING"; 0900 break; 0901 0902 case CallLog.Calls.MISSED_TYPE: 0903 dir = "MISSED"; 0904 break; 0905 } 0906 0907 0908 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm"); 0909 String time = formatter.format(new Date(seconds)); 0910 0911 HashMap map = new HashMap<String, String>(); 0912 map.put("n", name == null ? (tel == null ? "" : tel): name); 0913 map.put("tel", tel == null ? "" : tel); 0914 map.put("type", dir == null ? "" : dir); 0915 map.put("duration", duration == null ? "" : duration); 0916 map.put("id", id == null ? "" : id); 0917 map.put("date", time == null ? "" : time); 0918 res.add(map); 0919 } 0920 cursor.close(); 0921 0922 return res; 0923 } 0924 0925 }