BroadcastReceiver SMS_Received 在新设备上不工作
BroadcastReceiver SMS_Received not working on new devices
在查看了多个资源和问题后,我仍然面临检测传入 SMS 消息的问题。
下面的代码显示了基础知识:
在接收时显示 toast 的广播接收器class
public class IncomingSms extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show();
}
}
带有注册接收器和权限的简单清单
<application
<receiver
android:name=".IncomingSms"
android:permission="android.permission.BROADCAST_SMS"
android:exported="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
上面的代码声明并注册了接收器,并具有适当的权限。另外,优先级设置为MAX_INT,即2147483647.
我的设备是 Nexus 6P,安装了默认的 Messenger 应用程序(我也试过 Hangouts)。该应用程序仍然不显示我的吐司。在较旧的三星设备上试用后,祝酒词打印正确。
优先问题
我在 6P 上安装了一个名为 Manifest Viewer 的应用程序,它允许我查看我设备上安装的 manifest.xml 个应用程序。我检查了 Messenger 和 Hangouts 的 manifests,对于 SMS 标签的接收者,发现它们都指定了 2147483647 的优先级。似乎这两个 Messenger 应用程序都最大化了优先级,并且一旦他们使用消息,他们不允许其他应用程序干预。请注意,这些是常用 Google 应用程序,而不是第 3 方。
在这一点上,我很困惑:
- 他们为什么要这样做?
- 如何绕过它?
非常感谢
请确保您的实现是这样的。
短信接收器class
public class SmsReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
// get sms objects
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0) {
return;
}
// large message might be broken into many
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// prevent any other broadcast receivers from receiving broadcast
// abortBroadcast();
}
}
}
}
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smsreceiver"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity
// your activity
</activity>
<receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
确保使用自己定义的包。此处定义的包是虚拟的。
好的,问题已解决。
问题不在于优先级,而在于我的 phone 是 Nexus 6P (a.k.a。API 23)。
仅在 manifest.xml 中提供权限是不够的,我必须为运行时权限请求添加代码。参见 Android documentation for runtime permissions
将此代码添加到您的 MainActiviy:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
在 MainActivity 的顶部定义它 Class:
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
并添加此覆盖:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
// YES!!
Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES");
}
}
在查看了多个资源和问题后,我仍然面临检测传入 SMS 消息的问题。
下面的代码显示了基础知识:
在接收时显示 toast 的广播接收器class
public class IncomingSms extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "something received", Toast.LENGTH_SHORT).show();
}
}
带有注册接收器和权限的简单清单
<application
<receiver
android:name=".IncomingSms"
android:permission="android.permission.BROADCAST_SMS"
android:exported="true">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
上面的代码声明并注册了接收器,并具有适当的权限。另外,优先级设置为MAX_INT,即2147483647.
我的设备是 Nexus 6P,安装了默认的 Messenger 应用程序(我也试过 Hangouts)。该应用程序仍然不显示我的吐司。在较旧的三星设备上试用后,祝酒词打印正确。
优先问题
我在 6P 上安装了一个名为 Manifest Viewer 的应用程序,它允许我查看我设备上安装的 manifest.xml 个应用程序。我检查了 Messenger 和 Hangouts 的 manifests,对于 SMS 标签的接收者,发现它们都指定了 2147483647 的优先级。似乎这两个 Messenger 应用程序都最大化了优先级,并且一旦他们使用消息,他们不允许其他应用程序干预。请注意,这些是常用 Google 应用程序,而不是第 3 方。
在这一点上,我很困惑:
- 他们为什么要这样做?
- 如何绕过它?
非常感谢
请确保您的实现是这样的。
短信接收器class
public class SmsReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
// get sms objects
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0) {
return;
}
// large message might be broken into many
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// prevent any other broadcast receivers from receiving broadcast
// abortBroadcast();
}
}
}
}
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smsreceiver"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity
// your activity
</activity>
<receiver android:name="com.example.smsreceiver.SmsReceiver" android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
确保使用自己定义的包。此处定义的包是虚拟的。
好的,问题已解决。 问题不在于优先级,而在于我的 phone 是 Nexus 6P (a.k.a。API 23)。
仅在 manifest.xml 中提供权限是不够的,我必须为运行时权限请求添加代码。参见 Android documentation for runtime permissions
将此代码添加到您的 MainActiviy:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
在 MainActivity 的顶部定义它 Class:
private int MY_PERMISSIONS_REQUEST_SMS_RECEIVE = 10;
并添加此覆盖:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_SMS_RECEIVE) {
// YES!!
Log.i("TAG", "MY_PERMISSIONS_REQUEST_SMS_RECEIVE --> YES");
}
}