Android 广播接收机&x2B;收到短信
我想让我的应用程序捕捉传入的短信。这方面有几个例子。看起来我们只需要这样做:Android 广播接收机&x2B;收到短信,android,Android,我想让我的应用程序捕捉传入的短信。这方面有几个例子。看起来我们只需要这样做: // AndroidManifest.xml <receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver&
// AndroidManifest.xml
<receiver android:name=".SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
// SMSReceiver.java
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "SMS received.");
....
}
}
//AndroidManifest.xml
//SMSReceiver.java
公共类SMSReceiver扩展了BroadcastReceiver
{
@凌驾
public void onReceive(上下文、意图){
Log.i(标记“收到短信”);
....
}
}
这是正确的吗?我正在给手机发送一些短信,但日志声明从未打印出来。我确实在手机上安装了一些其他短信应用程序,当收到短信时会显示一个弹出窗口——它们是否以某种方式阻止了意图传递到我的应用程序,它们只是完全消费了它
谢谢你试过了吗
在emulator中部署应用程序后,您可以通过DDMS或通过与telnet连接的命令行发送SMS等事件:
telnet localhost <port_emulator>
send sms <incoming_tel_number> <sms_content>
telnet本地主机
发送短信
端口模拟器通常是
5554
您还需要在清单文件中指定使用权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
以下教程应该会有所帮助:
您应该阅读这篇关于以编程方式发送和接收短信的活动。
这些答案没有提到的另一件事是,您应该需要android.permission.BROADCAST\u SMS的许可。如果您不这样做,任何应用程序都可能在您的应用程序中伪造消息
<receiver android:name=".SMSReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
还请注意,Hangouts应用程序当前将阻止我的BroadcastReceiver接收SMS消息。在我的短信广播开始被解雇之前,我不得不在Hangouts应用程序中禁用短信功能(设置->短信->打开短信) 编辑:看起来好像某些应用程序将中止该意图上的广播(),这将阻止其他应用程序接收该意图。解决方案是增加
intent filter
标记中的android:priority
属性:
<receiver android:name="com.company.application.SMSBroadcastReceiver" >
<intent-filter android:priority="500">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
路上有一些陷阱。您可以在stackoverflow上找到所有需要的信息。为了方便起见,我收集了这个答案中的所有信息
注意事项
我假设android kitkat及以上版本
输入sms的目的是“android.provider.Telephony.sms\u RECEIVED”
“android.permission.RECEIVE_SMS”
,才能接收SMS消息。在android 6及以上版本中,您还需要在运行时请求许可adb shell am广播将不起作用。使用telnet连接到模拟器以测试sms接收
$ telnet localhost 5554
Android控制台:需要身份验证
,则需要使用以下命令对连接进行身份验证:
auth xxxxxx
sms send 555 "This is a message"
用从~/.emulator\u console\u auth\u令牌
文件读取的令牌替换上面的xxxxxx
auth xxxxxx
sms send 555 "This is a message"
您可以将555替换为发件人电话号码和您自己的邮件BroadcastReceiver
对象。您可以在manifest.xml中执行此操作,或者只需调用registerReceiver
函数即可。我将向你们展示后者,因为它更容易推理,也更灵活
将广播接收器与主活动连接
数据流是一种方式。从广播接收器到主要活动。因此,让他们交谈的最简单方法是使用函数接口。活动将实现这样一个函数,广播接收器将把活动实例作为参数传递给构造函数
文件SmsHandler.java:
package ...
interface SmsHandler {
void handleSms(String sender, String message);
}
实现广播接收器
广播接收器将在回调中获得目的。我们将使用函数Telephony.Sms.Intents.getMessagesFromIntent(intent)
来获取Sms消息。请注意构造函数中的SmsHandler参数。这将是我们将收到的短信发送到的活动
文件SmsInterceptor.java:
package ...
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import android.telephony.SmsMessage;
public class SmsInterceptor extends BroadcastReceiver {
private SmsHandler handler;
/* Constructor. Handler is the activity *
* which will show the messages to user. */
public SmsInterceptor(SmsHandler handler) {
this.handler = handler;
}
@Override
public void onReceive(Context context, Intent intent) {
/* Retrieve the sms message chunks from the intent */
SmsMessage[] rawSmsChunks;
try {
rawSmsChunks = Telephony.Sms.Intents.getMessagesFromIntent(intent);
} catch (NullPointerException ignored) { return; }
/* Gather all sms chunks for each sender separately */
Map<String, StringBuilder> sendersMap = new HashMap<>();
for (SmsMessage rawSmsChunk : rawSmsChunks) {
if (rawSmsChunk != null) {
String sender = rawSmsChunk.getDisplayOriginatingAddress();
String smsChunk = rawSmsChunk.getDisplayMessageBody();
StringBuilder smsBuilder;
if ( ! sendersMap.containsKey(sender) ) {
/* For each new sender create a separate StringBuilder */
smsBuilder = new StringBuilder();
sendersMap.put(sender, smsBuilder);
} else {
/* Sender already in map. Retrieve the StringBuilder */
smsBuilder = sendersMap.get(sender);
}
/* Add the sms chunk to the string builder */
smsBuilder.append(smsChunk);
}
}
/* Loop over every sms thread and concatenate the sms chunks to one piece */
for ( Map.Entry<String, StringBuilder> smsThread : sendersMap.entrySet() ) {
String sender = smsThread.getKey();
StringBuilder smsBuilder = smsThread.getValue();
String message = smsBuilder.toString();
handler.handleSms(sender, message);
}
}
}
最后记住将接收短信权限添加到清单xml中
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application>
...
</application>
</manifest>
...
Android Messenger(SMS客户端)具有“聊天”功能,可通过WiFi而不是SMS传输消息
如果与您一起测试的人也使用Messenger,则您需要在一台或两台设备上禁用此功能,否则实际上不会收到SMS消息:
要关闭聊天功能,请执行以下操作: