Android开发获取短信的内容并截取短信

时间:2022-06-29 02:49:51

1、首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了

2、在广播里面,我们重写的onReceive()方法,通过里面的Intent写到的Bundle就可以拿到短信的内容,

3、清单文件里面我们必须要添加权限,否则无法接收到。

4、为了防止我们的广播接收不到,我们自己写的广播接收器的权限必须要大,以防万一,我设置了1000。

下面上代码,里面的注释也比较详细..

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="." encoding="utf-"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.fanlei.cutnotedemo" >
  //接收短信
  <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <!-- action:name = 的名称是固定的 -->
    <receiver android:name=".NoteReceiver">
      <intent-filter android:priority="">
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
      </intent-filter>
    </receiver>
    <activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

写一个类,继承BroadcastReceiver

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Android--获取短信的内容,截取短信
 package com.example.fanlei.cutnotedemo;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.telephony.SmsMessage;
 import android.widget.Toast;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 /**
 * 广播接收器
 */
 public class NoteReceiver extends BroadcastReceiver {
   private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
   @Override
   public void onReceive(Context context, Intent intent) {
     String action = intent.getAction();
     //判断广播消息
     if (action.equals(SMS_RECEIVED_ACTION)){
       Bundle bundle = intent.getExtras();
       //如果不为空
       if (bundle != null){
         //将pdus里面的内容转化成Object[]数组
         Object pdusData[] = (Object[]) bundle.get("pdus");
         //解析短信
         SmsMessage[] msg = new SmsMessage[pdusData.length];
         for (int i = ;i < msg.length;i++){
           byte pdus[] = (byte[]) pdusData[i];
           msg[i] = SmsMessage.createFromPdu(pdus);
         }
         StringBuffer content = new StringBuffer();//获取短信内容
         StringBuffer phoneNumber = new StringBuffer();//获取地址
         StringBuffer receiveData = new StringBuffer();//获取时间
         //分析短信具体参数
         for (SmsMessage temp : msg){
           content.append(temp.getMessageBody());
           phoneNumber.append(temp.getOriginatingAddress());
           receiveData.append(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
               .format(new Date(temp.getTimestampMillis())));
         }
         /**
         * 这里还可以进行好多操作,比如我们根据手机号进行拦截(取消广播继续传播)等等
         */
         Toast.makeText(context,phoneNumber.toString()+content+receiveData, Toast.LENGTH_LONG).show();//短信内容
       }
     }
   }
 }

ps:android获取短信所有内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class GetMessageInfo {
  List<MessageInfo> list;
  Context context;
  MessageInfo messageInfo;
  public GetMessageInfo(Context context) {
    list = new ArrayList<MessageInfo>();
    this.context = context;
  }
  // --------------------------------收到的短息信息----------------------------------
  public List<MessageInfo> getSmsInfos() {
    final String SMS_URI_INBOX = "content://sms/inbox";// 收信箱
    try {
      ContentResolver cr = context.getContentResolver();
      String[] projection = new String[] { "_id", "address", "person","body", "date", "type" };
      Uri uri = Uri.parse(SMS_URI_INBOX);
      Cursor cursor = cr.query(uri, projection, null, null, "date desc");
      while (cursor.moveToNext()) {
        messageInfo = new MessageInfo();
        // -----------------------信息----------------
        int nameColumn = cursor.getColumnIndex("person");// 联系人姓名列表序号
        int phoneNumberColumn = cursor.getColumnIndex("address");// 手机号
        int smsbodyColumn = cursor.getColumnIndex("body");// 短信内容
        int dateColumn = cursor.getColumnIndex("date");// 日期
        int typeColumn = cursor.getColumnIndex("type");// 收发类型 1表示接受 2表示发送
        String nameId = cursor.getString(nameColumn);
        String phoneNumber = cursor.getString(phoneNumberColumn);
        String smsbody = cursor.getString(smsbodyColumn);
        Date d = new Date(Long.parseLong(cursor.getString(dateColumn)));
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd " + "\n" + "hh:mm:ss");
        String date = dateFormat.format(d);
        // --------------------------匹配联系人名字--------------------------
        Uri personUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,phoneNumber);
        Cursor localCursor = cr.query(personUri, new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup.PHOTO_ID,PhoneLookup._ID }, null, null, null);
        System.out.println(localCursor.getCount());
        System.out.println("之前----"+localCursor);
        if (localCursor.getCount()!=0) {
          localCursor.moveToFirst();
          System.out.println("之后----"+localCursor);
          String name = localCursor.getString(localCursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
          long photoid = localCursor.getLong(localCursor.getColumnIndex(PhoneLookup.PHOTO_ID));
          long contactid = localCursor.getLong(localCursor.getColumnIndex(PhoneLookup._ID));
          messageInfo.setName(name);
          // 如果photoid 大于0 表示联系人有头像 ,如果没有给此人设置头像则给他一个默认的
          if (photoid > 0) {
           Uri uri1 = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);
            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri1);
            messageInfo.setContactPhoto(BitmapFactory.decodeStream(input));
          } else {
            messageInfo.setContactPhoto(BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher));
          }
        }else{
            messageInfo.setName(phoneNumber);
            messageInfo.setContactPhoto(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher));
          }
        localCursor.close();
        messageInfo.setSmsContent(smsbody);
        messageInfo.setSmsDate(date);
        list.add(messageInfo);
      }
    } catch (SQLiteException e) {
      e.printStackTrace();
    }
    return list;
  }
}

以上内容是小编给大家分享的Android开发获取短信的内容并截取短信,希望大家喜欢。