Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检测传入的SMS消息_Android_Broadcastreceiver_Sms_Android Sms - Fatal编程技术网

Android 检测传入的SMS消息

Android 检测传入的SMS消息,android,broadcastreceiver,sms,android-sms,Android,Broadcastreceiver,Sms,Android Sms,在我的android代码中,我试图检测传入的SMS消息。下面的代码从2年前就开始工作了,但现在它停止了工作。我缺少什么更新 public class SmsListener extends BroadcastReceiver { private String msgBody; private SharedPreferences preferences; @Override public void onReceive(Context context, Inten

在我的android代码中,我试图检测传入的SMS消息。下面的代码从2年前就开始工作了,但现在它停止了工作。我缺少什么更新

public class SmsListener extends BroadcastReceiver {

    private String msgBody;
    private SharedPreferences preferences;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub


        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){

            Toast.makeText(context,"message received",Toast.LENGTH_SHORT).show();

            Bundle bundle = intent.getExtras();           //---get the SMS message passed in---
            SmsMessage[] msgs = null;
            String msg_from;
            if (bundle != null){
                //---retrieve the SMS message received---
                try{
                    Object[] pdus = (Object[]) bundle.get("pdus");
                    msgs = new SmsMessage[pdus.length];
                    for(int i=0; i<msgs.length; i++){
                        msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                        msg_from = msgs[i].getOriginatingAddress();
                        msgBody = msgs[i].getMessageBody();
                        MainActivity.handleMessage(msgBody);
                    }

                    Toast.makeText(context,"message is:"+msgBody,Toast.LENGTH_SHORT).show();
                }catch(Exception e){
                    Log.d("Exception caught",e.getMessage());
                }
            }
        }
    }
My Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.zaidalmahmoud.expenseless">

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

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".GraphActivity"></activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".SmsListener"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <activity android:name=".DetailedExpenseActivity" />
    </application>

</manifest>
当收到短信时,我的android应用程序没有检测到它,但它不会崩溃或显示任何内容。为什么?谢谢


注意:我对捕捉带有验证码的短信不感兴趣。我希望我的应用程序能够捕获任何传入的短信。

Android应用程序需要短信接收/读取权限才能检索短信内容。 Google已经引入了SMS Retriever API,该API允许在应用程序中检索OTP,而无需SMS权限

为SMS检索器API添加这些依赖项

然后创建一个如下所示的界面:

public interface OnNewMessageListener {
    void onNewMessageReceived(String activationCode);
}
然后,创建广播接收器以捕获sms:

public class SmsBroadcastReceiver extends BroadcastReceiver {
    OnNewMessageListener onNewMessageListener;

    public SmsBroadcastReceiver() {
    }

    public SmsBroadcastReceiver(OnNewMessageListener onNewMessageListener) {
        this.onNewMessageListener = onNewMessageListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

                if (status != null)
                    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.
                            if (!TextUtils.isEmpty(message)) {
                                String activationCode = null;
                                Pattern p = Pattern.compile("your pattern like \\b\\d{4}\\b");
                                Matcher m = p.matcher(message);
                                if (m.find()) {
                                    activationCode = (m.group(0));  // The matched substring
                                }

                                if (onNewMessageListener != null && !TextUtils.isEmpty(activationCode))
                                    onNewMessageListener.onNewMessageReceived(activationCode);
                            }
                            break;
                        case CommonStatusCodes.TIMEOUT:
                            // Waiting for SMS timed out (5 minutes)
                            // Handle the error ...
                            break;
                    }
            }
        }
    }
}
在您的AndroidManifest接收端:

        <receiver
            android:name=".SmsBroadcastReceiver"
            android:exported="true"
            tools:ignore="ExportedReceiver">
            <intent-filter>
                <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
            </intent-filter>
        </receiver>
更新

将您的广播接收器更改为:


Android应用程序需要SMS接收/读取权限才能检索SMS内容。 Google已经引入了SMS Retriever API,该API允许在应用程序中检索OTP,而无需SMS权限

为SMS检索器API添加这些依赖项

然后创建一个如下所示的界面:

public interface OnNewMessageListener {
    void onNewMessageReceived(String activationCode);
}
然后,创建广播接收器以捕获sms:

public class SmsBroadcastReceiver extends BroadcastReceiver {
    OnNewMessageListener onNewMessageListener;

    public SmsBroadcastReceiver() {
    }

    public SmsBroadcastReceiver(OnNewMessageListener onNewMessageListener) {
        this.onNewMessageListener = onNewMessageListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

                if (status != null)
                    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.
                            if (!TextUtils.isEmpty(message)) {
                                String activationCode = null;
                                Pattern p = Pattern.compile("your pattern like \\b\\d{4}\\b");
                                Matcher m = p.matcher(message);
                                if (m.find()) {
                                    activationCode = (m.group(0));  // The matched substring
                                }

                                if (onNewMessageListener != null && !TextUtils.isEmpty(activationCode))
                                    onNewMessageListener.onNewMessageReceived(activationCode);
                            }
                            break;
                        case CommonStatusCodes.TIMEOUT:
                            // Waiting for SMS timed out (5 minutes)
                            // Handle the error ...
                            break;
                    }
            }
        }
    }
}
在您的AndroidManifest接收端:

        <receiver
            android:name=".SmsBroadcastReceiver"
            android:exported="true"
            tools:ignore="ExportedReceiver">
            <intent-filter>
                <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
            </intent-filter>
        </receiver>
更新

将您的广播接收器更改为:


在android清单文件中声明SMS读取和接收权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
您可以使用内置的android权限模块或RxPermission:

  val rxPermissions = RxPermissions(this)
    rxPermissions.request(
            Manifest.permission.READ_SMS,
            Manifest.permission.RECEIVE_SMS)
            .subscribe(object : Observer<Boolean> {
                override fun onNext(t: Boolean) {
                    if (t) {

                    } else {
                        Toast.makeText(activity, getString(R.string.permission_request_denied), Toast.LENGTH_LONG).show()
                    }
                }
                override fun onSubscribe(d: Disposable) {}
                override fun onError(e: Throwable) {}
                override fun onComplete() {}
            })

在android清单文件中声明SMS读取和接收权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
您可以使用内置的android权限模块或RxPermission:

  val rxPermissions = RxPermissions(this)
    rxPermissions.request(
            Manifest.permission.READ_SMS,
            Manifest.permission.RECEIVE_SMS)
            .subscribe(object : Observer<Boolean> {
                override fun onNext(t: Boolean) {
                    if (t) {

                    } else {
                        Toast.makeText(activity, getString(R.string.permission_request_denied), Toast.LENGTH_LONG).show()
                    }
                }
                override fun onSubscribe(d: Disposable) {}
                override fun onError(e: Throwable) {}
                override fun onComplete() {}
            })

我感谢您的帮助,但我不想检测带有验证码的短信。我的问题是关于捕捉任何短信。事实上,我对一种完全不同的短信很感兴趣。谢谢,我试图重用其中的一些代码,但我看不出我的代码和他的代码有多大区别,我的应用程序也没有任何变化。未检测到SMS。我要知道我的错误到底在哪里。我想告诉你,它只工作过一次,然后就停止工作了,我不知道为什么。我把你的代码放在上面的最后一行edit@TravelingSalesman我认为您的问题在于:MainActivity.HandleMessagesAgBody;使用一个界面来更新或将数据发送到主活动。除了一条toast消息之外,我没有做任何更改,现在它又开始工作了。我会继续测试它,并让你知道。但我高度怀疑MainActivity.HandleMessagesAgBody中是否存在问题,因为我对它进行了良好的测试,或者至少因为它现在可以正常工作,没有任何问题。我感谢您的帮助,但我不想检测带有验证码的短信。我的问题是关于捕捉任何短信。事实上,我对一种完全不同的短信很感兴趣。谢谢,我试图重用其中的一些代码,但我看不出我的代码和他的代码有多大区别,我的应用程序也没有任何变化。未检测到SMS。我要知道我的错误到底在哪里。我想告诉你,它只工作过一次,然后就停止工作了,我不知道为什么。我把你的代码放在上面的最后一行edit@TravelingSalesman我认为您的问题在于:MainActivity.HandleMessagesAgBody;使用一个界面来更新或将数据发送到主活动。除了一条toast消息之外,我没有做任何更改,现在它又开始工作了。我会继续测试它,并让你知道。但我非常怀疑MainActivity.HandleMessagesAgBody中是否存在问题,因为我对它进行了良好的测试,或者至少因为它现在可以正常工作,没有任何问题。您使用的是什么语言?那绝对不是javasyntax@Traveling这是Kotlin用于Android应用程序开发的新语言不幸的是,我使用的是带有Java语法的Android studio。您使用的是什么语言?那绝对不是javasyntax@Traveling这是Kotlin用于Android应用程序开发的新语言不幸的是,我使用的是带有Java语法的Android studio。
class SMSReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent?) {
    if (intent != null && intent.action != null && intent.action!!.equals("android.provider.Telephony.SMS_RECEIVED", ignoreCase = true)) {
        val bundle = intent.extras
        if (bundle != null) {
            val sms = bundle.get(SMS_BUNDLE) as Array<Any>?
            val smsMsg = StringBuilder()

            var smsMessage: SmsMessage
            if (sms != null) {
                for (sm in sms) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        val format = bundle.getString("format")
                        smsMessage = SmsMessage.createFromPdu(sm as ByteArray, format)
                    } else {
                        smsMessage = SmsMessage.createFromPdu(sm as ByteArray)
                    }


                    val msgBody = smsMessage.messageBody.toString()
                    val msgAddress = smsMessage.originatingAddress

                    smsMsg.append("SMS from : ").append(msgAddress).append("\n")
                    smsMsg.append(msgBody).append("\n")
                }

                sendBroadcast(smsMsg.toString())
            }
        }
    }
}

private fun sendBroadcast(smsMSG: String) {
    val broadcastIntent = Intent()
    broadcastIntent.action = AppConstants.mBroadcastSMSUpdateAction
    broadcastIntent.putExtra(AppConstants.message, smsMSG)
    EventBus.getDefault().post(EventIntent(broadcastIntent))
}

companion object {

    val SMS_BUNDLE = "pdus"
}
}
  <receiver
        android:name=".SMSReceiver"
        android:enabled="true">
        <intent-filter android:priority="2147483647">
            <category android:name="android.intent.category.DEFAULT" />

            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_SMS
  val rxPermissions = RxPermissions(this)
    rxPermissions.request(
            Manifest.permission.READ_SMS,
            Manifest.permission.RECEIVE_SMS)
            .subscribe(object : Observer<Boolean> {
                override fun onNext(t: Boolean) {
                    if (t) {

                    } else {
                        Toast.makeText(activity, getString(R.string.permission_request_denied), Toast.LENGTH_LONG).show()
                    }
                }
                override fun onSubscribe(d: Disposable) {}
                override fun onError(e: Throwable) {}
                override fun onComplete() {}
            })