实例详解Android 获取短信会话列表

实例详解Android 获取短信会话列表

为什么需要获取短信会话列表

在我们的日常生活中需要经常使用手机发送和接收短信,而对于一些需要短信的应用程序来说,获取短信会话列表是很有必要的,比如备份短信、导出短信等等。因此,本文将介绍获取Android短信会话列表的方法。

实现步骤

1. 添加权限

首先,在AndroidManifest.xml文件中添加权限:

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

2. 获取短信列表

接下来,我们需要使用ContentResolver来获取短信列表:

Cursor cursor = getContentResolver().query(Uri.parse("content://sms/conversations"), null, null, null, "thread_id DESC");

其中,Uri.parse("content://sms/conversations")表示获取短信会话列表,thread_id DESC表示按短信会话的时间降序排序。

3. 遍历短信列表

我们可以使用循环遍历Cursor对象,来获取短信会话列表中的每个会话:

if (cursor != null && cursor.moveToFirst()) {
    do {
        long threadId = cursor.getLong(cursor.getColumnIndex("thread_id"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        String body = cursor.getString(cursor.getColumnIndex("body"));
        int unreadCount = cursor.getInt(cursor.getColumnIndex("unread_count"));

        // 获取该会话的最新短信
        Cursor msgCursor = getContentResolver().query(Uri.parse("content://sms"), null, "thread_id = " + threadId, null, "date DESC LIMIT 1");
        if (msgCursor != null && msgCursor.moveToFirst()) {
            long msgId = msgCursor.getLong(msgCursor.getColumnIndex("_id"));
            long date = msgCursor.getLong(msgCursor.getColumnIndex("date"));

            // TODO: 处理获取到的短信会话信息
        }
        if (msgCursor != null) {
            msgCursor.close();
        }
    } while (cursor.moveToNext());
}
if (cursor != null) {
    cursor.close();
}

4. 根据需要进行处理

最后,根据我们的需求,对获取到的短信会话信息进行处理,比如打印、显示在列表中等。

示例说明

示例1:获取短信会话列表

我们可以在一个新的Activity中实现上述步骤:

public class SmsListActivity extends AppCompatActivity {
    private static final String TAG = "SmsListActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms_list);

        // 添加权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, 0);

        // 获取短信会话列表
        Cursor cursor = getContentResolver().query(Uri.parse("content://sms/conversations"), null, null, null, "thread_id DESC");

        // 遍历短信列表
        if (cursor != null && cursor.moveToFirst()) {
            do {
                long threadId = cursor.getLong(cursor.getColumnIndex("thread_id"));
                String address = cursor.getString(cursor.getColumnIndex("address"));
                String body = cursor.getString(cursor.getColumnIndex("body"));
                int unreadCount = cursor.getInt(cursor.getColumnIndex("unread_count"));

                // 获取该会话的最新短信
                Cursor msgCursor = getContentResolver().query(Uri.parse("content://sms"), null, "thread_id = " + threadId, null, "date DESC LIMIT 1");
                if (msgCursor != null && msgCursor.moveToFirst()) {
                    long msgId = msgCursor.getLong(msgCursor.getColumnIndex("_id"));
                    long date = msgCursor.getLong(msgCursor.getColumnIndex("date"));

                    Log.d(TAG, "ThreadId: " + threadId + ", Address: " + address + ", Body: " + body + ", UnreadCount: " + unreadCount + ", MsgId: " + msgId + ", Date: " + date);
                }
                if (msgCursor != null) {
                    msgCursor.close();
                }
            } while (cursor.moveToNext());
        }

        if (cursor != null) {
            cursor.close();
        }
    }
}

示例2:显示短信会话列表

我们可以在ListView中显示短信会话列表:

public class SmsListActivity extends AppCompatActivity {
    private static final String TAG = "SmsListActivity";
    private ArrayList<SmsConversations> smsConversations = new ArrayList<>();
    private ListView smsListView;
    private SmsListAdapter smsListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms_list);

        // 添加权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, 0);

        // 获取短信会话列表
        Cursor cursor = getContentResolver().query(Uri.parse("content://sms/conversations"), null, null, null, "thread_id DESC");

        // 遍历短信列表
        if (cursor != null && cursor.moveToFirst()) {
            do {
                SmsConversations sms = new SmsConversations();
                long threadId = cursor.getLong(cursor.getColumnIndex("thread_id"));
                String address = cursor.getString(cursor.getColumnIndex("address"));
                String body = cursor.getString(cursor.getColumnIndex("body"));
                int unreadCount = cursor.getInt(cursor.getColumnIndex("unread_count"));

                // 获取该会话的最新短信
                Cursor msgCursor = getContentResolver().query(Uri.parse("content://sms"), null, "thread_id = " + threadId, null, "date DESC LIMIT 1");
                if (msgCursor != null && msgCursor.moveToFirst()) {
                    long msgId = msgCursor.getLong(msgCursor.getColumnIndex("_id"));
                    long date = msgCursor.getLong(msgCursor.getColumnIndex("date"));

                    sms.setThreadId(threadId);
                    sms.setAddress(address);
                    sms.setBody(body);
                    sms.setUnreadCount(unreadCount);
                    sms.setMsgId(msgId);
                    sms.setDate(date);

                    smsConversations.add(sms);
                }
                if (msgCursor != null) {
                    msgCursor.close();
                }
            } while (cursor.moveToNext());
        }

        if (cursor != null) {
            cursor.close();
        }

        // 显示短信会话列表
        smsListView = findViewById(R.id.sms_list);
        smsListAdapter = new SmsListAdapter(this, smsConversations);
        smsListView.setAdapter(smsListAdapter);
    }
}

其中,SmsConversations是一个实体类,表示短信会话信息;SmsListAdapter是自定义适配器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:实例详解Android 获取短信会话列表 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Java中使用JDBC操作数据库简单实例

    下面是详细的Java中使用JDBC操作数据库的完整攻略。 1. JDBC简介 Java Database Connectivity (JDBC) 是一种能够让Java程序与各种数据库进行连接、查询、更新、插入和删除等操作的API。使用JDBC API进行数据库操作的通常步骤如下: 加载JDBC驱动程序。 建立JDBC连接。 创建JDBC Statement或…

    Java 2023年5月19日
    00
  • Java算法之递归算法计算阶乘

    Java算法之递归算法计算阶乘 阶乘是指从1到某个整数n所有整数的乘积。阶乘常用于组合数学,其值巨大,很容易超出标准数据类型的限制。在 Java 编程语言中,可以使用递归算法计算阶乘。下面是该算法的完整攻略。 步骤1:了解递归算法的基本概念 递归算法是指一个函数在执行的过程中调用自身的过程。在递归算法中,每一次的调用都属于某一次的递归调用,每一次调用的返回值…

    Java 2023年5月19日
    00
  • 入门java的第一步HelloWorld

    下面是“入门Java的第一步HelloWorld”的完整攻略: 步骤一:安装Java开发工具 在进行Java编程前,需要安装Java开发工具,例如Eclipse、NetBeans等。本文以Eclipse为例进行讲解。 Eclipse下载地址:https://www.eclipse.org/downloads/ 下载后双击exe文件进行安装,安装完成后启动Ec…

    Java 2023年5月19日
    00
  • spring-cloud-stream的手动消息确认问题

    Spring Cloud Stream是一个用于构建基于事件驱动的微服务的框架。可使用其发现和连接分布式系统中的消息代理,同时提供一些便捷的特性。 在使用Spring Cloud Stream的过程中,手动消息确认是重要的一个问题。手动确认就是指当我们消费了消息后需要向消息队列发送一个确认消息来告诉队列已经处理完消息,可以将消息从队列中删除。否则,队列会一直…

    Java 2023年6月2日
    00
  • Java实现JS中的escape和UNescape代码分享

    实现JS中的escape和unescape,其本质上是Java中的URL编码和解码,Java中提供了相关的API可以实现这一功能。下面是在Java中实现JS中的escape和unescape的完整攻略: 1. URL编码 URL编码,也称百分号编码,是用于在URL中表示非ASCII字符的方法,它的基本原理是将字符转换成它的ASCII码,并在前面加上%。 在J…

    Java 2023年5月23日
    00
  • EJB 3.0 开发指南之定时服务

    EJB 3.0 开发指南之定时服务 什么是定时服务? 定时服务是一种可以按照预定时间自动执行的任务服务,可以定时发送邮件、清理垃圾数据等操作。在 Java EE 中,可以使用 EJB(Enterprise JavaBeans)实现定时任务。 实现定时服务的步骤 创建 EJB 在 Java EE 项目中,首先需要创建一个 EJB,这个 EJB 将被用来实现定时…

    Java 2023年6月15日
    00
  • SpringBoot如何用java生成静态html

    要用Java生成静态HTML,可以使用SpringBoot框架中的Thymeleaf模板引擎和SpringBoot内置的静态资源处理器,下面是详细的步骤: 1. 导入依赖 将以下依赖加入到pom.xml文件中: <dependencies> <!– Spring Boot Web –> <dependency> &lt…

    Java 2023年5月19日
    00
  • java使用jacob实现word转pdf

    Java使用Jacob可以实现将Word文档转换为PDF格式的功能。下面是具体的步骤: 准备工作 首先,需要在Java项目中引入Jacob的jar包。可以从官方网站(https://sourceforge.net/projects/jacob-project/ )下载,或者使用Maven进行依赖管理: <dependency> <group…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部