您好我正在尝试捕获短信内容并在我的应用中使用,所以我制作了一个具有权限和清单的BroadcastReceiver但是当设备收到短信时,我的代码没有运行,这意味着BroadcastReceiver不会触发。 我在这里内外检查了很多文章,有一些:
Android Sms Receiver Result to Main Activity SMS receiver didn't work
Android SMS Receiver not working
Broadcast Receiver not working for SMS
这是我Manifest的一部分:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<application.
...
...
<receiver android:name="com.example.android.receiver.SmsReceiver"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
这是我的接收者
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "SMS Received!", Toast.LENGTH_LONG).show();
}
}
我还尝试在活动onCreate()内动态注册接收器,但没有改变
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
intentFilter.setPriority(2147483647);
registerReceiver(new SmsReceiver(), intentFilter);
有谁知道问题出在哪里?它应该只是Toast一条消息被收到所以我可以继续工作,但接收器似乎甚至没有开火
答案 0 :(得分:2)
您应该阅读Automatic SMS Verification
。
公共抽象任务startSmsRetriever()
启动SmsRetriever,它将等待匹配的SMS消息,直到超时(5分钟)。匹配的SMS消息将通过带有操作的广播意图发送
\s
。
准备好验证用户的电话号码时,请获取SmsRetrieverClient
对象的实例,调用startSmsRetriever,并将成功和失败侦听器附加到SMS检索任务:
SmsRetriever.SMS_RETRIEVED_ACTION
在用户设备上收到验证消息后,Play服务会向您的应用明确广播 SmsRetriever.SMS_RETRIEVED_ACTION 目的,其中包含消息的文本。使用 BroadcastReceiver 接收此验证消息。
SmsRetrieverClient mClient = SmsRetriever.getClient(this);
Task<Void> mTask = mClient.startSmsRetriever();
mTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override public void onSuccess(Void aVoid) {
Toast.makeText(YourActivity.this, "SMS Retriever starts", Toast.LENGTH_LONG).show();
}
});
mTask.addOnFailureListener(new OnFailureListener() {
@Override public void onFailure(@NonNull Exception e) {
Toast.makeText(YourActivity.this, "Error", Toast.LENGTH_LONG).show();
}
});
在应用程序的AndroidManifest.xml文件中使用意图过滤器 com.google.android.gms.auth.api.phone.SMS_RETRIEVED 注册您的BroadcastReceiver。
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch(status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get SMS message contents
String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
// Extract one-time code from the message and complete verification
// by sending the code back to your server.
break;
case CommonStatusCodes.TIMEOUT:
// Waiting for SMS timed out (5 minutes)
// Handle the error ...
break;
}
}
}
最后,在onCreate()部分注册您的BroadcastReceiver。
<receiver android:name=".YourBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
出于演示目的,您应该阅读Automatic SMS Verification Android
答案 1 :(得分:0)
我自己找到的。这是有效的代码!它必须包含这样做的SMS_DELIVER_ACTION。 (很多在github上都没有!)
进入“设置”->“ AppsNotifications”->“ DefaultApps”->“ MessagingApp”,将显示“ SMS App”供您选择。
https://android-developers.googleblog.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html https://www.androidauthority.com/how-to-create-an-sms-app-part-2-724264/ https://github.com/treehousefrog/SMS-Project-Part-2
答案 2 :(得分:0)
您应该请求运行时权限才能接收SMS(Android 6.0及更高版本)。
https://developer.android.com/guide/topics/permissions/overview
答案 3 :(得分:0)
首先将另一个应用设为您的默认 SMS 应用。
然后:Google Hangout --> Settings(Disable merged conversations) --> SMS (Disable SMS)
或者,
此示例mainfest
:
<receiver android:name=".SmsBroadcastReceiver"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="999" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<action android:name="android.provider.Telephony.SMS_DELIVER" />
<action android:name="android.provider.Telephony.SMS_DELIVER_ACTION" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>