Android 短信箱操作

package blackice.android.product;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class SmsAssistantActivity extends ListActivity {
    private List<Map<String, Object>> mData;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        /*
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        */
        super.onCreate(savedInstanceState);
        mData = GetSmsData();
        MyAdapter adapter = new MyAdapter(this);
        setListAdapter(adapter);
    }
    //菜单操作
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, Menu.FIRST + 1, 3, "退出").setIcon(android.R.drawable.ic_delete);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

        case Menu.FIRST + 1:
            //Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show();
            finish();
            break;
        }
        return false;

    }
    //列表点击
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

    }
    public void showInfo(){
        new AlertDialog.Builder(this)
        .setTitle("自定义listview")
        .setMessage("自定义内容!")
        .setPositiveButton("关闭", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        })
        .show();
    }
    public void SendMessageToServer(int position){
        Toast.makeText(this, (String)mData.get(position).get("title"), Toast.LENGTH_LONG).show();

        
    }
    //////////////////////////////////自定义列表///////////////////////////////////////////
    public class MyAdapter extends BaseAdapter
    {
        private LayoutInflater mInflater;    
        public MyAdapter(Context context){
            this.mInflater = LayoutInflater.from(context);
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mData.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            
            ViewHolder holder = null;
            if (convertView == null) {
                
                holder=new ViewHolder();  
                
                convertView = mInflater.inflate(R.layout.vlist2, null);
                holder.img = (ImageView)convertView.findViewById(R.id.img);
                holder.title = (TextView)convertView.findViewById(R.id.title);
                holder.info = (TextView)convertView.findViewById(R.id.info);
                holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
                convertView.setTag(holder);
                
            }else {
                holder = (ViewHolder)convertView.getTag();
            }
            
            
            holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
            holder.title.setText((String)mData.get(position).get("title"));
            holder.info.setText((String)mData.get(position).get("info"));
            
            holder.viewBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SendMessageToServer(position);
                }
            });
            return convertView;
        }
        
    }
    public final class ViewHolder{
        public ImageView img;
        public TextView title;
        public TextView info;
        public Button viewBtn;
    }
    ///////////////////////////////////短信读取//////////////////////////////////////////
    protected List<Map<String, Object>> GetSmsData() 
    {
        SmsHander smsHander = new SmsHander(this,"15802023933");

        smsHander.createSMSDatabase();                            // 创建SQLite数据库
        smsHander.insertSMSToDatabase();                        // 读取手机短信,插入SQLite数据库
        Cursor cursor = smsHander.querySMSInDatabase(100);        // 获取前100条短信(日期排序)

        cursor.moveToPosition(-1);
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
        while (cursor.moveToNext()) {
            //短信内容
            //String strAddress = cursor.getString(cursor.getColumnIndex("address"));
            String strDate = cursor.getString(cursor.getColumnIndex("date"));
            String strBody = cursor.getString(cursor.getColumnIndex("body"));
            String strAddress = cursor.getString(cursor.getColumnIndex("address"));

            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date(Long.parseLong(strDate));
            strDate = dateFormat.format(date);
            Map<String, Object> map = new HashMap<String, Object>();  
            map.put("img", android.R.drawable.ic_menu_add);//图像资源的ID  
            map.put("title", strDate);  
            map.put("info", strBody);  
            list.add(map);  
        }

        //smsList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
        if (!cursor.isClosed()) {
            cursor.close();
            cursor = null;
        }

        smsHander.closeSMSDatabase();
        return list;
    }
    public class SmsHander {

        SQLiteDatabase db;
        Context context;
        String phoneNumber;

        public SmsHander(Context context) {
            this.context = context;
        }
        public SmsHander(Context context,String mobile){
            this.context = context;
            this.phoneNumber = mobile;
        }
        //建库
        public void createSMSDatabase() {
            String sql = "create table if not exists sms("
                    + "_id integer primary key autoincrement,"
                    + "address varchar(255)," + "person varchar(255),"
                    + "body varchar(1024)," + "date varchar(255),"
                    + "type integer,isnew integer)";
            db = SQLiteDatabase.openOrCreateDatabase(context.getFilesDir().toString() + "/data.db3", null);            // 创建数据库连接
            db.execSQL(sql);
        }
        // 获取手机短信
        private Cursor getSMSInPhone() {
            Uri SMS_CONTENT = Uri.parse("content://sms/");
            String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" };
            Cursor cursor = context.getContentResolver().query(SMS_CONTENT, projection, "address=?", new String[]{this.phoneNumber}, "date desc");    // 获取手机短信
            //Cursor cursor = context.getContentResolver().query(SMS_CONTENT, projection, null,null, "date desc");    // 获取手机短信
            return cursor;
        }

        // 保存手机短信到 SQLite 数据库
        public void insertSMSToDatabase() {
            Long lastTime;
            Cursor dbCount = db.rawQuery("select count(*) from sms", null);
            dbCount.moveToFirst();
            if (dbCount.getInt(0) > 0) {
                Cursor dbcur = db.rawQuery("select * from sms order by date desc limit 1", null);
                dbcur.moveToFirst();
                lastTime = Long.parseLong(dbcur.getString(dbcur.getColumnIndex("date")));
            } else {
                lastTime = new Long(0);
            }
            dbCount.close();
            dbCount = null;

            Cursor cur = getSMSInPhone(); // 获取短信(游标)
            db.beginTransaction(); // 开始事务处理
            if (cur.moveToFirst()) {
                String address;
                String person;
                String body;
                String date;
                int type;
                long intDate;

                int iAddress = cur.getColumnIndex("address");
                int iPerson = cur.getColumnIndex("person");
                int iBody = cur.getColumnIndex("body");
                int iDate = cur.getColumnIndex("date");
                int iType = cur.getColumnIndex("type");
                int IsNew = 0;
                do {
                    
                    address = cur.getString(iAddress);
                    person = cur.getString(iPerson);
                    body = cur.getString(iBody);
                    date = cur.getString(iDate);
                    type = cur.getInt(iType);
                    intDate = Long.parseLong(date);
                    /*                     */
                    if((!ExistSms(address,date))&&address.equalsIgnoreCase(this.phoneNumber)){
                        System.out.println("此日期此短信不在库中");
                        if (intDate > lastTime) {
                            String sql = "insert into sms values(null, ?, ?, ?, ?, ?,?)";
                            Object[] bindArgs = new Object[] { address, person, body, date, type,IsNew};
                            db.execSQL(sql, bindArgs);
                        } else {
                            break;
                        }
                    }else
                    {
                        System.out.println("此日期此短信已在库中或不是此号码");
                    }

                } while (cur.moveToNext());
                cur.close();
                cur = null;
                db.setTransactionSuccessful();     // 设置事务处理成功,不设置会自动回滚不提交
                db.endTransaction();             // 结束事务处理
            }

        }

        // 获取 SQLite 数据库中的全部短信
        public Cursor querySMSFromDatabase() {
            String sql = "select * from sms order by date desc";
            return db.rawQuery(sql, null);
        }
        // 获取 SQLite 数据库中的最新 size 条短信
        public Cursor querySMSInDatabase(int size) {
            String sql;

            Cursor dbCount = db.rawQuery("select count(*) from sms", null);
            dbCount.moveToFirst();
            if (size < dbCount.getInt(0)) { // 不足 size 条短信,则取前 size 条
                sql = "select * from sms order by date desc limit " + size;
            } else {
                sql = "select * from sms order by date desc";
            }
            dbCount.close();
            dbCount = null;

            return db.rawQuery(sql, null);
        }
        // 获取 SQLite 数据库中指定号码的最新 size 条短信
        public Cursor querySMSInDatabase(int size,String mobile) {
            String sql;
            String testSql = "select count(*) from sms where address='"+ mobile +"%'";

            Cursor dbCount = db.rawQuery(testSql, null);

            dbCount.moveToFirst();
            if (size < dbCount.getInt(0)) { // 不足 size 条短信,则取前 size 条
                sql = "select * from sms where address='"+ mobile ;
                sql += "' order by date desc";
                sql += " limit " + size;
            } else {
                sql = "select * from sms where address='"+ mobile +"'";
                sql += " order by date desc";
            }
            
            dbCount.close();
            dbCount = null;

            return db.rawQuery(sql, null);
        }
        // 获取 SQLite数据库的前 second秒短信
        public Cursor getSMSInDatabaseFrom(long second) {
            long time = System.currentTimeMillis() / 1000 - second;
            String sql = "select * from sms order by date desc where date > " + time;
            return db.rawQuery(sql, null);
        }
        //检查此日期此号码是否有过短信
        protected boolean ExistSms(String mobile,String time){
            String sql = "select * from sms where address='"+mobile+"' and date='" +time +"'";
            Cursor dbCount = db.rawQuery(sql, null);
            return dbCount.getCount()>0;

        }
        // 关闭数据库
        public void closeSMSDatabase() {
            if (db != null && db.isOpen()) {
                db.close();
                db = null;
            }
        }
    }
}
原文地址:https://www.cnblogs.com/blackice/p/5418828.html