Android通过Service编程实现短信监听,通过Toast显示收到的短信的发送者和短信内容
16lz
2021-01-24
我们知道Service是Android的四大组件之一,可以在后台长期运行。下面的案例是通过Service的应用场景,实现App常驻后台,通过注册自定义的广播监听者,在系统接收到短信信息时,拦截读取短信的发送者和短信内容,并显示出来。
代码实现:
XML文件:
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />
java文件:
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.os.Bundle;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(MainActivity.this, MessageService.class); startService(intent); }}
package com.example.myapplication;import android.app.Service;import android.content.Intent;import android.content.IntentFilter;import android.os.IBinder;import java.security.Provider;public class MessageService extends Service { private MessageReciever mReceiver; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { mReceiver = new MessageReciever(); IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(mReceiver, filter); } @Override public void onDestroy() { if(null != mReceiver) { unregisterReceiver(mReceiver); mReceiver = null; } } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); }}
package com.example.myapplication;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.telephony.TelephonyManager;import android.widget.Toast;import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA;public class MessageReciever extends BroadcastReceiver { private static final String SMS_RECEIVER_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { StringBuilder sBuilder = new StringBuilder(); String format = intent.getStringExtra("format"); if(SMS_RECEIVER_ACTION.equals(intent.getAction())) { Bundle bundle = intent.getExtras(); if(null != bundle) { Object[] pdus = (Object[])bundle.get("pdus"); assert pdus != null; SmsMessage[] messages = new SmsMessage[pdus.length]; for(int i = 0; i < messages.length; ++i) { messages[i] = SmsMessage.createFromPdu((byte[])pdus[i],format); } for(SmsMessage msg : messages) { sBuilder.append("来自:").append(msg.getDisplayOriginatingAddress()).append("\n").append("短信内容:"); sBuilder.append(msg.getDisplayMessageBody()).append("\n"); } } } Toast.makeText(context, "吆喝,快看!! 您收到了一条短信!!\n" + sBuilder.toString(), Toast.LENGTH_LONG).show(); }}
运行效果:
我这是用的Android studio自带的 AVD调试的,你可以直接利用模拟器旁边的菜单栏进行发送短信,方法如下图:
1、首先点击这个按钮
2、然后在弹出的界面中进行下图操作
要注意的是:
1、上面的程序写完后要在 manifests 文件中进行短信权限的注册,添加如下代码:
android:name="android.permission.RECEIVE_SMS"/> android:name="android.permission.SEND_SMS"/> android:name="android.permission.READ_SMS"/> android:name="android.permission.WRITE_SMS" />
2、运行完程序打包完成APP后要打开此应用的短信权限,如下:
3、关于接收短信时候, 在Android Studio中编辑代码提示
createFromPdu(byte[] pdu)这个方法不推荐使用了
然后查得知从API 23以后应该用
createFromPdu(byte[ ], String) 代替,第二个参数应该是短信的类型,GSM与CDMA短信的解码方式不同,所以应该传入这个参数。添加如下代码
String format = intent.getStringExtra(“format”);
来从Intent 中获取format;
参考博文:https://blog.csdn.net/wushuangbuhuan/article/details/50886017
更多相关文章
- Android中的消息机制(Handler)
- Android消息机制(六) 总结
- Android通过WebView实现office文档在线预览无法显示问题解决
- Android(安卓)中的依赖注入框架
- Android(安卓)Studio Intent使用(显式、隐式) 第一行代码
- 运用smali自动注入技术分析android应用程序行为
- android连接webapp发送接收消息最简实现
- [Android(安卓)实例] 史上最全的Android的Tab与TabHost讲解
- 新浪微博布局学习――妙用TabHost