android接受短信监听

想要监听手机的短信,准备通过广播去拿 但是没反应


```java

public class SmsReceiver extends BroadcastReceiver {
    public static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "SmsReceiver";
    public SmsReceiver() {
        Log.i("TAG", "new SmsReceiver");
    }
    @Override
    public void onReceive(final Context context, Intent intent) {
        Log.i(TAG, "jie shou dao");
        Cursor cursor = null;
        try {
            if (SMS_RECEIVED.equals(intent.getAction())) {
                Log.d(TAG, "sms received!");
                Bundle bundle = intent.getExtras();
                if (bundle != null) {
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    final SmsMessage[] messages = new SmsMessage[pdus.length];
                    for (int i = 0; i < pdus.length; i++) {
                        messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    }
                    if (messages.length > 0) {
                        String content = messages[0].getMessageBody();
                        String sender = messages[0].getOriginatingAddress();
                        long msgDate = messages[0].getTimestampMillis();
                        String smsToast = "New SMS received from : "
                                + sender + "\n'"
                                + content + "'";
                        Toast.makeText(context, smsToast, Toast.LENGTH_LONG)
                                .show();
                        Log.d(TAG, "message from: " + sender + ", message body: " + content
                                + ", message date: " + msgDate);
                        //自己的逻辑
                    }
                }
                cursor = context.getContentResolver().query(Uri.parse("content://sms"), new String[] { "_id", "address", "read", "body", "date" }, "read = ? ", new String[] { "0" }, "date desc");
                if (null == cursor){
                    return;
                }
                Log.i(TAG,"m cursor count is "+cursor.getCount());
                Log.i(TAG,"m first is "+cursor.moveToFirst());
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "Exception : " + e);
        } finally {
            if (cursor != null) {
                cursor.close();
                cursor = null;
            }
        }
    }
filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        receiver = new SmsReceiver();
        registerReceiver(receiver, filter);//注册广播接收器

service也注册了 但是来短信了就是没反应

如果您的 service 已经正确地注册了 SmsReceiver,而且您已经确保权限已正确设置,但是在接收短信时没有任何反应,那么可能有以下几个原因:

  • SmsReceiver 没有被正确调用:确保您的 SmsReceiver 已被正确调用。在 SmsReceiver 类的构造函数中,您已经输出了一条日志消息,这是一种简单的调试方式。您也可以在 onReceive 方法中添加日志消息来确保该方法已经被正确调用。
  • IntentFilter 没有正确设置:确保您的 IntentFilter 已经正确设置,并且只接收您感兴趣的广播。在这种情况下,您已经正确地设置了一个过滤器,只接收 android.provider.Telephony.SMS_RECEIVED 这个广播。
  • BroadcastReceiver 没有正确处理短信:在 SmsReceiver 类的 onReceive 方法中,您已经处理了接收到的短信并打印了日志消息。如果您的 BroadcastReceiver 没有正确处理短信,您将不会看到任何反应。确保您的 onReceive 方法正确地处理了接收到的短信,包括从 Intent 中提取短信信息、处理短信内容等。

如果您仍然无法解决问题,请尝试在 onReceive 方法中添加更多的日志消息,以便更好地了解您的代码在哪里出现了问题。

您的代码似乎没有明显的问题,但是可能有以下几个方面需要注意:

1. 权限问题:监听短信需要权限。请确保您的应用程序具有读取短信的权限。您可以在AndroidManifest.xml文件中添加以下行:

<uses-permission android:name="android.permission.READ_SMS" />

2.需要动态请求权限:在Android 6.0及更高版本中,您需要在运行时请求读取短信的权限。可以在您的Activity中添加以下代码:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, READ_SMS_PERMISSION_CODE);
}

其中READ_SMS_PERMISSION_CODE是您可以自定义的常量。
3.BroadcastReceiver注册问题:您提到了在service中注册了BroadcastReceiver,但是没有提供代码。请确保您已正确注册BroadcastReceiver。可以在您的Service中添加以下代码:

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

如果仍然存在问题,建议您检查一下其他应用程序是否也在监听短信。在Android中,只允许一个应用程序同时监听短信,因此如果有其他应用程序在监听短信,您的应用程序将无法收到广播。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^