给大家分享一下我的一个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
+ "]";
} }

android经常使用的电话操作的更多相关文章

  1. Android Bitmap 载入与像素操作

    Android Bitmap 载入与像素操作 一:载入与像素读写 在Android SDK中,图像的像素读写能够通过getPixel与setPixel两个Bitmap的API实现. Bitmap AP ...

  2. [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888

    [Android]通过JNI访问并操作Bitmap的元素,支持RGB565和ARGB8888 标签: androidbitmapjni 2014-05-09 20:35 2985人阅读 评论(1) 收 ...

  3. Android进阶(六)文件读操作

    Android中文件的读写操作与Java中文件的读写操作是有区别的.在Java中,读文件操作如以下代码所示: public class FileRead { private static final  ...

  4. Android学习记录(2)—Android中数据库的常见操作

    android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...

  5. (转载)Mac系统下利用ADB命令连接android手机并进行文件操作

    Mac系统下利用ADB命令连接android手机并进行文件操作 标签: Mac adb android 2016-03-14 10:09 5470人阅读 评论(1) 收藏 举报  分类: Androi ...

  6. Android初级教程实现电话录音

    需求:设置来电后自动录音. 首先设置一个按钮,代码很简单这里就不再给出. 建一个类,RecorderServicer extends Service package com.ydl.recorder; ...

  7. Mono for Android—初体验之“电话拨号器”

    1.Main.axml文件: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmln ...

  8. Android随笔之——模拟按键操作的几种方式

    前几天转过一篇Android上模拟按键操作.触屏事件的博客,昨天又去找了百度.谷歌了一下,写了一点简单的测试代码,留待不时之需.有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使 ...

  9. android基于GPS实现定位操作

    一.定位的三种方式 1.wifi定位,ip地址定位,通过ip地址进行查询实际地址: 2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来 ...

随机推荐

  1. Hadoop插件安装

    1.首先下载Hadoop对应版本的插件,以Hadoop 1.0版本对应的插件Hadoop-eclipse-plugin1.0.3.jar为例 2.将下载的插件放置到Ecplise安装目录的plugin ...

  2. Hibernate学习之关系映射(转)

    一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...

  3. ExtJS4.2学习(二)——入门基础

    1.工程的目录结构: src里放后台的文件,WebRoot里放前台的文件. index.html或者index.jsp等是整个项目的首页,在首页我们要引入ExtJS的CSS样式文件和ExtJS的核心类 ...

  4. Android 逆向工程之步骤

    PS:本系列文章中所涉及到的技术.数据和接口地址,仅供学习交流,务必不可做坏事或者是用于商业用途!否则后果自负! 来源:http://blog.csdn.net/zhaokaiqiang1992 逆向 ...

  5. hdu 4033 Regular Polygon 计算几何 二分+余弦定理

    题目链接 给一个n个顶点的正多边形, 给出多边形内部一个点到n个顶点的距离, 让你求出这个多边形的边长. 二分边长, 然后用余弦定理求出给出的相邻的两个边之间的夹角, 看所有的加起来是不是2Pi. # ...

  6. Multiwii 代码解读

    GPS部分 GPS_angle[ROLL]   = (nav[LON]*cos_yaw_x - nav[LAT]*sin_yaw_y) /10;GPS_angle[PITCH]  = (nav[LON ...

  7. Java中print、printf、println的区别(转载)

    printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.p ...

  8. 转:trie树--详解

    前几天学习了并查集和trie树,这里总结一下trie. 本文讨论一棵最简单的trie树,基于英文26个字母组成的字符串,讨论插入字符串.判断前缀是否存在.查找字符串等基本操作:至于trie树的删除单个 ...

  9. poj1363Rails(栈模拟)

    主题链接: id=1363">啊哈哈,点我点我 思路: 这道题就是一道简单的栈模拟. .. .我最開始认为难处理是当出栈后top指针变化了. .当不满足条件时入栈的当前位置怎么办.这时 ...

  10. iOS中Block介绍(二)内存管理与其他特性

    我们在前一章介绍了block的用法,而正确使用block必须要求正确理解block的内存管理问题.这一章,我们只陈述结果而不追寻原因,我们将在下一章深入其原因. 一.block放在哪里 我们针对不同情 ...