使用内容提供者访问短信内容

内容提供者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 + "]";
    }    
}

效果图:

   可见数据跟数据库(短信应用)里的一致

数据库的数据:

posted @ 2016-08-10 13:43  ts-android  阅读(968)  评论(0编辑  收藏  举报