Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 广播接收机&x2B;收到短信_Android - Fatal编程技术网

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及以上版本中,您还需要在运行时请求许可
  • 您不需要在意图过滤器中设置数据的MIME类型。如果未设置MIME类型,则Intent筛选器应该只传递空数据,但幸运的是,它在没有MIME的情况下仍然可以工作
  • adb shell am广播将不起作用。使用telnet连接到模拟器以测试sms接收
  • 长sms消息被划分为小sms块。我们需要将它们连接起来
  • 如何向模拟器发送sms消息 最重要的是能够向设备发送假短信,这样我们就可以测试代码了

    为此,我们将使用虚拟设备和telnet连接

  • 在android studio中创建一个虚拟设备并运行模拟器
  • 查看模拟器窗口中的标题栏。有设备名称和端口号。在接下来的步骤中,我们需要知道这个端口号
  • 现在使用telnet连接到模拟器标题栏中显示的端口号

     $ telnet localhost 5554
    
  • 如果您看到以下内容:
    Android控制台:需要身份验证
    ,则需要使用以下命令对连接进行身份验证:

     auth xxxxxx
    
     sms send 555 "This is a message"
    
    用从
    ~/.emulator\u console\u auth\u令牌
    文件读取的令牌替换上面的
    xxxxxx

  • 现在您应该能够运行所有命令了。要发送sms消息,请键入以下命令:

     auth xxxxxx
    
     sms send 555 "This is a message"
    
    您可以将555替换为发件人电话号码和您自己的邮件

  • 如何收听SMS_收到的广播 要获得广播,您需要注册一个
    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消息:

    要关闭聊天功能,请执行以下操作:
  • 打开标志轮的消息
  • 单击“更多”,然后单击“设置”
  • 点击高级,然后点击聊天功能
  • 打开或关闭启用聊天功能
  • 检查logcat以查看