使用内容提供者访问短信内容
内容提供者contentProvider(对外暴露自己程序的数据)---内容解析者 contentreslover(访问暴露出来的数据)
使用内容提供者暴露出来uri,对数据库进行操作,
获取短信内容:
import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.text.format.Time; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; /* 功能:获取手机里的所有短信信息,其实就是访问系统程序暴露出来的数据库,我们可以进行增删改查的操作 数据库位置: 1.data/data/com.android.provider.telephony /database/mmssms.db 2.表的名称 : sms 3.关键字段: address电话号码,date发送和接收短信的时间(毫秒值),type值: 1表示接收的短信 2.发送的短信. body短信内容 4.访问插入时需要权限: <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/> 实现的步骤: 1.初始化控件 2.初始化数据 1.获得contentResolver 2.获得访问短信内容查询的uri 3.调用内容提供者的查询方法,并得到结果 4.解析cursor得到数据,封装成list 5.实现适配器 6.设置适配器 */ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private ListView lvSmss; private List<Sms> smsDatalist;//装数据库的数据封装到该集合显示到listView @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lvSmss = (ListView) findViewById(R.id.lv_smss);//初始化控件 insertData();//插入数据 smsDatalist = getSmsListFromDb();//得到数据库的数据 //添加适配器 SmsBaseAdapter smsBaseAdapter = new SmsBaseAdapter(); lvSmss.setAdapter(smsBaseAdapter); } //为listview添加数据的适配器 class SmsBaseAdapter extends BaseAdapter{ @Override public int getCount() { return smsDatalist.size(); } @Override public Object getItem(int position) { return smsDatalist.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder viewHolder; if(view == null){ viewHolder = new ViewHolder(); view = View.inflate(MainActivity.this, R.layout.listview_sms_item, null); viewHolder.tvAddress = (TextView) view.findViewById(R.id.tv_address); viewHolder.tvBody = (TextView) view.findViewById(R.id.tv_body); viewHolder.tvDate = (TextView) view.findViewById(R.id.tv_date); viewHolder.tvType = (TextView) view.findViewById(R.id.tv_type); view.setTag(viewHolder); }else{ viewHolder = (ViewHolder) view.getTag(); } //填充数据 Sms sms = smsDatalist.get(position); viewHolder.tvAddress.setText(sms.getAddress()); //先判断类型,根据类型判断是接收的短信还是发送出去的短信 String type ="发送"; if(sms.getType() == 1){ type = "接收"; }else if(sms.getType() == 2){ type = "发送"; } viewHolder.tvType.setText(type); viewHolder.tvBody.setText(sms.getBody()); //先把时间转换成时间格式 viewHolder.tvDate.setText(getDateFormat(sms.getDate())); return view; } } class ViewHolder{ public TextView tvAddress,tvType,tvDate,tvBody; } //查询数据库数据 private List<Sms> getSmsListFromDb(){ ArrayList<Sms> dataList = new ArrayList<Sms>(); // 获得contentresolver ContentResolver contentResolver = getContentResolver(); // 申明访问短信的uri String smsUriString = "content://sms"; Cursor cursor = contentResolver.query(Uri.parse(smsUriString), new String[] { "_id", "address", "date", "type", "body" }, null, null, null); /* * 参数说明: 这里获取id值方便于对数据库进行增删改查的操作 * String[] projection, 查询结果需要的列名 * String selection, where条件 * String[] selectionArgs, 会依次替换前一个参数的占位符 String * sortOrder 排序 */ while (cursor.moveToNext()) { Sms sms = new Sms();// 短信类 // 解析cursor封装对象 sms.set_id(cursor.getInt(cursor.getColumnIndex("_id")));// 该短信在数据库中的id值 sms.setAddress(cursor.getString(cursor.getColumnIndex("address")));// 电话号码 sms.setBody(cursor.getString(cursor.getColumnIndex("body")));// 短信内容 sms.setDate(cursor.getLong(cursor.getColumnIndex("date")));// 时间 sms.setType(cursor.getInt(cursor.getColumnIndex("type")));// 类型 dataList.add(sms);// 将数据添加到集合 } return dataList; } /** * 向数据库插入一条短信记录 */ private void insertData() { ArrayList<Sms> dataList = new ArrayList<Sms>(); // 获得contentresolver ContentResolver contentResolver = getContentResolver(); // 申明访问短信的uri String smsUriString = "content://sms"; ContentValues contentValues = new ContentValues(); contentValues.put("address", "1380438438"); contentValues.put("type", 1); contentValues.put("body", "my is insert data"); // 向短信数据库插入语句 contentResolver.insert(Uri.parse(smsUriString), contentValues); } /** * 格式话时间 * @param date * @return */ public String getDateFormat(long date){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); return simpleDateFormat.format(new Date(date)); } }
短信类:Sms.java
/** * 信息类 * address,date,type,body都为短信里数据库的列名 */ public class Sms { private int _id;//这条短信在数据库中的id private String address;//电话号码 private long date;//发送和接收短信的时间(毫秒值) private int type;//1表示接收的短信 2.发送的短信 private String body;//短信内容 public int get_id() { return _id; } public void set_id(int _id) { this._id = _id; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } 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; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public String toString() { return "Sms [_id=" + _id + ", address=" + address + ", date=" + date + ", type=" + type + ", body=" + body + "]"; } }
效果图:
可见数据跟数据库(短信应用)里的一致
数据库的数据: