AndroidManifest.xml
中声明权限,使用 TelephonyManager
或相关广播接收器监听短信。
1、申请权限:在AndroidManifest.xml文件中添加以下权限,以允许应用读取短信。
2、获取短信内容列表:使用ContentResolver查询短信列表,以下是示例代码:
private void readSms() { String[] projection = {"_id", "address", "body", "type"};// 查询的字段 String sortOrder = "date DESC"; // 按日期降序排序 ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(contentSmsUri(), projection, null, null, sortOrder); if (cursor != null && cursor.moveToFirst()) { do { String address = cursor.getString(cursor.getColumnIndex("address")); String body = cursor.getString(cursor.getColumnIndex("body")); int type = cursor.getInt(cursor.getColumnIndex("type")); // 处理获取到的短信信息 Log.i("xxxxx", "readSms: " + address + "|" + type + "|" + body); } while (cursor.moveToNext()); } if (cursor != null) { cursor.close(); } }
projection指定查询的字段,sortOrder指定排序方式,contentResolver.query()返回Cursor对象,通过Cursor对象可以遍历查询结果集并获取相应的数据。
3、创建广播接收器:当手机收到短信时,系统会自动发送一个广播,我们可以通过创建广播接收器来接收这条广播,并获取短信内容,以下是示例代码:
public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus) { SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu); String sender = message.getDisplayOriginatingAddress(); String content = message.getMessageBody(); Log.d("SmsReceiver", "Sender: " + sender + ", Message: " + content); } } } }
在AndroidManifest.xml中注册广播接收器:
<receiver android:name=".SmsReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
这样,当有新短信到达时,系统会调用我们的SmsReceiver。
1、问题:如果只需要获取收件箱中的短信,应该如何修改查询语句?
解答:可以将查询的URI改为content://sms/inbox,即只查询收件箱中的短信,示例代码如下:
Cursor cursor = contentResolver.query(Uri.parse("content://sms/inbox"), projection, null, null, sortOrder);
这样,就可以只获取收件箱中的短信了。
2、问题:为什么需要在AndroidManifest.xml中声明权限?
解答:在AndroidManifest.xml中声明权限是为了告知系统和用户,该应用需要访问特定的功能或数据,对于获取短信内容的应用,需要声明READ_SMS和RECEIVE_SMS权限,以便能够读取短信和接收短信广播,如果不声明这些权限,应用将无法正常获取短信内容。