【Android】Android如何读取短信的内容

HDK2016 · · 194 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在AndroidManifest.xml中,添加权限:

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

MainActivity.java

public class MainActivity extends Activity {
    private List<Map<String,String>> list=new ArrayList<Map<String,String>>();
    private Uri SMS_INBOX = Uri.parse("content://sms/");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSmsFromPhone();
        for(Map map:list){
            Log.i(map.get("num").toString(),map.get("mess").toString());
        }
    }
    public void getSmsFromPhone() {
            ContentResolver cr = getContentResolver();
            String[] projection = new String[] {"_id", "address", "person","body", "date", "type" };
            Cursor cur = cr.query(SMS_INBOX, projection, null, null, "date desc");
            if (null == cur) {
                Log.i("ooc","************cur == null");
                return;
            }
            while(cur.moveToNext()) {
                String number = cur.getString(cur.getColumnIndex("address"));//手机号
                String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
                String body = cur.getString(cur.getColumnIndex("body"));//短信内容
                //至此就获得了短信的相关的内容, 以下是把短信加入map中,构建listview,非必要。
                Map<String,String> map = new HashMap<String,String>();
                map.put("num",number);
                map.put("mess",body);
                list.add(map);
            }
    }
}

也可以获取其他的属性,如下:

String number = cur.getString(cur.getColumnIndex("想获得的属性")); //获取方法

SMS的结果字段,读者可以通过getColumnNames()来获取所有的结构字段,下面读者列出常用的结构字段:

 _id:短信序号,如100
  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  
  address:发件人地址,即手机号,如+8613811810000
  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  
  date:日期,long型,如1256539465022,可以对日期显示格式进行设置
  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  
  read:是否阅读0未读,1已读
  
  status:短信状态-1接收,0complete,64pending,128failed
  
  type:短信类型1是接收到的,2是已发出
  
  body:短信具体内容
  

 

接下来是一个Demo。这个Demo的原理为:首先向程序中注册一个广播接收器,重写里面的onChange方法,当程序监听到内容改变的时候,就获取其中的短信,然后将短信内容存储一个集合中。当点击“获取最新短信”的按钮的时候,再把内容显示出来。

SmsObserver.java文件

package com.example.smsobervable;


import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;


public class SmsObserver  extends ContentObserver{
    Context context;
    
    public SmsObserver(Context context,Handler handler){
        super(handler);
        this.context=context;
    }
    
    @Override
    public void onChange(boolean selfChange) {
        Object localObject = Uri.parse("content://sms");
        String paramBoolean_a = "";
        ContentResolver resolver =context.getContentResolver();
        Cursor paramBoolean_b = resolver.query((Uri)localObject, null, paramBoolean_a, null, "date desc");//获得一个游标
        if (paramBoolean_b != null && paramBoolean_b.getCount() >0)
        {
            boolean haveData = paramBoolean_b.moveToFirst();
            for(int i=0;i<1 && haveData;i++)//每次只取第一条
            {
                try
                { 
                    String[] strs=paramBoolean_b.getColumnNames();//获取当前游标下行的所有的列的名称
                    for(String s:strs){
                        int index=paramBoolean_b.getColumnIndex(s);//获得下标
                        String result=paramBoolean_b.getString(index);//获得数据
                        MainActivity.smsContainer.add(s+":"+result);
                    }
                    haveData = paramBoolean_b.moveToNext();
                }
                catch(Exception ex)
                {
                }
            }
        }       
         paramBoolean_b.close();
    }
}
SmsObserver.java

MainActivity.java文件

package com.example.smsobervable;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {
 
    static List<String> smsContainer=new ArrayList<String>();
    LinearLayout mainLayout;
    Context context;
    int btnId=UUID.randomUUID().variant();//创建一个随机数
    int tvid=UUID.randomUUID().variant();//创建一个随机数
    TextView  tv;
    
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainLayout= (LinearLayout)findViewById(R.id.main_layout);
        context=this;
        
        SmsObserver smsObserver=new SmsObserver(context, handler);//创建一个广播 接受者
        context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"),true,smsObserver);//注册广播
        
        Button btn= addBtn("获取最新短信",btnId);
        tv=addTextView("",tvid);
        //创建一个ScrolView
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                //将消息显示出来
                for(String  str : smsContainer){
                    tv.append("\n"+str);
                }
                if(smsContainer.size()<1){
                    tv.append("\n没接受到消息");
                }
            }
        });
    }
    /**
     * 添加按钮
     * @param text 按钮的文本内容
     * @param id 按钮的id
     * @return 一个Button类型的属性,表示创建号的按钮。
     */
    Button addBtn(String text,int id){
        Button btn=new Button(context);
        btn.setText(text);
        btn.setId(id);
        mainLayout.addView(btn);//将按钮添加到布局中
        return btn;//返回按钮
    }
    /**
     * 添加文本,具有滚动条
     * @param text 文本
     * @param id id
     * @return 一个TextView类型的数据,表示添加的文本对象。
     */
    TextView addTextView(String text,int id){
        TextView tv=new TextView(context);
        tv.append(text);
        tv.setId(id);
        ScrollView scv=new ScrollView(context);//创建一个滚动条
        scv.addView(tv);//将文本添加到滚动条中
        mainLayout.addView(scv);//再建滚动条添加到布局中
        return tv;//返回文本
    }
}
MainActivity.java

Activity_main.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout
        android:id="@+id/main_layout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        
    </LinearLayout>

</RelativeLayout>
Activity_main.xml

AndroidManifest.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.smsobervable"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    
 <uses-permission android:name="android.permission.READ_SMS"/> 
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.smsobervable.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>
AndroidManifest.xml

 

读者向其发送一个短信,然后再点击“获取最新短信”的按钮,那么就可以在屏幕上显示刚才发送的短信了。效果图如下:

 

本文来自:博客园

感谢作者:HDK2016

查看原文:【Android】Android如何读取短信的内容

194 次点击  
加入收藏 微博
下一篇:Android TabLayout
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet