android经常使用的电话操作
给大家分享一下我的一个Android工具类,能够获取手机里面的各种信息,包含拨打电话。 获取全部联系人姓名及电话,插入联系人姓名及电话,插入联系人姓名及电话。插入通话记录。获取用户全部短信。批量插入短信,读取文件从SDcard,写入文件到SDcard。
。。。。
package com.canlong.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.content.ContentProviderOperation; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteException; import android.net.Uri; import android.os.Environment; import android.provider.CallLog; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.StructuredName; import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.RawContacts.Data; import com.canlong.javabean.CallLogModel; import com.canlong.javabean.ContactsInfo; import com.canlong.javabean.SmsInfo; public class Util { /* * 检測SDcard是否正常 */ public static boolean checkSDcard() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } /* * 读取文件从SDcard */ public static String readFileFromSDcard(String path, String filename) throws IOException { if (!checkSDcard()) { return null; } path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + path; File dir = new File(path); if (!dir.exists()) dir.mkdirs(); FileInputStream inStream = new FileInputStream(new File(dir, filename)); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); outStream.close(); inStream.close(); return new String(data); } /* * 写入文件到SDcard */ public static boolean writeFileToSDcard(String path, String filename, String content, boolean append) throws IOException { byte[] buffer = content.getBytes(); if (!checkSDcard()) { return false; } path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + path; File dir = new File(path); if (!dir.exists()) dir.mkdirs(); FileOutputStream out = new FileOutputStream(new File(dir, filename), append); out.write(buffer); out.flush(); out.close(); return true; } /* * 拨打电话 */ public static void callPhone(String number, Context context) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); context.startActivity(intent); } /* * 获取全部联系人姓名及电话 */ public static List<ContactsInfo> getAllContacts(Context context) { List<ContactsInfo> resultList = new ArrayList<ContactsInfo>(); ContentResolver cr = context.getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cur.moveToNext()) { // 得到名字 String name = cur.getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 得到电话号码 String contactId = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); // 获取联系人的ID号,在SQLite中的数据库ID Cursor phone = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null); while (phone.moveToNext()) { String strPhoneNumber = phone .getString(phone .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); // 手机号码字段联系人可能不止一个 resultList.add(new ContactsInfo(name, strPhoneNumber)); } } return resultList; } /* * 插入联系人姓名及电话 */ public static void insertContacts(String name, String number, Context context) { if (name == null || number == null) return; ContentResolver cr = context.getContentResolver(); // 首先向RawContacts.CONTENT_URI运行一个空值插入,目的是获取系统返回的rawContactId ContentValues values = new ContentValues(); Uri rawContactUri = cr.insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); values.clear(); // 往data表入姓名数据 values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); values.put(StructuredName.DISPLAY_NAME, name); cr.insert(ContactsContract.Data.CONTENT_URI, values); // 往data表入电话数据 values.clear(); values.put(ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, number); values.put(Phone.TYPE, Phone.TYPE_MOBILE); cr.insert(ContactsContract.Data.CONTENT_URI, values); } /* * 批量插入联系人姓名及电话 */ public static void insertContactsList(List<ContactsInfo> listData, Context context) throws Exception { // 文档位置:reference\android\provider\ContactsContract.RawContacts.html ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ContentResolver cr = context.getContentResolver(); // 插入第几个人的信息 int rawContactInsertIndex = 0; for (int i = 0; i < listData.size(); i++) { ContactsInfo info = listData.get(i); // 插入当前编号人的空行 ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) .withValue(RawContacts.ACCOUNT_TYPE, null) .withValue(RawContacts.ACCOUNT_NAME, null).build()); // 插入当前编号人的姓名 ops.add(ContentProviderOperation .newInsert( android.provider.ContactsContract.Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue(StructuredName.GIVEN_NAME, info.getName()) .build()); // 插入当前编号人的电话 ops.add(ContentProviderOperation .newInsert( android.provider.ContactsContract.Data.CONTENT_URI) .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue(Phone.NUMBER, info.getNumber()) .withValue(Phone.TYPE, Phone.TYPE_MOBILE).build()); // rawContactInsertIndex++; cr.applyBatch(ContactsContract.AUTHORITY, ops); ops.clear(); } } /* * 插入通话记录 */ public static boolean insertCallLog(List<CallLogModel> listDate,Context context){ for(int i=0;i<listDate.size();i++){ CallLogModel info = listDate.get(i); ContentValues values = new ContentValues(); values.put(CallLog.Calls.NUMBER, info.getNumber()); values.put(CallLog.Calls.DATE, info.getDate()); values.put(CallLog.Calls.DURATION, info.getDuration()); values.put(CallLog.Calls.TYPE,info.getType()); values.put(CallLog.Calls.NEW, info.getRend());//0已看1未看 context.getContentResolver().insert(CallLog.Calls.CONTENT_URI, values); } return true; } /* * 获取用户全部短信 */ public static List<SmsInfo> getAllSms(Context context) { List<SmsInfo> list = new ArrayList<SmsInfo>(); final String SMS_URI_ALL = "content://sms/"; try { ContentResolver cr = context.getContentResolver(); String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" }; Uri uri = Uri.parse(SMS_URI_ALL); Cursor cur = cr.query(uri, projection, null, null, "date desc"); while (cur.moveToNext()) { String name; String phoneNumber; String smsbody; long date; int type; name = cur.getString(cur.getColumnIndex("person")); phoneNumber = cur.getString(cur.getColumnIndex("address")); smsbody = cur.getString(cur.getColumnIndex("body")); date = Long.parseLong(cur.getString(cur .getColumnIndex("date"))); type = cur.getInt(cur.getColumnIndex("type")); // Uri personUri = Uri.withAppendedPath( // ContactsContract.PhoneLookup.CONTENT_FILTER_URI, // phoneNumber); // Cursor localCursor = cr.query(personUri, new String[] { // PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID, // PhoneLookup._ID }, null, null, null); // // if (localCursor.getCount() != 0) { // localCursor.moveToFirst(); // name = localCursor.getString(localCursor // .getColumnIndex(PhoneLookup.DISPLAY_NAME)); // } if (smsbody == null) smsbody = ""; list.add(new SmsInfo(name, phoneNumber, smsbody, date, type)); } } catch (SQLiteException ex) { } return list; } /* * 批量插入短信 */ public static boolean insertSmsList(List<SmsInfo> listData, Context context) { Uri mSmsUri = Uri.parse("content://sms/inbox"); for (int i = 0; i < listData.size(); i++) { SmsInfo info = listData.get(i); ContentValues values = new ContentValues(); values.put("address", info.getNumber()); values.put("body", info.getContent()); values.put("date", info.getDate()); values.put("read", info.getRead()); values.put("type", info.getType()); //values.put("service_center", "+8613010776500"); context.getContentResolver().insert(mSmsUri, values); } return true; } public static String getMD5(String instr) { String s = null; char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { java.security.MessageDigest md = java.security.MessageDigest .getInstance("MD5"); md.update(instr.getBytes()); byte tmp[] = md.digest(); char str[] = new char[16 * 2]; int k = 0; for (int i = 0; i < 16; i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } s = new String(str).toUpperCase(); } catch (Exception e) { } return s; } }
以上所涉及到的JavaBean
package com.canlong.javabean; public class CallLogModel { private String number; private long date; private long duration;//以秒为单位 private int type;//1来电 2已拨 3未接 private int rend;//0已看1未看 public CallLogModel(){} public CallLogModel(String number, long date, long duration, int type, int rend) { this.number = number; this.date = date; this.duration = duration; this.type = type; this.rend = rend; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public long getDate() { return date; } public void setDate(long date) { this.date = date; } public long getDuration() { return duration; } public void setDuration(long duration) { this.duration = duration; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getRend() { return rend; } public void setRend(int rend) { this.rend = rend; } @Override public String toString() { return "CallLogModel [number=" + number + ", date=" + date + ", duration=" + duration + ", type=" + type + ", rend=" + rend + "]"; } }
package com.canlong.javabean; public class ContactsInfo { private String name; private String number; public ContactsInfo(){} public ContactsInfo(String name, String number) { this.name = name; this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
package com.canlong.javabean; public class SmsInfo { private String linkman;//联系人 private String number;//联系号码 private String content; private long date; private int read;//0未读 1已读 private int type;//联系类型 1接收 2发送 3草稿 public SmsInfo(){} public SmsInfo(String linkman, String number, String content, long date, int type) { this.linkman = linkman; this.number = number; this.content = content; this.date = date; this.type = type; } public SmsInfo(String linkman, String number, String content, long date, int read, int type) { this.linkman = linkman; this.number = number; this.content = content; this.date = date; this.read = read; this.type = type; } public int getRead() { return read; } public void setRead(int read) { this.read = read; } public String getLinkman() { return linkman; } public void setLinkman(String linkman) { this.linkman = linkman; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public long getDate() { return date; } public void setDate(long date) { this.date = date; } public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String toString() { return "SmsInfo [linkman=" + linkman + ", number=" + number + ", content=" + content + ", date=" + date + ", type=" + type + "]"; } }