9

首先,我已经搜索了可能的解决方案,尝试了所有方法,但仍然无效。我肯定错过了什么。

我正在尝试创建一个接收/读取和写入 SMS 的应用程序。写入部分工作得很好,我的广播接收器只是没有捕捉到广播。

AndroidManifest.xml

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
...
        <receiver android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
        </receiver>

短信接收器.java

public class SmsReceiver extends BroadcastReceiver {

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

    Toast.makeText(context, "ON RECEIVE BROADCAST", Toast.LENGTH_LONG).show();
    Log.d("ON ","RECEIVE");
     Bundle bundle = intent.getExtras();
        Object[] messages = (Object[]) bundle.get("pdus");
        SmsMessage[] sms = new SmsMessage[messages.length];
        // Create messages for each incoming PDU
        for (int n = 0; n < messages.length; n++) {
            sms[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
        }
        for (SmsMessage msg : sms) {
            Log.e("RECEIVED MSG",":"+msg.getMessageBody());
            // Verify if the message came from our known sender

        }
}

没有任何日志或敬酒被解雇。

尝试将清单上的操作更改为android.intent.action.AIRPLANE_MODE仅测试声明并接收到广播,但这对 SMS 不起作用。

更新

用另一部手机试了下,效果不错。一定是因为我使用的是 Handcent SMS,以及它如何阻止广播。无论哪种方式,我都需要它独立于安装的应用程序在每部手机上工作。

4

4 回答 4

6

尝试将您的接收器声明如下:

<receiver android:name=".SmsReceiver" android:permission="android.permission.BROADCAST_SMS" android:exported="true">
    <intent-filter android:priority="5822" >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
 </receiver>

这对我来说很好,我只添加了一个标志来说明这一点receiver is exported

编辑: 我忘记将优先级添加到意图过滤器。使用高数字作为优先级。

于 2013-10-21T17:07:58.463 回答
6

找到了一个回答我疑惑的话题:在另一个应用程序中抑制/阻止广播接收器

即使优先级设置为最大可能 (999),如果另一个应用程序具有相同的优先级,在这种情况下是 Handcent SMS 应用程序,第一个接收广播的应用程序是用户首先安装的应用程序。

在我的例子中是 Handcent SMS,因为它在收到它时会中止广播,所以我的应用程序什么也没有收到。

于 2013-10-23T11:01:42.010 回答
4

正如@Maxim Toyberman 所说,您需要在运行时请求许可(如此处所述https://stackoverflow.com/a/35972161/3427883

基本上你需要确保你有权限接收短信如下

        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.RECEIVE_SMS}, 1);
于 2018-09-19T00:11:45.520 回答
1

我已经尝试了所有方法,它可以在很多手机上运行,​​但不是我的,我试图在朗姆酒时间征求许可(我有 nexus 5 版本 23)。它对我有用。

于 2016-04-14T13:00:17.657 回答