|
本文出自:点击打开链接
最近有需求做个一手机开机后,监听手机短信(指定短信内容)通知客户。下面将实现代码写出来
短信通知广播拦截BootReceiver
Java代码
- packagecom.msi.manning;
- importjava.util.ArrayList;
- importandroid.app.NotificationManager;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.telephony.gsm.SmsMessage;
- importandroid.util.Log;
- /**
- *2011-4-18下午01:43:17BootReceiver.javaauthor:zhouhui
- *E-mail:wwwzhouhui@163.com
- */
- publicclassBootReceiverextendsBroadcastReceiver{
- staticfinalStringACTION="android.provider.Telephony.SMS_RECEIVED";
- privatestaticfinalStringLOG_TAG="SMSReceiver";
- publicstaticfinalintNOTIFICATION_ID_RECEIVED=0x1221;
- @Override
- publicvoidonReceive(Contextcontext,Intentintent){
- NotificationManagernm=(NotificationManager)context
- .getSystemService(Context.NOTIFICATION_SERVICE);
- ArrayList<String>list=newArrayList<String>();
- if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
- //Intentin=newIntent(context,SMSNotifyActivity.class);//
- //这是你的activity
- //in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- //context.startActivity(in);
- }
- if(intent.getAction().equals(BootReceiver.ACTION)){
- Bundlebundle=intent.getExtras();
- StringBuildersb=newStringBuilder();
- if(bundle!=null){
- Objectmessages[]=(Object[])bundle.get("pdus");
- SmsMessage[]smsMessage=newSmsMessage[messages.length];
- for(intn=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();
- Intentin=newIntent(context,SMSNotifyActivity.class);
- Bundlebundle2=newBundle();
- 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代码
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importandroid.app.Activity;
- importandroid.database.Cursor;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.ListView;
- publicclassSMSNotifyActivityextendsActivity{
- privatestaticfinalStringLOG_TAG="SMSReceiver";
- ButtoncloseBtn;
- ButtonclearBtn;
- ButtondeleteBtn;
- ListViewlist;
- ListViewButtonAdapterlistItemAdapter;
- privateDiaryDbAdaptermDbHelper;
- privateCursormDiaryCursor;
- publicvoidonCreate(Bundleicicle){
- super.onCreate(icicle);
- setContentView(R.layout.main);
- initLayout();
- }
- /**
- *查詢最新全部短信通知數據
- */
- privatevoidrenderListView(){
- mDiaryCursor=mDbHelper.getAllMessage();
- ArrayList<HashMap<String,Object>>listItem=newArrayList<HashMap<String,Object>>();
- mDiaryCursor.moveToFirst();
- while(!mDiaryCursor.isAfterLast()){
- HashMap<String,Object>map=newHashMap<String,Object>();
- Stringstatus=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=newListViewButtonAdapter(this,listItem,//数据源
- R.layout.list,//ListItem的XML实现
- //动态数组与ImageItem对应的子项
- newString[]{"ItemTitle","ItemType","ItemTime",
- "ItemStatus","ItemText","ItemTitle","ItemTitle"},
- //ImageItem的XML文件里面的一个ImageView,两个TextViewID
- newint[]{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);
- }
- /**
- *初始化組件
- */
- privatevoidinitLayout(){
- //绑定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(newcloseBtn_Click());
- clearBtn.setOnClickListener(newclearBtn_Click());
- }
- @Override
- protectedvoidonStart(){
- super.onStart();
- mDbHelper=newDiaryDbAdapter(this);
- mDbHelper.open();
- Bundleextras=getIntent().getExtras();
- ArrayList<String>data=null;
- if(extras!=null){
- data=extras.getStringArrayList("message");
- for(intj=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();
- }
- /**
- *關閉短信通知
- *
- *@authordell
- *
- */
- publicclasscloseBtn_ClickimplementsOnClickListener{
- publicvoidonClick(Viewarg0){
- SMSNotifyActivity.this.finish();
- }
- }
- /**
- *清除所有短信通知
- *
- *@authordell
- *
- */
- publicclassclearBtn_ClickimplementsOnClickListener{
- publicvoidonClick(Viewarg0){
- booleanflag=mDbHelper.deleteAll();
- Log.i(SMSNotifyActivity.LOG_TAG,"[SMSApp]clearBtn_Click:"+flag);
- listItemAdapter.notifyDataSetChanged();
- //刷新頁面
- renderListView();
- }
- }
- protectedvoidonRestart(){
- super.onRestart();
- Log.e(LOG_TAG,"startonRestart~~~");
- }
- @Override
- protectedvoidonResume(){
- super.onResume();
- Log.e(LOG_TAG,"startonResume~~~");
- }
- @Override
- protectedvoidonPause(){
- super.onPause();
- Log.e(LOG_TAG,"startonPause~~~");
- }
- @Override
- protectedvoidonStop(){
- super.onStop();
- Log.e(LOG_TAG,"startonStop~~~");
- }
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- Log.e(LOG_TAG,"startonDestroy~~~");
- }
- }
短信拦截后的记录插入到数据库中,这里有个SQLlite辅助类DiaryDbAdapter
package com.msi.manning;
Java代码
- importjava.util.Calendar;
- importandroid.content.ContentValues;
- importandroid.content.Context;
- importandroid.database.Cursor;
- importandroid.database.SQLException;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- importandroid.util.Log;
- publicclassDiaryDbAdapter{
- privatestaticfinalStringPUSH_ID="push_id";//邮件等类型的主键
- privatestaticfinalStringCONTENT="content";//邮件等类型的简略内容
- privatestaticfinalStringSMS_FUNC_CODE="sms_func_code";//通知类型代码
- privatestaticfinalStringSMS_FUNC_CODE_CN="sms_func_code_cn";//通知类型中文名
- privatestaticfinalStringCREATE_TIME="create_time";//该记录创建的时间
- privatestaticfinalStringSTATUS="status";//通知状态
- privatestaticfinalStringREQID="reqid";//通知状态
- privatestaticfinalStringDATABASE_NAME="dbForMessage";
- privatestaticfinalStringDATABASE_TABLE="iuc_push_record";
- privatestaticfinalintDATABASE_VERSION=1;
- privatestaticfinalStringTAG="DiaryDbAdapter";
- privateDatabaseHelpermDbHelper;
- privateSQLiteDatabasemDb;
- privatestaticfinalStringDATABASE_CREATE="CREATETABLE"+DATABASE_TABLE+"("+PUSH_ID
- +"INTEGERPRIMARYKEYautoincrement,"+CONTENT+"textnotnull,"+SMS_FUNC_CODE+"text,"+SMS_FUNC_CODE_CN+"text,"+CREATE_TIME+"text,"+STATUS+"text,"+REQID+"text"+");";
- //privatestaticfinalStringDATABASE_CREATE="createtablediary(_idintegerprimarykeyautoincrement,"
- //+"titletextnotnull,bodytextnotnull,createdtextnotnull);";
- privatefinalContextmCtx;
- privatestaticclassDatabaseHelperextendsSQLiteOpenHelper{
- DatabaseHelper(Contextcontext){
- super(context,DATABASE_NAME,null,DATABASE_VERSION);
- }
- @Override
- publicvoidonCreate(SQLiteDatabasedb){
- Log.i(TAG,"[SMSApp]createDatabase:"+DATABASE_CREATE);
- db.execSQL(DATABASE_CREATE);
- }
- @Override
- publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
- Log.i(TAG,"[SMSApp]updatgeDatabase:"+DATABASE_CREATE);
- db.execSQL("DROPTABLEIFEXISTS"+DATABASE_TABLE);
- onCreate(db);
- }
- }
- publicDiaryDbAdapter(Contextctx){
- this.mCtx=ctx;
- }
- publicDiaryDbAdapteropen()throwsSQLException{
- mDbHelper=newDatabaseHelper(mCtx);
- mDb=mDbHelper.getWritableDatabase();
- returnthis;
- }
- publicvoidcloseclose(){
- mDbHelper.close();
- }
- publiclongcreateDiary(Stringcontent,Stringsms_func_code,Stringsms_func_code_cn,Stringstatus,Stringreqid){
- ContentValuesinitialValues=newContentValues();
- 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);
- Calendarcalendar=Calendar.getInstance();
- Stringcreated=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:");
- returnmDb.insert(DATABASE_TABLE,null,initialValues);
- }
- publicbooleandeleteDiary(longrowId){
- Log.i(TAG,"[SMSApp]deletesql:"+rowId);
- returnmDb.delete(DATABASE_TABLE,PUSH_ID+"="+rowId,null)>0;
- }
- publicbooleandeleteAll(){
- Log.i(TAG,"[SMSApp]deleteallsql:");
- returnmDb.delete(DATABASE_TABLE,null,null)>0;
- }
- publicCursorgetAllMessage(){
- Log.i(TAG,"[SMSApp]getallsql:");
- returnmDb.query(DATABASE_TABLE,newString[]{PUSH_ID,CONTENT,
- SMS_FUNC_CODE,SMS_FUNC_CODE_CN,CREATE_TIME,STATUS,REQID},null,null,null,null,null);
- }
- publicCursorgetDiary(longrowId)throwsSQLException{
- CursormCursor=
- mDb.query(true,DATABASE_TABLE,newString[]{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();
- }
- returnmCursor;
- }
- publicbooleanupdateDiary(longrowId,Stringcontent,Stringsms_func_code,Stringsms_func_code_cn,Stringstatus,Stringreqid){
- ContentValuesargs=newContentValues();
- 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);
- Calendarcalendar=Calendar.getInstance();
- Stringcreated=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:");
- returnmDb.update(DATABASE_TABLE,args,PUSH_ID+"="+rowId,null)>0;
- }
- }
由于SMSNotifyActivity 方法中listview中有按钮提交事件普通的listview不能响应事件,ListViewButtonAdapter
扩展BaseAdapter 方法重写getView 方法,添加BUTTON 并添加按钮响应事件
package com.msi.manning;
Java代码
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.database.Cursor;
- importandroid.util.Log;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- /**
- *2011-4-20上午10:56:21lvButtonAdapter.javaauthor:zhouhui
- *E-mail:wwwzhouhui@163.com
- */
- publicclassListViewButtonAdapterextendsBaseAdapter{
- privateDiaryDbAdaptermDbHelper;
- privatestaticfinalStringTAG="lvButtonAdapter";
- publicstaticfinalStringACTION_INTENT_TASKRECEIVER="com.gift.android.TaskReceiver";
- privateclassbuttonViewHolder{
- //ImageViewappIcon;
- TextViewappName1;
- TextViewappName2;
- TextViewappName3;
- TextViewappName4;
- TextViewappName5;
- ButtonbuttonClose;
- ButtonbuttonView;
- }
- privateArrayList<HashMap<String,Object>>mAppList;
- privateLayoutInflatermInflater;
- privateContextmContext;
- privateString[]keyString;
- privateint[]valueViewID;
- privatebuttonViewHolderholder;
- publicListViewButtonAdapter(Contextc,
- ArrayList<HashMap<String,Object>>appList,intresource,
- String[]from,int[]to,DiaryDbAdaptermDbHelper){
- mAppList=appList;
- mContext=c;
- mInflater=(LayoutInflater)mContext
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- keyString=newString[from.length];
- valueViewID=newint[to.length];
- System.arraycopy(from,0,keyString,0,from.length);
- System.arraycopy(to,0,valueViewID,0,to.length);
- this.mDbHelper=mDbHelper;
- }
- @Override
- publicintgetCount(){
- returnmAppList.size();
- }
- @Override
- publicObjectgetItem(intposition){
- returnmAppList.get(position);
- }
- @Override
- publiclonggetItemId(intposition){
- returnposition;
- }
- publicvoidremoveItem(intposition){
- mAppList.remove(position);
- this.notifyDataSetChanged();
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- if(convertView!=null){
- holder=(buttonViewHolder)convertView.getTag();
- }else{
- convertView=mInflater.inflate(R.layout.list,null);
- holder=newbuttonViewHolder();
- 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){
- Longaname1=(Long)appInfo.get(keyString[0]);
- Stringaname2=(String)appInfo.get(keyString[1]);
- Stringaname3=(String)appInfo.get(keyString[2]);
- Stringaname4=(String)appInfo.get(keyString[3]);
- Stringaname5=(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(newlvButtonListener(position));
- holder.buttonView
- .setOnClickListener(newlvButtonListener(position));
- }
- returnconvertView;
- }
- classlvButtonListenerimplementsOnClickListener{
- privateintposition;
- lvButtonListener(intpos){
- position=pos;
- }
- @Override
- publicvoidonClick(Viewv){
- intvid=v.getId();
- if(vid==holder.buttonClose.getId()){
- booleanflag=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())));
- }
- }
- privatevoidShowView(longid){
- CursormDiaryCursor=mDbHelper.getDiary(id);
- if(mDiaryCursor!=null){
- booleanflag=mDbHelper.updateDiary(id,
- mDiaryCursor.getString(1),mDiaryCursor.getString(2),
- mDiaryCursor.getString(3),"1",mDiaryCursor.getString(6));
- Log.i(TAG,"[SMSApp]updatesql:"+flag);
- //广播消息
- Intentintent=newIntent(ACTION_INTENT_TASKRECEIVER);
- intent.putExtra("TaskContent",mDiaryCursor.getString(2)+"#"+mDiaryCursor.getString(6));
- mContext.sendBroadcast(intent);
- }
- }
- }
- }
layout 文件的布局管理文件
main.xml
<?xml version="1.0" encoding="utf-8"?>
Xml代码
- <RelativeLayoutandroid: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">
- <ListViewandroid: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"
- >
- <Buttonandroid:id="@+id/btn_config_clear"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:width="100dip"
- android:text="清空"/>
- <Buttonandroid: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的显示方式-->
- <RelativeLayoutandroid: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">
- <TextViewandroid:layout_height="wrap_content"
- android:textSize="20dip"android:layout_width="fill_parent"
- android:id="@+id/ItemTitle"/>
- <TextViewandroid:layout_height="wrap_content"
- android:layout_width="fill_parent"android:layout_below="@+id/ItemTitle"
- android:id="@+id/ItemType"/>
- <TextViewandroid:layout_height="wrap_content"android:layout_below="@+id/ItemType"
- android:layout_width="fill_parent"
- android:id="@+id/ItemTime"/>
- <TextViewandroid:layout_height="wrap_content"
- android:layout_width="fill_parent"android:layout_below="@+id/ItemTime"
- android:id="@+id/ItemStatus"/>
- <TextViewandroid:layout_height="wrap_content"
- android:layout_width="fill_parent"android:layout_below="@+id/ItemStatus"
- android:id="@+id/ItemText"/>
- <Buttonandroid: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="查看"/>
- <Buttonandroid: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代码
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.msi.manning">
- <applicationandroid:icon="@drawable/chat">
- <activityandroid:name="com.msi.manning.SMSNotifyActivity"
- android:label="@string/app_name"android:clearTaskOnLaunch="true">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <receiverandroid:name=".BootReceiver">
- <intent-filterandroid:priority="100">
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </receiver>
- </application>
- <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- <uses-permissionandroid:name="android.permission.RECEIVE_SMS"></uses-permission><!--程序接收短信权限-->
- <uses-permissionandroid:name="android.permission.READ_SMS"></uses-permission><!--读短信权限-->
- </manifest>
|
|