如何在 Android Studio 中使用广播接收器接收短信?

Posted

技术标签:

【中文标题】如何在 Android Studio 中使用广播接收器接收短信?【英文标题】:How to use a broadcast receiver to receive SMS in Android Studio? 【发布时间】:2019-04-24 22:40:51 【问题描述】:

我正在构建一个应用程序,该应用程序应在收到 SMS 时触发一个功能。我之前使用过 Broadcast Receivers 和 NotificationListeners,但是为了这个特定的目的,我需要注册这个 Broadcast 接收器。目前,我无法注册它,我也不知道为什么。

对于堆栈溢出的类似问题,我尝试了多个答案,但由于某种原因,我现在用来进行故障排除的Log.d 在我收到短信时不会打印出来。我认为我从根本上误解了这个问题,尽管我不确定如何。

这是我的SmsListener.java 课程:

public class SmsListener extends BroadcastReceiver 
    private SharedPreferences preferences;

    @Override
    public void onReceive(Context context, Intent intent) 
        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
            Log.d("Test","test");
        
    

这是我的清单:

<receiver android:name=".SmsListener">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

这是我应该调用它的活动的onCreate() 函数:

BroadcastReceiver br = new SmsListener();
IntentFilter filter = new IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION);
registerReceiver(br,filter);

感谢您的帮助。我完全不知所措。

【问题讨论】:

您申请过权限吗? 是的,我请求RECEIVE_SMS权限 除了清单条目之外,您是否在运行时请求了它?您是在模拟器还是实际设备上进行测试?顺便说一句,如果您在清单中静态注册,则不一定需要在代码中动态注册实例。 我使用 ActivityCompat.requestPermissions(this,new String[]Manifest.permission.RECEIVE_SMS,1);请求许可,我正在一加物理设备上进行测试 我个人对一加不是很熟悉,但是如果它对第三方应用接收短信,或者在后台运行等有额外的限制,我不会感到惊讶。查看设备设置对于可能阻止向您的应用程序广播的任何其他与安全相关的类型的事情。它也可能位于单独的独立应用程序中。 【参考方案1】:

这是你的接收器类-

私有静态最终字符串 SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; private static final String TAG = "SMSBroadcastReceiver";

@Override
public void onReceive(Context context, Intent intent) 

    if (intent.getAction() != null) 
        if (intent.getAction().equals(SMS_RECEIVED)) 
            Bundle bundle = intent.getExtras();
            if (bundle != null) 
                Object[] pdus = (Object[]) bundle.get("pdus");
                final SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++) 
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    Log.e("Message Content : ", " == " + messages[i].getMessageBody());
                    Log.e("Message Content Body : ", " == " + messages[i].getDisplayMessageBody());
                    Log.e("Message recieved From", " == " + messages[0].getOriginatingAddress());
                
            /*if (messages.length > -1) 
                Log.e("Message recieved: "," == "+ messages[0].getMessageBody());
                Log.e("Message recieved From"," == "+ messages[0].getOriginatingAddress());
            */
            
        
    

【讨论】:

以上是关于如何在 Android Studio 中使用广播接收器接收短信?的主要内容,如果未能解决你的问题,请参考以下文章

Android PDA扫描枪广播接搜条码并使用

Android Studio 学习 广播

Android Studio 如何在 LinearLayout 元素中实现锚链接?

Android Studio - 无法使用广播接收器设置通知

Android studio之广播监听接收短信

android 类中的 广播怎么使用