实例详解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日

相关文章

  • 详解MybatisPlus集成nacos导致druid连接不上数据库

    我很高兴为您提供“详解MybatisPlus集成nacos导致druid连接不上数据库”的完整攻略。 问题描述MybatisPlus集成nacos后,我们发现druid连接池无法连接数据库了,导致应用程序无法启动。这是由于Druid数据源在生成时需要使用一些配置参数,例如驱动类名、连接字符串、用户名/密码等,而这些参数在nacos配置中心中没有被正确指定。 …

    Java 2023年6月15日
    00
  • Java实现的时间戳与date对象相互转换功能示例

    以下是“Java实现的时间戳与date对象相互转换功能示例”的攻略: 1. 使用Date对象实现时间戳与日期字符串的相互转换 1.1 时间戳转日期字符串 import java.text.SimpleDateFormat; import java.util.Date; public class TimestampToDateStr { public stat…

    Java 2023年5月20日
    00
  • JavaScript将Table导出到Excel实现思路及代码

    下面我将详细讲解JavaScript将Table导出到Excel的实现思路及代码,内容如下: 实现思路 获取要导出的表格元素,并获取其中的数据。 将数据转换为Excel支持的格式。 创建一个Blob对象,将Excel格式的数据放入其中。 创建一个下载链接,将Blob对象作为链接的数据,设置文件名为Excel文件名。 自动模拟点击链接下载文件。 代码实现 fu…

    Java 2023年6月16日
    00
  • 无感NullPointerException的值相等判断方法

    对于Java程序员来说,NullPointerException是一个非常常见的异常。在日常编写代码时,避免NullPointerException是我们需要极力避免的一种情况。然而,在某些情况下,我们必须将某些变量的值与null进行比较。如果我们没有小心地编写我们的代码,就有可能引发NullPointerException。此时,我们就需要找到一种方法来避…

    Java 2023年5月25日
    00
  • JSP 中Spring的Resource类读写中文Properties实例代码

    当 JSP 中使用 Spring 框架时,常常需要读写中文 Properties 文件。在这种情况下,可以使用 Spring 框架中的 Resource 类来实现文件的读取和写入。下面是详细的攻略: 步骤一:导入 Spring 框架 在 JSP 中使用 Spring 框架时,需要先导入 Spring 相关的 jar 包。一般来说,需要导入以下 jar 包: …

    Java 2023年6月15日
    00
  • Spring Boot JDBC 连接数据库示例

    介绍一下”Spring Boot JDBC 连接数据库示例”的完整攻略。 1. 环境准备 首先,我们需要准备JDK和Maven环境。确保已安装JDK环境,可以在命令行终端中输入以下命令进行验证: java -version 验证通过后,下载和安装Maven。同样在终端中输入以下命令进行验证: mvn -v 验证通过后,环境准备工作就做完了。 2. 添加依赖 …

    Java 2023年5月19日
    00
  • Spring Security Remember me使用及原理详解

    Spring Security Remember me是一种通过在用户登录后为用户生成Token,使用户在下一次访问时可以跳过登录,直接使用Token进行自动登录的机制。 实现Remember me功能可以使用Spring Security提供的RememberMeAuthenticationFilter过滤器,该过滤器会在用户登录成功后创建一个Token,…

    Java 2023年5月20日
    00
  • ajax无刷新动态调用股票信息(改良版)

    Ajax无刷新动态调用股票信息(改良版)攻略 简介 本文介绍如何使用Ajax无刷新动态调用股票信息的改良版。通过使用jQuery的Ajax方法,可以实现股票信息的实时刷新,提高用户体验和数据准确性。 准备工作 在开始之前,需要以下几个工作: 获取股票API接口,本文以https://api.asilu.com/stock/为例; 引入jQuery库,本文以C…

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