SMSReceiver复写BroadcastReceiver监听短信广播,onReceive不运行

前言:最近在学习MarsChen老师的Android视频中的广播机制一节,BroadcastReceiver。学到监听系统短信通知,自己用Android Studio按照老师步骤写下来,然后用Android Studio默认自带的模拟器运行(Android Emulator - Nexus_5_API_24:5554),然后用模拟器发送短信(不用DDMS里面Emulator Control发,模拟器里面自己有,百度一下)。发现我并没有监听到短信是否来了。就是下面这个方法没有被执行。(按道理注册了这个BroadcastReceiver,收到了短信,此处onReceive应该执行的,但却没有)

@Override
public void onReceive(Context context, Intent intent) {
    
}
折腾了一天,反正各种百度和Google(个人比较水,反正没找到什么好的方法),乱七八糟的方式都试了,都没有成功。

先说下自己代码:

1、继承BroadcastReceiver复写SMSReceiver

public class SMSReceiver extends BroadcastReceiver {

    public SMSReceiver() {
        System.out.println("SMSReceiver");
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceive");
        Toast.makeText(context, "短信来了", Toast.LENGTH_SHORT).show();
    }
}

2、AndroidManifest.xml权限设置

<uses-permission android:name="android.permission.RECEIVE_SMS" />
3、通过动态注册(静态注册和动态注册有区别,区别自己可以百度知道)

SMSReceiver smsReceiver;//这个写onCreate之上

//这个随便写在一个button监听里面

smsReceiver = new SMSReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver,filter);

4、通过代码发送短信广播(大概是短信到了、收到短信intent都会发送这么个广播通知,通过模拟器模拟发送短信,感觉效果应该差不多,具体我也说不清)

Intent intent = new Intent();
intent.setAction("android.provider.Telephony.SMS_RECEIVED");
sendBroadcast(intent);

按照上面弄完了,用之前先注册SMSReceiver

1、然后我先用模拟器发送短信到电脑模拟手机上,SMSReceiver中onReceive没运行

2、用上面4,通过代码发送短信广播,logcat中直接报错

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.provider.Telephony.SMS_RECEIVED from pid=7654, uid=10069

反正就是不让发这个广播,网上又说什么只允许系统默认短信应用发送什么的,反正一大堆,看得我头疼。


然后本人还有一枚小米2s,抱着试一试的心态,把app安装到我的小米2s上面,手机中设置(安全中心-授权管理-应用权限管理,找到自己app,把所有权限都给了,我自己的习惯,不想因为系统给自己app造成困扰)

先注册SMSReceiver,代码发送短信广播,onReceive竟然运行了。卧槽。

再给联通10010发送了一个101,再马上回到自己的测试app,联通回复一个短信后,onReceive也运行了。


我个人觉得,这种问题应该跟Google系统权限啊,每个版本保护或对接受短信广播应该控制了,小米用自己的系统应该把这个权限开启了。

我小米是Android 5.0.2的MIUI开发版。

测试软件compile sdk version是Android 7

模拟器是 Nexus_5的。


能想到的就是这些,网上各种加什么的写法,我基本都试了,一句话:不行!

总结:版本+权限问题(这也不怪讲师,也许他们那时候就没遇到这问题,希望后面的朋友注意)


哪位大神看到了,知道真正原因还望告知一下。


你可能感兴趣的:(坑)