如何在安卓设备上获取短信内容?

在Android系统中获取短信内容可以通过多种方式实现,下面将详细介绍如何通过ContentResolver和ContentObserver来获取短信内容。

如何在安卓设备上获取短信内容?

一、准备工作

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

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

2、定义短信URI:短信的URI主要有以下几种:

content://***s/inbox: 收件箱

content://***s/sent: 已发送

content://***s/draft: 草稿

content://***s/outbox: 发件箱

content://***s/failed: 发送失败

content://***s/queued: 待发送列表

content://***s/: 所有短信

二、使用ContentResolver读取短信

1、查询短信数据库

   private void obtainPhoneMessage() {
       ContentResolver cr = getContentResolver();
       String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
       Cursor cur = cr.query(Uri.parse("content://sms/"), projection, null, null, "date desc");
       if (cur != null) {
           while (cur.moveToNext()) {
               String number = cur.getString(cur.getColumnIndex("address")); // 手机号
               String name = cur.getString(cur.getColumnIndex("person")); // 联系人姓名
               String body = cur.getString(cur.getColumnIndex("body")); // 短信内容
               // 处理短信数据...
           }
           cur.close();
       } else {
           Log.i("ooc", "************cur == null");
       }
   }

2、字段说明

_id: 短信序号

如何在安卓设备上获取短信内容?

thread_id: 对话的序号

address: 发件人地址,即手机号

person: 发件人,如果发件人在通讯录中则为具体姓名,陌生人为null

date: 日期,long型

protocol: 协议(0表示***S,1表示MMS)

read: 是否阅读(0未读,1已读)

status: 短信状态(-1接收,0完成,64待处理,128失败)

type: 短信类型(1是接收到的,2是已发出)

body: 短信具体内容

service_center: 短信服务中心号码编号,如+8613800755500

1、广播接收器

当手机收到一条短信时系统会发送一条广播:"android.provider.Telephony.***S_RECEIVED",通过该广播可以获取到短信内容。

   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 smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                   String sender = smsMessage.getDisplayOriginatingAddress();
                   String message = smsMessage.getDisplayMessageBody();
                   // 处理短信数据...
               }
           }
       }
   }

2、注册广播接收器

如何在安卓设备上获取短信内容?

   IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
   registerReceiver(new SmsReceiver(), filter);

3、ContentObserver

当短信数据库发生变化时,ContentObserver中的onChange方***被调用。

   public class SmsContentObserver extends ContentObserver {
       public SmsContentObserver(Handler handler) {
           super(handler);
       }
       @Override
       public void onChange(boolean selfChange) {
           super.onChange(selfChange);
           // 查询最新的短信记录...
       }
   }

4、注册ContentObserver

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

四、相关问题与解答

1、问题1:如何在AndroidManifest.xml中添加读取短信的权限?

答案:在AndroidManifest.xml文件的<manifest>标签下添加以下代码:

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

2、问题2:如何实时监听并获取新收到的短信内容?

答案:可以通过两种方法实现:

方法一:使用广播接收器:当手机收到一条短信时系统会发送一条广播:"android.provider.Telephony.***S_RECEIVED",通过该广播可以获取到短信内容。

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

获取Android手机中的短信内容可以通过ContentResolver直接读取短信数据库,也可以通过广播接收器或ContentObserver实时监听短信的变化,这些方法各有优缺点,开发者可以根据具体需求选择合适的方案。

到此,以上就是小编对于“安卓获取短信内容”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。