最近有需求做个一手机开机后,监听手机短信(指定短信内容)通知客户。下面将实现代码写出来
短信通知广播拦截BootReceiver
- package com.msi.manning;
-
- import java.util.ArrayList;
-
- import android.app.NotificationManager;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.telephony.gsm.SmsMessage;
- import android.util.Log;
-
- /**
- * 2011-4-18 下午01:43:17 BootReceiver.java author:zhouhui
- * E-mail:wwwzhouhui@163.com
- */
- public class BootReceiver extends BroadcastReceiver {
- static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
- private static final String LOG_TAG = "SMSReceiver";
- public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
-
- @Override
- public void onReceive(Context context, Intent intent) {
- NotificationManager nm = (NotificationManager) context
- .getSystemService(Context.NOTIFICATION_SERVICE);
- ArrayList<String> list = new ArrayList<String>();
- if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
- // Intent in = new Intent(context, SMSNotifyActivity.class); //
- // 这是你的activity
- // in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- // context.startActivity(in);
- }
- if (intent.getAction().equals(BootReceiver.ACTION)) {
- Bundle bundle = intent.getExtras();
- StringBuilder sb = new StringBuilder();
- if (bundle != null) {
- Object messages[] = (Object[]) bundle.get("pdus");
- SmsMessage[] smsMessage = new SmsMessage[messages.length];
-
- for (int n = 0; n < messages.length; n++) {
- smsMessage[n] = SmsMessage
- .createFromPdu((byte[]) messages[n]);
- sb.append("From:");
- sb.append(smsMessage[n].getDisplayOriginatingAddress());
- sb.append("\n");
- sb.append(smsMessage[n].getDisplayMessageBody());
- list.add(sb.toString());
- }
- }
- Log.i(BootReceiver.LOG_TAG, "[SMSApp] onReceiveIntent0: " + sb);
- abortBroadcast();
-
- Intent in = new Intent(context, SMSNotifyActivity.class);
- Bundle bundle2 = new Bundle();
- bundle2.putStringArrayList("message", list);
- in.putExtras(bundle2);
- in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(in);
- Log.i(BootReceiver.LOG_TAG, "[SMSApp] onReceiveIntent0over: " );
- }
- }
-
- }
手机发送短信广播后会给android.provider.Telephony.SMS_RECEIVED 拦截 取得短信内容后面通知需要显示拦截展现的Activity
显示短信拦截内容的SMSNotifyActivity
package com.msi.manning;
Java代码 - import java.util.ArrayList;
- import java.util.HashMap;
-
- import android.app.Activity;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ListView;
-
- public class SMSNotifyActivity extends Activity {
- private static final String LOG_TAG = "SMSReceiver";
- Button closeBtn;
- Button clearBtn;
- Button deleteBtn;
- ListView list;
- ListViewButtonAdapter listItemAdapter;
- private DiaryDbAdapter mDbHelper;
- private Cursor mDiaryCursor;
-
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.main);
- initLayout();
- }
-
- /**
- * 查詢最新全部短信通知數據
- */
- private void renderListView() {
- mDiaryCursor = mDbHelper.getAllMessage();
- ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
- mDiaryCursor.moveToFirst();
- while (!mDiaryCursor.isAfterLast()) {
- HashMap<String, Object> map = new HashMap<String, Object>();
- String status = mDiaryCursor.getString(5);
- if (status.equals("0")) {
- status = "未查看";
- } else {
- status = "已查看";
- }
- map.put("ItemTitle", mDiaryCursor.getLong(0));
- map.put("ItemType", mDiaryCursor.getString(3));
- map.put("ItemTime", mDiaryCursor.getString(4));
- map.put("ItemStatus", status);
- map.put("ItemText", mDiaryCursor.getString(1));
- listItem.add(map);
- mDiaryCursor.moveToNext();
- }
- mDiaryCursor.close();
- // 生成适配器的Item和动态数组对应的元素
- listItemAdapter = new ListViewButtonAdapter(this, listItem,// 数据源
- R.layout.list,// ListItem的XML实现
- // 动态数组与ImageItem对应的子项
- new String[] { "ItemTitle", "ItemType", "ItemTime",
- "ItemStatus", "ItemText", "ItemTitle", "ItemTitle" },
- // ImageItem的XML文件里面的一个ImageView,两个TextView ID
- new int[] { R.id.ItemTitle, R.id.ItemType, R.id.ItemTime,
- R.id.ItemStatus, R.id.ItemText, R.id.btn_config_delete,
- R.id.btn_config_view }, mDbHelper);
- // 添加并且显示
- list.setAdapter(listItemAdapter);
- }
-
- /**
- * 初始化組件
- */
- private void initLayout() {
- // 绑定Layout里面的ListView
- list = (ListView) findViewById(R.id.MyListView);
- this.closeBtn = (Button) findViewById(R.id.btn_config_close);
- this.clearBtn = (Button) findViewById(R.id.btn_config_clear);
- closeBtn.setOnClickListener(new closeBtn_Click());
- clearBtn.setOnClickListener(new clearBtn_Click());
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mDbHelper = new DiaryDbAdapter(this);
- mDbHelper.open();
- Bundle extras = getIntent().getExtras();
- ArrayList<String> data = null;
- if (extras != null) {
- data = extras.getStringArrayList("message");
- for (int j = 0; j < data.size(); j++) {
- String[] array = data.get(j).split("\n");
- String[] message = array[1].split("#");
- mDbHelper.createDiary(message[4], message[1], message[2], "0",
- message[3]);
- }
- }
- Log.i(SMSNotifyActivity.LOG_TAG, "[SMSApp] onReceiveIntent1: " + data);
- renderListView();
- }
-
- /**
- * 關閉短信通知
- *
- * @author dell
- *
- */
- public class closeBtn_Click implements OnClickListener {
- public void onClick(View arg0) {
- SMSNotifyActivity.this.finish();
- }
- }
-
- /**
- * 清除所有短信通知
- *
- * @author dell
- *
- */
- public class clearBtn_Click implements OnClickListener {
- public void onClick(View arg0) {
- boolean flag = mDbHelper.deleteAll();
- Log.i(SMSNotifyActivity.LOG_TAG, "[SMSApp] clearBtn_Click: " + flag);
- listItemAdapter.notifyDataSetChanged();
- // 刷新頁面
- renderListView();
- }
- }
-
- protected void onRestart() {
- super.onRestart();
- Log.e(LOG_TAG, "start onRestart~~~");
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- Log.e(LOG_TAG, "start onResume~~~");
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- Log.e(LOG_TAG, "start onPause~~~");
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- Log.e(LOG_TAG, "start onStop~~~");
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- Log.e(LOG_TAG, "start onDestroy~~~");
- }
- }
短信拦截后的记录插入到数据库中,这里有个SQLlite辅助类DiaryDbAdapter
package com.msi.manning;
Java代码 - import java.util.Calendar;
-
- import android.content.ContentValues;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.SQLException;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- import android.util.Log;
-
- public class DiaryDbAdapter {
-
- private static final String PUSH_ID = "push_id"; //邮件等类型的主键
- private static final String CONTENT = "content"; //邮件等类型的简略内容
- private static final String SMS_FUNC_CODE = "sms_func_code"; //通知类型代码
- private static final String SMS_FUNC_CODE_CN = "sms_func_code_cn"; //通知类型中文名
- private static final String CREATE_TIME = "create_time"; //该记录创建的时间
- private static final String STATUS = "status"; //通知状态
- private static final String REQID = "reqid"; //通知状态
- private static final String DATABASE_NAME = "dbForMessage";
- private static final String DATABASE_TABLE = "iuc_push_record";
- private static final int DATABASE_VERSION = 1;
-
- private static final String TAG = "DiaryDbAdapter";
- private DatabaseHelper mDbHelper;
- private SQLiteDatabase mDb;
-
- private static final String DATABASE_CREATE = "CREATE TABLE " + DATABASE_TABLE + " (" + PUSH_ID
- + " INTEGER PRIMARY KEY autoincrement, " + CONTENT + " text not null, " +SMS_FUNC_CODE + " text," + SMS_FUNC_CODE_CN + " text," +CREATE_TIME + " text," +STATUS + " text, "+REQID + " text "+ ");";
- // private static final String DATABASE_CREATE = "create table diary (_id integer primary key autoincrement, "
- // + "title text not null, body text not null, created text not null);";
-
- private final Context mCtx;
-
- private static class DatabaseHelper extends SQLiteOpenHelper {
-
- DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- Log.i(TAG, "[SMSApp] createDatabase: " +DATABASE_CREATE);
- db.execSQL(DATABASE_CREATE);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- Log.i(TAG, "[SMSApp] updatgeDatabase: " +DATABASE_CREATE);
- db.execSQL("DROP TABLE IF EXISTS"+DATABASE_TABLE);
- onCreate(db);
- }
- }
-
- public DiaryDbAdapter(Context ctx) {
- this.mCtx = ctx;
- }
-
- public DiaryDbAdapter open() throws SQLException {
- mDbHelper = new DatabaseHelper(mCtx);
- mDb = mDbHelper.getWritableDatabase();
- return this;
- }
-
- public void closeclose() {
- mDbHelper.close();
- }
-
- public long createDiary(String content, String sms_func_code,String sms_func_code_cn,String status,String reqid) {
- ContentValues initialValues = new ContentValues();
- initialValues.put(CONTENT, content);
- initialValues.put(SMS_FUNC_CODE, sms_func_code);
- initialValues.put(SMS_FUNC_CODE_CN, sms_func_code_cn);
- initialValues.put(STATUS, status);
- initialValues.put(REQID, reqid);
- Calendar calendar = Calendar.getInstance();
- String created = calendar.get(Calendar.YEAR) + "年"
- + calendar.get(Calendar.MONTH) + "月"
- + calendar.get(Calendar.DAY_OF_MONTH) + "日"
- + calendar.get(Calendar.HOUR_OF_DAY) + "时"
- + calendar.get(Calendar.MINUTE) + "分";
- initialValues.put(CREATE_TIME, created);
- Log.i(TAG, "[SMSApp] insertsql: ");
- return mDb.insert(DATABASE_TABLE, null, initialValues);
- }
-
- public boolean deleteDiary(long rowId) {
- Log.i(TAG, "[SMSApp] deletesql: "+rowId);
- return mDb.delete(DATABASE_TABLE, PUSH_ID + "=" + rowId, null) > 0;
- }
-
- public boolean deleteAll() {
- Log.i(TAG, "[SMSApp] deleteallsql: ");
- return mDb.delete(DATABASE_TABLE, null, null) > 0;
-
- }
-
- public Cursor getAllMessage() {
- Log.i(TAG, "[SMSApp] getallsql: ");
- return mDb.query(DATABASE_TABLE, new String[] { PUSH_ID, CONTENT,
- SMS_FUNC_CODE, SMS_FUNC_CODE_CN,CREATE_TIME,STATUS,REQID }, null, null, null, null, null);
- }
-
- public Cursor getDiary(long rowId) throws SQLException {
-
- Cursor mCursor =
-
- mDb.query(true, DATABASE_TABLE, new String[] { PUSH_ID, CONTENT,
- SMS_FUNC_CODE, SMS_FUNC_CODE_CN,CREATE_TIME,STATUS,REQID }, PUSH_ID + "=" + rowId, null, null,
- null, null, null);
- Log.i(TAG, "[SMSApp] getDiarysql: ");
- if (mCursor != null) {
- mCursor.moveToFirst();
- }
- return mCursor;
-
- }
-
- public boolean updateDiary(long rowId, String content, String sms_func_code,String sms_func_code_cn,String status,String reqid) {
- ContentValues args = new ContentValues();
- args.put(CONTENT, content);
- args.put(SMS_FUNC_CODE, sms_func_code);
- args.put(SMS_FUNC_CODE_CN, sms_func_code_cn);
- args.put(STATUS, status);
- args.put(REQID, reqid);
- Calendar calendar = Calendar.getInstance();
- String created = calendar.get(Calendar.YEAR) + "年"
- + calendar.get(Calendar.MONTH) + "月"
- + calendar.get(Calendar.DAY_OF_MONTH) + "日"
- + calendar.get(Calendar.HOUR_OF_DAY) + "时"
- + calendar.get(Calendar.MINUTE) + "分";
- args.put(CREATE_TIME, created);
- Log.i(TAG, "[SMSApp] updatesql: ");
- return mDb.update(DATABASE_TABLE, args, PUSH_ID + "=" + rowId, null) > 0;
- }
- }
由于SMSNotifyActivity 方法中listview中有按钮提交事件普通的listview不能响应事件,ListViewButtonAdapter
扩展BaseAdapter 方法重写getView 方法,添加BUTTON 并添加按钮响应事件
package com.msi.manning;
Java代码 - import java.util.ArrayList;
- import java.util.HashMap;
-
- import android.content.Context;
- import android.content.Intent;
- import android.database.Cursor;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.TextView;
-
- /**
- * 2011-4-20 上午10:56:21 lvButtonAdapter.java author:zhouhui
- * E-mail:wwwzhouhui@163.com
- */
- public class ListViewButtonAdapter extends BaseAdapter {
- private DiaryDbAdapter mDbHelper;
- private static final String TAG = "lvButtonAdapter";
- public static final String ACTION_INTENT_TASKRECEIVER= "com.gift.android.TaskReceiver";
-
- private class buttonViewHolder {
- // ImageView appIcon;
- TextView appName1;
- TextView appName2;
- TextView appName3;
- TextView appName4;
- TextView appName5;
- Button buttonClose;
- Button buttonView;
- }
-
- private ArrayList<HashMap<String, Object>> mAppList;
- private LayoutInflater mInflater;
- private Context mContext;
- private String[] keyString;
- private int[] valueViewID;
- private buttonViewHolder holder;
-
- public ListViewButtonAdapter(Context c,
- ArrayList<HashMap<String, Object>> appList, int resource,
- String[] from, int[] to, DiaryDbAdapter mDbHelper) {
- mAppList = appList;
- mContext = c;
- mInflater = (LayoutInflater) mContext
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- keyString = new String[from.length];
- valueViewID = new int[to.length];
- System.arraycopy(from, 0, keyString, 0, from.length);
- System.arraycopy(to, 0, valueViewID, 0, to.length);
- this.mDbHelper = mDbHelper;
- }
-
- @Override
- public int getCount() {
- return mAppList.size();
- }
-
- @Override
- public Object getItem(int position) {
- return mAppList.get(position);
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- public void removeItem(int position) {
- mAppList.remove(position);
- this.notifyDataSetChanged();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView != null) {
- holder = (buttonViewHolder) convertView.getTag();
- } else {
- convertView = mInflater.inflate(R.layout.list, null);
- holder = new buttonViewHolder();
- holder.appName1 = (TextView) convertView
- .findViewById(valueViewID[0]);
- holder.appName2 = (TextView) convertView
- .findViewById(valueViewID[1]);
- holder.appName3 = (TextView) convertView
- .findViewById(valueViewID[2]);
- holder.appName4 = (TextView) convertView
- .findViewById(valueViewID[3]);
- holder.appName5 = (TextView) convertView
- .findViewById(valueViewID[4]);
- holder.buttonClose = (Button) convertView
- .findViewById(valueViewID[5]);
- holder.buttonView = (Button) convertView
- .findViewById(valueViewID[6]);
- convertView.setTag(holder);
- }
-
- HashMap<String, Object> appInfo = mAppList.get(position);
- if (appInfo != null) {
- Long aname1 = (Long) appInfo.get(keyString[0]);
- String aname2 = (String) appInfo.get(keyString[1]);
- String aname3 = (String) appInfo.get(keyString[2]);
- String aname4 = (String) appInfo.get(keyString[3]);
- String aname5 = (String) appInfo.get(keyString[4]);
- holder.appName1.setText(String.valueOf(aname1));
- holder.appName2.setText(aname2);
- holder.appName3.setText(aname3);
- holder.appName4.setText(aname4);
- holder.appName5.setText(aname5);
- holder.buttonClose
- .setOnClickListener(new lvButtonListener(position));
- holder.buttonView
- .setOnClickListener(new lvButtonListener(position));
- }
- return convertView;
- }
-
- class lvButtonListener implements OnClickListener {
- private int position;
-
- lvButtonListener(int pos) {
- position = pos;
- }
-
- @Override
- public void onClick(View v) {
- int vid = v.getId();
- if (vid == holder.buttonClose.getId()) {
- boolean flag = mDbHelper.deleteDiary(Long
- .parseLong((holder.appName1.getText().toString())));
- Log.i(TAG, "[SMSApp] deletesql: " + flag);
- removeItem(position);
- }
- if (vid == holder.buttonView.getId()) {
- // 查看短信详细
- ShowView(Long.parseLong((holder.appName1.getText().toString())));
- }
- }
-
- private void ShowView(long id) {
- Cursor mDiaryCursor = mDbHelper.getDiary(id);
- if (mDiaryCursor != null) {
- boolean flag = mDbHelper.updateDiary(id,
- mDiaryCursor.getString(1), mDiaryCursor.getString(2),
- mDiaryCursor.getString(3), "1",mDiaryCursor.getString(6));
- Log.i(TAG, "[SMSApp] updatesql: " + flag);
- // 广播消息
- Intent intent = new Intent(ACTION_INTENT_TASKRECEIVER);
- intent.putExtra("TaskContent", mDiaryCursor.getString(2)+"#"+mDiaryCursor.getString(6));
- mContext.sendBroadcast(intent);
- }
- }
- }
-
- }
ayout 文件的布局管理文件
main.xml
<?xml version="1.0" encoding="utf-8"?>
Xml代码 - RelativeLayout android:id="@+id/RelativeLayout01"
- android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content" android:paddingBottom="4dip"
- android:paddingLeft="12dip" android:paddingRight="12dip"
- android:descendantFocusability="blocksDescendants" >
- <ListView android:layout_width="wrap_content"
- android:layout_height="400dip"
- android:id="@+id/MyListView">
- </ListView>
- <LinearLayout
- android:id="@+id/bottom_panel"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center_horizontal"
- android:layout_alignParentBottom="true"
- >
- <Button android:id="@+id/btn_config_clear"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:width="100dip"
- android:text="清空" />
- <Button android:id="@+id/btn_config_close"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:width="100dip"
- android:text="退出" />
- </LinearLayout>
- </RelativeLayout>
list.xml
<?xml version="1.0" encoding="utf-8"?>
Xml代码 - <!-- 此布局文件用来定义listview 的显示方式 -->
- <RelativeLayout android:id="@+id/RelativeLayout01"
- android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content" android:paddingBottom="4dip"
- android:paddingLeft="12dip" android:paddingRight="12dip"
- android:descendantFocusability="blocksDescendants" >
- <TextView android:layout_height="wrap_content"
- android:textSize="20dip" android:layout_width="fill_parent"
- android:id="@+id/ItemTitle" />
- <TextView android:layout_height="wrap_content"
- android:layout_width="fill_parent" android:layout_below="@+id/ItemTitle"
- android:id="@+id/ItemType" />
- <TextView android:layout_height="wrap_content" android:layout_below="@+id/ItemType"
- android:layout_width="fill_parent"
- android:id="@+id/ItemTime" />
- <TextView android:layout_height="wrap_content"
- android:layout_width="fill_parent" android:layout_below="@+id/ItemTime"
- android:id="@+id/ItemStatus" />
- <TextView android:layout_height="wrap_content"
- android:layout_width="fill_parent" android:layout_below="@+id/ItemStatus"
- android:id="@+id/ItemText" />
- <Button android:id="@+id/btn_config_view"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@+id/ItemText"
- android:layout_alignParentRight="true"
- android:focusable="false"
- android:width="50dip"
- android:text="查看" />
- <Button android:id="@+id/btn_config_delete"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toLeftOf="@+id/btn_config_view"
- android:layout_alignTop="@+id/btn_config_view"
- android:focusable="false"
- android:width="50dip"
- android:text="删除" />
- </RelativeLayout>
AndroidManifest.xml
中 添加手机自启动注册信息android.permission.RECEIVE_BOOT_COMPLETED
添加广播监听
<receiver android:name=".BootReceiver">
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
这里添加短信监听广播接收android.provider.Telephony.SMS_RECEIVED
完整的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
Xml代码- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.msi.manning">
- <application android:icon="@drawable/chat">
- <activity android:name="com.msi.manning.SMSNotifyActivity"
- android:label="@string/app_name" android:clearTaskOnLaunch="true">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <receiver android:name=".BootReceiver">
- <intent-filter android:priority="100">
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </receiver>
- </application>
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <!-- 程序接收短信权限 -->
- <uses-permission android:name="android.permission.READ_SMS"></uses-permission> <!-- 读短信权限 -->
- </manifest>