[英]BroadcastReceiver SMS_Received not working on new devices
在經歷了幾個資源和問題后,我仍然面臨檢測傳入SMS消息的問題。
下面的代碼顯示了基礎知識:
顯示Toast onReceive的廣播接收器類
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應用程序(我也嘗試過環聊)。 該應用程序仍然不顯示我的祝酒詞。 嘗試使用較舊的三星設備后,正確打印了祝酒詞。
優先問題
我在6P上安裝了一個名為Manifest Viewer的應用程序,它允許我查看設備上安裝的應用程序的manifest.xml。 我檢查了Messenger和Hangouts的清單,為SMS標簽的接收者,並發現他們兩個也指定優先級2147483647.似乎這兩個信使應用程序最大優先級,並且一旦他們消費該消息,他們不允許其他應用程序進行干預。 請注意,這些是Google應用程序的庫存,而不是第三方。
在這一點上,我很困惑:
非常感謝
好的,問題解決了。 問題不在於優先事項,而是我的手機是Nexus 6P(又名API 23)。
僅在manifest.xml中提供權限是不夠的,我不得不為運行時權限請求添加代碼。 有關運行時權限,請參閱Android文檔
將此代碼添加到您的MainActiviy:
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.RECEIVE_SMS},
MY_PERMISSIONS_REQUEST_SMS_RECEIVE);
在MainActivity類的頂部定義它:
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 Receiver類
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>
確保使用自己定義的包。 這里定義的包是虛擬的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.