通过 Android 读取手机短信

在日常生活中,手机短信是我们与他人之间进行交流和传递信息的重要工具。有时,我们可能需要在自己的应用程序中获取手机短信的内容,来进行一些自定义的处理或分析。本文将介绍如何使用 Android 平台提供的 API 来读取手机短信,并提供相应的代码示例。

1. 获取短信读取权限

在 Android 中,要读取手机短信,首先需要获取相应的权限。在 AndroidManifest.xml 文件中添加以下权限声明:

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

此权限声明了我们的应用程序需要读取手机短信的权限。

2. 创建 SmsReceiver 广播接收器

通过注册一个广播接收器,我们可以在手机收到短信时获取到相应的信息。创建一个名为 SmsReceiver 的类,并继承 BroadcastReceiver 类。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;

public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 在这里处理收到的短信
    }
}

在该类的 onReceive 方法中,我们可以获取到收到的短信的相关信息。Android 平台将短信信息封装在 SmsMessage 对象中,我们可以通过以下代码获取短信的内容和发送者的手机号码:

Bundle bundle = intent.getExtras();
if (bundle != null) {
    Object[] pdus = (Object[]) bundle.get("pdus");
    if (pdus != null) {
        for (Object pdu : pdus) {
            SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
            String sender = message.getOriginatingAddress();
            String content = message.getMessageBody();
            // 在这里对短信内容进行处理
        }
    }
}

3. 注册 SmsReceiver 广播接收器

为了使我们自定义的 SmsReceiver 能够接收到短信,我们需要在 AndroidManifest.xml 文件中进行注册。在 <application> 标签内添加以下代码:

<receiver
    android:name=".SmsReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

这样,当手机收到新的短信时,系统就会将相应的短信信息广播到我们的 SmsReceiver 中。

4. 获取短信列表

除了实时获取新短信外,我们还可以获取手机中已存储的短信列表。Android 提供了 ContentResolver 类用于访问手机的内容提供器,我们可以通过它来获取短信列表。

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Telephony;

public class SmsReader {
    public static void readSms(Context context) {
        ContentResolver contentResolver = context.getContentResolver();
        Uri uri = Telephony.Sms.CONTENT_URI;
        String[] projection = new String[] {
            Telephony.Sms._ID,
            Telephony.Sms.ADDRESS,
            Telephony.Sms.BODY
        };
        String selection = null;
        String[] selectionArgs = null;
        String sortOrder = Telephony.Sms.DEFAULT_SORT_ORDER;

        Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                long id = cursor.getLong(cursor.getColumnIndex(Telephony.Sms._ID));
                String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
                String body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
                // 在这里对短信内容进行处理
            }
            cursor.close();
        }
    }
}

以上代码中,我们通过 ContentResolver.query 方法查询了手机短信的内容提供器,然后遍历查询结果,获取到每条短信的 ID、发送者手机号码和内容。

类图

下面是相关类的类图,使用 mermaid 的 classDiagram 标识:

classDiagram
    class SmsReceiver {
        +onReceive(Context, Intent)
    }
    class SmsReader {
        +readSms(Context)
    }