如何在Android中監聽傳入的簡訊?


介紹

在許多Android應用程式中,我們可以看到用於使用者身份驗證的OTP會被自動檢測並自動新增到應用程式中。使用者無需手動新增OTP。這可以透過廣播接收器在Android應用程式中實現。本文將介紹如何在Android應用程式中監聽傳入的簡訊。

實現

我們將建立一個簡單的應用程式,其中我們將顯示兩個TextView。第一個TextView用於顯示應用程式的標題。第二個TextView我們將用於顯示收到的簡訊。現在讓我們轉向Android Studio建立一個新專案。

步驟1:在Android Studio中建立一個新專案

導航到Android Studio,如下圖所示。在下面的螢幕中,單擊“新建專案”以建立一個新的Android Studio專案。

單擊“新建專案”後,您將看到下面的螢幕。

在這個螢幕中,我們只需選擇“空活動”,然後單擊“下一步”。單擊“下一步”後,您將看到下面的螢幕。

在這個螢幕中,我們只需指定專案名稱。然後包名將自動生成。

注意 - 請確保將語言選擇為Java。

指定所有詳細資訊後,單擊“完成”以建立一個新的Android Studio專案。

專案建立完成後,我們將看到開啟的兩個檔案,即activity_main.xml和MainActivity.java檔案。

步驟2:使用activity_main.xml

導航到activity_main.xml。如果此檔案不可見,則開啟此檔案。在左側面板中導航到app>res>layout>activity_main.xml以開啟此檔案。開啟此檔案後,向其中新增以下程式碼。程式碼中添加了註釋以詳細瞭解。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
   <!--     creating a text view on below line-->
   <TextView
       android:id="@+id/idTVHeading"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:layout_marginStart="20dp"
       android:layout_marginTop="20dp"
       android:layout_marginEnd="20dp"
       android:layout_marginBottom="20dp"
       android:padding="4dp"
       android:text="Listen Incoming SMS Message in Android"
       android:textAlignment="center"
       android:textColor="@color/black"
       android:textSize="20sp"
       android:textStyle="bold" />
   <!--     creating a text view on below line-->
   <TextView
       android:id="@+id/idTVMessage"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@id/idTVHeading"
       android:layout_centerInParent="true"
       android:layout_marginStart="20dp"
       android:layout_marginTop="20dp"
       android:layout_marginEnd="20dp"
       android:layout_marginBottom="20dp"
       android:padding="4dp"
       android:text="Message will appear here"
       android:textAlignment="center"
       android:textColor="@color/black"
       android:textSize="20sp"
       android:textStyle="bold" />
</RelativeLayout>

說明:在上面的程式碼中,我們建立了一個根佈局作為相對佈局。在這個佈局中,我們建立了一個TextView,用於顯示應用程式的標題。之後,我們建立了另一個TextView,我們將在其中顯示收到的簡訊。

步驟3:建立一個介面類

導航到app>java>您的應用程式包名>右鍵單擊它>新建介面類,並將其命名為MessageListnerInterface,然後向其中新增以下程式碼。程式碼中添加了註釋以詳細瞭解。

package com.example.java_test_application;
public interface MessageListenerInterface {
   // creating an interface method for messages received.
   void messageReceived(String message);
}

說明:在上面的程式碼中,我們建立了一個方法,我們將使用它來設定應用程式中接收到的訊息。

步驟4:為廣播接收器建立另一個類

導航到app>java>您的應用程式包名>右鍵單擊它>新建Java類,並將其命名為MessageBroadcastReciever,然後向其中新增以下程式碼。程式碼中添加了註釋以詳細瞭解。

package com.example.java_test_application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
public class MessageBroadcastReceiver extends BroadcastReceiver {
   // creating a variable for a message listener interface on below line.
   private static MessageListenerInterface mListener;
   @Override
   public void onReceive(Context context, Intent intent) {
       // getting bundle data on below line from intent.
       Bundle data = intent.getExtras();
       // creating an object on below line.
       Object[] pdus = (Object[]) data.get("pdus");
       // running for loop to read the sms on below line.
       for (int i = 0; i < pdus.length; i++) {
           // getting sms message on below line.
           SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
           // extracting the sms from sms message and setting it to string on below line.
           String message = "Sender : " + smsMessage.getDisplayOriginatingAddress()
                   + "
Message: " + smsMessage.getMessageBody(); // adding the message to listener on below line. mListener.messageReceived(message); } } // on below line we are binding the listener. public static void bindListener(MessageListenerInterface listener) { mListener = listener; } }

說明:在上面的程式碼中,我們將我們的類擴充套件為廣播接收器,它將監聽Android裝置上的傳入簡訊。收到訊息後,它將在我們的onMessageReceive方法中顯示。從那裡我們可以讀取我們的簡訊並在我們的應用程式中使用它。

步驟5:使用AndroidManifest.xml檔案

導航到app>AndroidManifest.xml檔案,然後向其中新增以下程式碼。程式碼中添加了註釋以詳細瞭解。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools">
   <!-- adding permissions on below line -->
   <uses-permission android:name="android.permission.RECEIVE_SMS" />
   <uses-permission android:name="android.permission.READ_SMS" />
   <application
       android:allowBackup="true"
       android:dataExtractionRules="@xml/data_extraction_rules"
       android:fullBackupContent="@xml/backup_rules"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/Theme.JavaTestApplication"
       android:usesCleartextTraffic="true"
       tools:targetApi="31">
       <activity
           android:name=".MainActivity"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <meta-data
               android:name="android.app.lib_name"
               android:value="" />
       </activity>
       <!-- adding a broad cast receiver for message on below line -->
       <receiver
           android:name=".MessageBroadcastReceiver"
           android:exported="true">
           <!-- adding intent filter as sms received -->
           <intent-filter>
               <action android:name="android.provider.Telephony.SMS_RECEIVED" />
           </intent-filter>
       </receiver>
   </application>

</manifest>

說明:在上面的AndroidManifest.xml檔案的程式碼中,我們添加了讀取簡訊的許可權。除此之外,我們還建立了一個接收器,在其中指定接收器的名稱,並向其新增sms_received操作以在我們的應用程式中接收簡訊。

步驟6:使用MainActivity.java檔案

導航到MainActivity.java。如果此檔案不可見,則開啟此檔案。在左側面板中導航到app>res>layout>MainActivity.java以開啟此檔案。開啟此檔案後,向其中新增以下程式碼。程式碼中添加了註釋以詳細瞭解。

package com.example.java_test_application;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity implements MessageListenerInterface {
   // creating variables on below line for text view.
   private TextView msgTV;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       // initializing variables on below line.
       msgTV = findViewById(R.id.idTVMessage);
       // adding bind listener for message receiver on below line.
       MessageBroadcastReceiver.bindListener(this);
   }
   @Override
   public void messageReceived(String message) {
       // setting message in our text view on below line.
       msgTV.setText(message);
   }
}

說明:在上面的程式碼中,我們首先為TextView建立變數。現在我們將看到onCreate方法。這是每個Android應用程式的預設方法。當建立應用程式檢視時,將呼叫此方法。在此方法中,我們設定內容檢視,即名為activity_main.xml的佈局檔案,以設定該檔案中的UI。在此onCreate方法中,我們使用我們在activity_main.xml檔案中給出的ID初始化TextView的變數。之後,我們為我們的MessageBroadcastReceiver類新增一個繫結偵聽器。除此之外,我們還使用MessageListnerInterface實現了我們的MainActivity檔案。在messageReceived方法中,我們將收到的訊息設定為我們的TextView,以便在我們的應用程式中顯示。

新增上述程式碼後,我們只需單擊頂欄中的綠色圖示即可在移動裝置上執行我們的應用程式。

注意:確保您已連線到您的真實裝置或模擬器。

輸出

結論

在本文中,我們介紹瞭如何在Android應用程式中監聽傳入的簡訊。

更新於:2023年5月8日

9000+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告