安卓开发系列 之如何获取手机短信内容

news/2024/7/20 8:51:12 标签: java, android, 安卓, 数据库, ios

1 手机中短信数据库相关字段包括:
_id:短信序号,如100   
address:发件人地址,即手机号,如+8613811810000,这里需要注意的是手机号是否+86,可以加上86和不加86分别测试下  
person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null   
date:日期,long型,如1256539465022,可以对日期显示格式进行设置,这里在用sqlite语句进行筛选时date字段单位是毫秒,获取系统毫秒时间的代码是:

java">long totalMilliSeconds = System.currentTimeMillis();   

protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信      
read:是否阅读0未读,1已读   
status:短信状态-1接收,0complete,64pending,128failed   
type:短信类型1是接收到的,2是已发出      
body:短信具体内容
读取短信内容的uri为:
Uri uri = Uri.parse(“content://sms”); //读取所有短信
Uri uri = Uri.parse(“content://sms/inbox”); //读取收件箱短信

2 在清单文件添加权限,获取短信读写权限:

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

3 核心代码为:

java">private void checkSMSPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS)
                != PackageManager.PERMISSION_GRANTED) {
            //未获取到读取短信权限
            //向系统申请权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_SMS}, REQ_CODE_CONTACT);
        } else {
           //执行自己的程序 
        }
    }

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        //判断用户是否,同意 获取短信授权
        if (requestCode == REQ_CODE_CONTACT && grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //获取到读取短信权限
            //执行自己的程序
        } else {
            Toast.makeText(this, "未获取到短信权限", Toast.LENGTH_SHORT).show();
        }
    }

private void query() {
        //读取所有短信
        Uri uri = Uri.parse("content://sms/");
        ContentResolver resolver = getContentResolver();
        //查询条件可以根据实际业务填写,这里均为null,代表没有筛选条件
        //其中第三个参数代表where条件
        //第五个参数代表order by
        //第四个参数根据第三个参数来写,如果你在第三个参数里面有?,那么你在第四个写的数据就会替换掉?
        Cursor cursor = resolver.query(uri, new String[]{"_id", "address", "body", "date", "type"}, null, null, null);
        if (cursor != null && cursor.getCount() > 0) {
            String body;
            while (cursor.moveToNext()) {
               //存储短信内容
               body = cursor.getString(2);
            }
        }
    }
//补充:
cursor.close();//关闭游标,且释放资源
cursor.isClosed();//如果为TRUE表示该游标已关闭
cursor.getColumnCount();//返回所有列的总数
cursor.getColumnNames();//返回一个字符串数组的列名,即将列名全部返回到一个字符串数组中
cursor.getColumnName(columnIndex);//从给定的索引返回列名
cursor.getCount();//返回Cursor中的行数
cursor.moveToFirst();//移动光标到第一行
cursor.moveToLast();//移动光标到最后一行
cursor.moveToNext();//移动光标到下一行
cursor.moveToPrevious();//移动光标到上一行
cursor.moveToPosition(position);//移动光标到给定位置

参考资料:

https://blog.csdn.net/qq_42179105/article/details/82929521?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&dist_request_id=8d7d5f2b-1b3f-4f66-b5d1-e89d3979bb04&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control Android studio 获取手机短信内容并输出显示

https://blog.csdn.net/chenliguan/article/details/48316585 Android进阶之读取手机短信显示listview

https://blog.csdn.net/ALittleForward/article/details/40480389?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=1f38157e-2fdc-42f8-ab73-f2990ab5f300&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control 基于Android的短信应用开发


http://www.niftyadmin.cn/n/1223863.html

相关文章

博客园程序中的Data Access Application Block升级

升级到了Data Access Application Block 3.1 。

Struts入门经验(一)

Struts安装&#xff1a; 首先请到http://jakarta.apache.org/Struts下载Struts&#xff0c;建议使用release版&#xff0c;现在最高版本为1.1&#xff0c;下载后得到的是一个ZIP文件。 将ZIP包解开&#xff0c;可以看到这个目录&#xff1a;lib和webapps&#xff0c;webapps下有…

Jive笔记4--结果集分页处理

Jive笔记4--结果集分页处理shyguy 原创 (参与分&#xff1a;279&#xff0c;专家分&#xff1a;240) 发表&#xff1a;2002-9-18 下午12:18 版本&#xff1a;1.0 阅读&#xff1a;7257次 初来乍到&#xff0c;嘿嘿&#xff0c;意思意思。Jive中的分页处理http://forum.m…

一个简单的日期控件

这个日期控件就是三个下拉框的简单组合&#xff0c;但用起来还是挺顺手的&#xff0c;呵呵。控件类&#xff1a; ImportsSystem.ComponentModelImportsSystem.Web.UI<ToolboxData("<{0}:DateControl2 runatserver></{0}:DateControl2>")>PublicCla…

语句片断

select to_char(sysdate,YYYYMMDDHH24MISS) from dual将返回一个字符串&#xff0c;类似于‘20041025130247’时间部分是返回24小时的描述形式。

【EXLIBRIS】随笔记 002

随 笔 记 <二> Swift和Pope是朋友&#xff0c;当然也有分歧。1660年&#xff0c;要建立一个英格兰国家学院的想法逐步形成&#xff0c;想要固定、“纯洁”他们的语言。Dryden力倡此举&#xff0c;之后还有Defoe的Essays upon Projects及Swift的A Proposal for Correctin…

系统运维系列 之mysql日期加减运算

1 比较两个日期的大小&#xff1a; (1) Where Date Between ‘2020-01-01’ And ‘2020-01-31’ (2) Where Date >‘2020-01-01’ (3) Where Date <‘2020-01-01’ (4) Where Date ‘2020-01-01’ 2 判断在当前日期一周或者一月之内的方法&#xff1a; (1) Date between…

C#类中虚方法相互调用的潜在重载错误

当我们编写基类虚方法时&#xff0c;需要注意一个问题&#xff0c;就是基类中虚方法的相互调用&#xff0c;有可能引起派生类重载时的潜在错误隐患。当然这个错误并不是C#语言设计的缺陷&#xff0c;而是一个不可避免的实现而已。当然如果我们是要编写通用的组建基类&#xff0…