前言:最近在学习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的。
能想到的就是这些,网上各种加什么的写法,我基本都试了,一句话:不行!
总结:版本+权限问题(这也不怪讲师,也许他们那时候就没遇到这问题,希望后面的朋友注意)
哪位大神看到了,知道真正原因还望告知一下。