简单的方法实例

package com.development.util.sms;

import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.nfc.Tag;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;

import com.example.gajah.mydemo.MainActivity;
import com.example.gajah.mydemo.smsdata;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created by Andy on 2015/6/8.
 */
public class SmsTools {
    private Context mContext;
    private static SmsTools mTools = null;
    private SQLiteOpenHelper helper;
    private SQLiteDatabase db;
    final String SMS_Action = "android.provider.Telephony.SMS_RECEIVED";

    /**
     * No need use out of the class
     *
     * @param context
     */
    public SmsTools(Context context) {
        this.mContext = context;
    }

    public static SmsTools getInstance(Context context) {
        if (mTools == null) {
            mTools = new SmsTools(context);
        }
        return mTools;
    }

    final String Tag = "MainActivity";

    /**
     * @param context      上下文
     * @param ReceiverName 接收器名称
     *                     注册短信接收器
     */
    public void registerSmsReceiver(Context context, BroadcastReceiver ReceiverName) {
        ReceiverName = new SmsReceiver();
        IntentFilter filter = new IntentFilter(SMS_Action);
        context.registerReceiver(ReceiverName, filter);
    }

    /**
     * @param context      上下文
     * @param ReceiverName 短信接收器名称
     *                     取消短信接收器的注册
     */
    public void unregisterSmsReceiver(Context context, BroadcastReceiver ReceiverName) {
        context.unregisterReceiver(ReceiverName);
    }

    /**
     * 打开数据库
     *
     * @param context
     */
    public void opendb(Context context) {
        helper = new SmsDatabase(mContext);
        db = helper.getWritableDatabase();
    }

    /**
     * 关闭数据库
     *
     * @param context
     */
    public void closedb(Context context) {
        if (db.isOpen()) {
            db.close();
        }
    }

    /**
     * 向数据库中插入数据
     *
     * @param values
     */
    public void insert(ContentValues values) {
        opendb(mContext);
        db.insert("sms", null, values);
        closedb(mContext);
    }

    /**
     * 第一个参数String:表名
     * 第二个参数ContentValues:ContentValues对象
     * 第三个参数String:where字句,相当于sql语句where后面的语句,?号是占位符
     * 第四个参数String[]:占位符的值
     * 通过ID更新数据库数据
     */
    public int updatatableById(ContentValues values, int ID) {
        opendb(mContext);
        return db.update("sms", values, " id = ? ", new String[]{String.valueOf(ID)});
    }

    /**
     *  更新数据库的数据
     * @param values
     * @return
     */
    public int updatatableAll (ContentValues values) {
        opendb(mContext);
        return db.update("sms", values,null, null);
    }

    /**
     * 根据电话号码更新数据库数据
     *
     * @param values
     * @param Tel
     * @return
     */
    public int updatatableByTel(ContentValues values, String[] Tel) {
        opendb(mContext);
        return db.update("sms", values, " telphone = ? ", Tel);
    }

    /**
     * 根据日期更新数据库数据
     *
     * @param values
     * @param date
     * @return
     */
    public int updatatableByDate(ContentValues values, String[] date) {
        opendb(mContext);
        return db.update("sms", values, " date = ? ", date);
    }

    /**
     * 根据发送和接收状态更新数据库数据
     *
     * @param values
     * @param status
     * @return
     */
    public int updatatableByStatus(ContentValues values, int status) {
        opendb(mContext);
        return db.update("sms", values, " status = ? ", new String[]{String.valueOf(status)});
    }

    /**
     * 根据读过和未读状态更新数据库数据
     *
     * @param values
     * @param read
     * @return
     */
    public int updatatableByRead(ContentValues values, int read) {
        opendb(mContext);
        return db.update("sms", values, " read = ? ", new String[]{String.valueOf(read)});
    }

    public int updatatableByCondition(ContentValues values,Cursor cursor) {
        opendb(mContext);
        String[] condition = new String[]{cursor.getString(cursor.getColumnIndexOrThrow("date")),
                                            cursor.getString(cursor.getColumnIndexOrThrow("telphone")),
                                            cursor.getString(cursor.getColumnIndexOrThrow("body"))};
        return db.update("sms", values, " date = ? and telphone = ?  and body = ?", condition);
    }

    /**
     * 删除数据库所有数据
     * 第一个参数String:表名
     * 第二个参数String:条件语句
     * 第三个参数String[]:条件值
     */
    public void deleteAll() {
        opendb(mContext);
        try {

            db.delete("sms", null, null);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 根据ID来删除数据库指定的数据
     *
     * @param id 指定ID
     */
    public void deleteById(int id) {
        opendb(mContext);
        try {

            db.delete("sms", "id = ?", new String[]{String.valueOf(id)});
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 根据是否读取过来删除数据库指定的数据
     *
     * @param read
     */
    public void deleteByRead(int read) {

        opendb(mContext);
        try {
            db.delete("sms", "read = ?", new String[]{String.valueOf(read)});
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 根据发送和接收状态来删除数据库的数据
     *
     * @param status
     */
    public void deleteByStatus(int status) {
        opendb(mContext);
        try {

            db.delete("sms", "status = ?", new String[]{String.valueOf(status)});
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 根据电话号码删除数据库数据
     *
     * @param tel
     */
    public void deleteByTel(String[] tel) {
        opendb(mContext);
        try {
            db.delete("sms", "telphone = ?", tel);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 根据日期删除指定数据库数据
     *
     * @param date
     */
    public void deleteByDate(String[] date) {
        opendb(mContext);
        try {
            db.delete("sms", "date = ?", date);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closedb(mContext);
        }
    }

    /**
     * 查询数据库所有内容
     * 第一个参数String:表名
     * 第二个参数String[]:要查询的列名
     * 第三个参数String:查询条件
     * 第四个参数String[]:查询条件的参数
     * 第五个参数String:对查询的结果进行分组
     * 第六个参数String:对分组的结果进行限制
     * 第七个参数String:对查询的结果进行排序
     */
    public Cursor queryAll() {
        opendb(mContext);
        return db.query("sms", null, null, null, null, null, null);
    }

    /**
     * 根据ID来查询数据库数据
     */
    public Cursor queryById(int id) {
        opendb(mContext);
        return db.query("sms", new String[]{"id"}, "id = ?", new String[]{String.valueOf(id)}, null, null, null);
    }

    public Cursor queryByRead(int read) {
        opendb(mContext);
        return db.query("sms", null, "read = ?", new String[]{String.valueOf(read)}, null, null, null);
    }

    public Cursor queryByStatus(int status) {
        opendb(mContext);
        return db.query("sms", null, "status = ?", new String[]{String.valueOf(status)}, null, null, null);
    }

    public Cursor queryByTel(String[] tel) {
        opendb(mContext);
        return db.query("sms", null, "telphone = ?", tel, null, null, null);
    }

    public Cursor queryByDate(String[] date) {
        opendb(mContext);
        return db.query("sms", null, "date = ?", date, null, null, null);
    }

    public Cursor queryByCondition(smsdata sdata) {
        String[] condition = new String[]{
                String.valueOf(sdata.getRead()),sdata.getDate(),sdata.getTel(),sdata.getBody()
        };
        opendb(mContext);
        return db.query("sms",null,"read = ? and date = ? and telphone = ? and body = ?",condition,null,null,null);
    }


    /**
     *  根据指定数据设置数据库对应数据为已读,并删除数据库对应数据
     * @param sdata
     * @return
     */
    public int setReadBySmsdata (smsdata sdata) {
        if ( sdata != null && sdata.getRead() == 0 ) {
            Cursor cursor = queryByCondition(sdata);
            Log.d(Tag, "sdata.getTel() = "+sdata.getTel() );
            while (cursor.moveToNext()) {
                setRead(cursor);    // 设置数据为已读
                deleteByRead(1);    // 删除已读数据
                Log.d(Tag, "condtional is ok ");
                return 1;
            }
            cursor.close();
        }
        Log.d(Tag, "################# ");
        return 0;
    }


    /**
     *   设置read状态
     *      read = 1    表示短信已经读过
     *      read = 0    表示短信未读
     * @param cursor
     */
    public void setRead (Cursor cursor) {
            ContentValues values = new ContentValues();
            values.put("date", cursor.getString(cursor.getColumnIndexOrThrow("date")));
            values.put("telphone", cursor.getString(cursor.getColumnIndexOrThrow("telphone")));
            values.put("body", cursor.getString(cursor.getColumnIndexOrThrow("body")));
            values.put("status", cursor.getInt(cursor.getColumnIndexOrThrow("status")));
            values.put("read", 1);
            values.put("ServiceCenterAddress", cursor.getString(cursor.getColumnIndexOrThrow("ServiceCenterAddress")));
            updatatableByCondition(values, cursor);
            Log.d(Tag, "==================== Current date ===========================");
            Log.d(Tag, " date = " + cursor.getString(cursor.getColumnIndexOrThrow("date")));
    }

    /**
     *  读取数据库的数据为显示作准备
     * @param cursor
     * @return
     */
    public smsdata initSmsData(Cursor cursor) {
        smsdata mdata = new smsdata();
        mdata.setTel(cursor.getString(cursor.getColumnIndexOrThrow("telphone")));
        mdata.setBody(cursor.getString(cursor.getColumnIndexOrThrow("body")));
        mdata.setDate(cursor.getString(cursor.getColumnIndexOrThrow("date")));
        mdata.setServiceCenterAddress(cursor.getString(cursor.getColumnIndexOrThrow("ServiceCenterAddress")));
        mdata.setStatus(cursor.getInt(cursor.getColumnIndexOrThrow("status")));
        mdata.setRead(cursor.getInt(cursor.getColumnIndexOrThrow("read")));
        mdata.setSmsCounter(mdata.getSmsCounter() + 1);
        Log.d(Tag, "initSmsData read : " + mdata.getRead());
        Log.d(Tag, "initSmsData status : " + mdata.getStatus());
        Log.d(Tag, "initSmsData smsCounter : " + mdata.getSmsCounter());
        return mdata;
    }

    /**
     * 设置短信的显示内容;
     * @param cursor
     * @param list
     * @return 返回一个list 对象
     */
    public List<smsdata> initListData(Cursor cursor, List<smsdata> list) {
        Log.d("MainActivity", " initListData read = " + cursor.getInt(cursor.getColumnIndexOrThrow("read")));
        smsdata mdata = initSmsData(cursor);
        if (mdata == null) return null;
        list.add(mdata);
        return list;
    }

    /**
     *  读取短信的具体内容存入数据库中
     * @param messages
     */
    public void getSmsData(SmsMessage[] messages) {
        SmsMessage sms = messages[0];
        ContentValues values = new ContentValues();
        Date date = new Date(sms.getTimestampMillis());  // 获取短信日期
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String receiveTime = format.format(date);
        values.put("date", receiveTime.trim());
        values.put("telphone", sms.getOriginatingAddress());

        // 将拆分的短信合并成一条信息存入数据库
        if (messages.length == 1) {
            values.put("body", sms.getDisplayMessageBody());
        } else {
            StringBuilder body = new StringBuilder();
            for (int i = 0; i < messages.length; i++) {
                sms = messages[i];
                body.append(sms.getDisplayMessageBody());
                Log.d("MainActivity","sms = "+sms.getDisplayMessageBody());
            }
            values.put("body", body.toString());
        }
        values.put("status", sms.getStatus());
        values.put("read", 0);
        values.put("ServiceCenterAddress", sms.getServiceCenterAddress());
        insert(values);
    }


    /**
     * 通过广播来获取短信信息并更新UI界面
     *
     * @param intent
     */
    public void getBroadcastData(Intent intent) {
        if (intent.getAction().equals(SMS_Action)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdus.length];  //解析短信
                for (int i = 0; i < pdus.length; i++) {
                    byte[] pdu = (byte[]) pdus[i];
                    messages[i] = SmsMessage.createFromPdu(pdu);
                    Log.d("MainActivity", "============================= SmsReceiver[" + i + "]=========================");
                }
                getSmsData(messages);
                smsUpdateData data = new MainActivity();
                data.updataListView();
                Log.d("MainActivity", "[2] ReceiverBroast : " + data);
            }
        }
    }

    /**
     * 比较当前系统SDK是否大于KITKAT(4.4);
     *  这样做主要是4.4以后短信服务要获取默认权限。
     * @return
     */
    public static boolean sdkGreaterKitkat() {
        int osVersion = -1;
        int newVersion = android.os.Build.VERSION_CODES.KITKAT;
        try
        {
            osVersion = Integer.valueOf(android.os.Build.VERSION.SDK_INT);
        }
        catch (NumberFormatException e)
        {
            e.printStackTrace();
        }
        Log.d("MainActivity","osVersion"+osVersion);
        return (osVersion > newVersion);
    }
}

猜你喜欢

转载自blog.csdn.net/dylan_524217139/article/details/46562983