如何通过安卓系统接收并处理短信?

在Android系统中获取短信,可以通过使用Content Provider来访问手机中的短信数据库,下面将详细介绍如何实现这一功能:

如何通过安卓系统接收并处理短信?

一、准备工作

1、添加权限:在AndroidManifest.xml文件中添加读取短信的权限。

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

2、创建广播接收器:用于监听系统发出的短信广播。

   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 (int i = 0; i < pdus.length; i++) {
                   SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
                   String sender = smsMessage.getOriginatingAddress();
                   String messageBody = smsMessage.getMessageBody();
                   // 处理短信内容
               }
           }
       }
   }

3、注册广播接收器:在AndroidManifest.xml中注册广播接收器。

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

二、获取所有短信记录

1、定义短信URI提供程序的URI有多种,可以根据需要选择不同的URI来获取不同类型的短信。

   final String SMS_URI_ALL = "content://sms/"; // 所有短信
   final String SMS_URI_INBOX = "content://sms/inbox"; // 收件箱
   final String SMS_URI_SENT = "content://sms/sent"; // 已发送
   final String SMS_URI_DRAFT = "content://sms/draft"; // 草稿
   final String SMS_URI_OUTBOX = "content://sms/outbox"; // 发件箱
   final String SMS_URI_FAILED = "content://sms/failed"; // 发送失败
   final String SMS_URI_QUEUED = "content://sms/queued"; // 待发送列表

2、查询短信记录:通过ContentResolver查询短信记录,并遍历Cursor以获取每条短信的信息。

   public String getAllSms() {
       final String SMS_URI_ALL = "content://sms/";
       String sms = "";
       Uri uri = Uri.parse(SMS_URI_ALL);
       String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
       Cursor cur = getContentResolver().query(uri, projection, null, null, "date desc");
       if (cur.moveToFirst()) {
           do {
               long dateInMillis = cur.getLong(cur.getColumnIndex("date"));
               String smsbody = cur.getString(cur.getColumnIndexOrThrow("body"));
               String address = cur.getString(cur.getColumnIndexOrThrow("address"));
               // 根据需要处理短信内容
           } while (cur.moveToNext());
       }
       return sms;
   }

三、实时监听短信变化

1、使用ContentObserver:当短信数据库发生变化时,ContentObserver的onChange方***被调用,从而读取最新的短信。

   public class SmsContentObserver extends ContentObserver {
       public SmsContentObserver(Handler handler) {
           super(handler);
       }
       @Override
       public void onChange(boolean selfChange) {
           super.onChange(selfChange);
           // 处理短信变化逻辑
       }
   }

2、注册ContentObserver:在Activity或Service中注册ContentObserver。

如何通过安卓系统接收并处理短信?

   getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, new SmsContentObserver(new Handler()));

四、单元表格

字段名 描述
_id 一个自增字段,从1开始
thread_id 同一发信人的ID相同
address 发件人手机号码
person 联系人列表里的序号,陌生人为null
date 发件日期
protocol 协议类型(SMS_PROTO=0, MMS_PROTO=1)
read 是否阅读(0未读,1已读)
status 状态(-1接收,0完成,64待处理,128失败)
type 消息类型(ALL=0, INBOX=1, SENT=2, DRAFT=3, OUTBOX=4, FAILED=5, QUEUED=6)
body 短信内容
service_center 短信服务中心号码编号
subject 短信主题
reply_path_present TP-Reply-Path
locked

五、相关问题与解答

1、问题1:如何在Android应用中获取所有短信记录?

答:要在Android应用中获取所有短信记录,可以使用ContentResolver来查询短信内容提供程序的URI,具体步骤如下:

在AndroidManifest.xml中添加读取短信的权限。

使用ContentResolver查询短信记录,并通过Cursor遍历获取每条短信的信息。

根据需要处理短信内容。

2、问题2:如何实时监听短信的变化?

答:要实时监听短信的变化,可以使用ContentObserver来观察短信数据库的变化,具体步骤如下:

如何通过安卓系统接收并处理短信?

创建一个继承自ContentObserver的类,重写onChange方法。

在Activity或Service中注册ContentObserver,监听短信内容的URI。

当短信数据库发生变化时,ContentObserver的onChange方***被调用,从而读取最新的短信。

以上内容就是解答有关“安卓系统获取短信”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。