Android 获取所有短信-彩信

2023-05-16

1.权限


<!-- 读取短信 -->
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />  

动态申请权限:


READ_SMS  

2.获取所有短信

  /**
     * 获取短信
     *
     * @return
     */
    private List<Map<String, String>> obtainPhoneMessage() {
        Uri SMS_INBOX = Uri.parse("content://sms/");
        List<Map<String, String>> list = new ArrayList<>();
        String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};
//        Cursor cur = cr.query(SMS_INBOX, projection, null, null, "date desc");
        Cursor cur = getContentResolver().query(SMS_INBOX, projection, null, null, null);
        if (null == cur) {
            return null;
        }
        while (cur.moveToNext()) {
            @SuppressLint("Range") String number = cur.getString(cur.getColumnIndex("address"));//手机号
            @SuppressLint("Range") String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表
            @SuppressLint("Range") String body = cur.getString(cur.getColumnIndex("body"));//短信内容
            @SuppressLint("Range") String type = cur.getString(cur.getColumnIndex("type"));//短信type,1,接受,2,发送
            Map<String, String> map = new HashMap<String, String>();
            map.put("num", number);
            map.put("name", name);
            map.put("mess", body);
            map.put("type", type);
            list.add(map);
        }
        return list;
    }

3.获取所有彩信

/**
     * @param receive true:收到的彩信  false: 发出的彩信
     */
    @SuppressLint("Range")
    private List<Map<String, String>> getMMS(boolean receive) {
        List<Map<String, String>> list = new ArrayList<>();
        Uri parse = null;
        //这里是为了区分收件或发件,,如果不需要区分直接获取全部,可以直接使用 Uri.parse("content://mms/inbox")
        //查询所有彩信:Uri.parse("content://mms/inbox")
        if (receive) {
            //查询收件箱的彩信
            parse = Uri.parse("content://mms/inbox");
        } else {
            //查询已经发送成功的彩信
            parse = Uri.parse("content://mms/sent");
        }
        Cursor MMScursor = getContentResolver().query(parse, null, null, null, null);//查出所有彩信
        if (MMScursor == null) {
            return null;
        }
        if (!MMScursor.moveToFirst()) {
            return null;
        }
        do {
            @SuppressLint("Range") String id = MMScursor.getString(MMScursor.getColumnIndex("_id"));// 获取pdu表里 彩信的id
            String phonenumber = getAddressNumber(MMSActivity.this, id);
//            KLog.e("<<彩信>>  手机号:" + phonenumber);
            @SuppressLint("Range") int timess = MMScursor.getInt(MMScursor.getColumnIndex("date"));
            long timesslong = (long) timess * 1000;//彩信获取的时间是以秒为单位的。
//            KLog.e("<<彩信>>  时间:" + timeStampDate(timesslong));

            String selectionPart = "mid=" + id;// part表mid字段即为 pdu表 _id 字段
            //String[]        projection = new String[]{"_id", "address", "person", "body", "date", "type","protocol"};
            //从part表 获取彩信详情
            Cursor cursor = getContentResolver().query(Uri.parse("content://mms/part"), null, selectionPart, null, null); //查询 part 指定mid的数据
            if (cursor == null) {
                continue;
            } else {
                if (cursor.moveToFirst()) {
                    String body = "";//彩信文本
                    do {
                        @SuppressLint("Range") String type = cursor.getString(cursor.getColumnIndex("ct"));
                        //part表 ct字段 标识 此part内容类型,彩信始末:application/smil;如果是文本附件:text/plain;
                        //图像附件:jpg:image/jpeg,gif:image/gif;音频附件:audio/mpeg
                        if ("text/plain".equals(type)) {
                            @SuppressLint("Range") String data = cursor.getString(cursor.getColumnIndex("_data"));

                            if (data != null) {//附件地址不为空
                                @SuppressLint("Range") String partId = cursor.getString(cursor.getColumnIndex("_id"));
                                body = getMmsText(partId);
                            } else {//附件地址为空时通过text获取文本
                                //如果是彩信始末,为彩信的SMIL内容;如果是文本附件,为附件内容;如果是视频、音频附件,text为空
                                body = cursor.getString(cursor.getColumnIndex("text"));
                            }
//                            KLog.e("<<彩信>>  内容:" + body);
                        } else {
                            body = "";
                        }
                    } while (cursor.moveToNext());
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("phone", phonenumber);
                    map.put("time", timeStampDate(timesslong));
                    map.put("content", body);
                    if (receive) {
                        map.put("type", "收到一条彩信");
                    } else {
                        map.put("type", "发送一条彩信");
                    }
                    list.add(map);
                }
            }
        } while (MMScursor.moveToNext());
        return list;
    }


    /**
     * 时间戳转换为字符串
     *
     * @param time:时间戳
     * @return
     */
    private static String timeStampDate(long time) {
        String format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date(time));
    }

    private static String getAddressNumber(Context context, String id) {
        //此处id 也是pdu表的_id字段
        String selectionAdd = new String("msg_id=" + id);
        String uriStr = MessageFormat.format("content://mms/{0}/addr", id);
        Uri uriAddress = Uri.parse(uriStr);
        Cursor cAdd = context.getContentResolver().query(uriAddress, null, null, null, null);
        String name = null;
        if (cAdd.moveToFirst()) {
            do {
                @SuppressLint("Range") String number = cAdd.getString(cAdd.getColumnIndex("address"));
                if (number != null) {
                    try {
                        Long.parseLong(number.replace("-", ""));
                        name = number;
                    } catch (NumberFormatException nfe) {
                        if (name == null) {
                            name = number;
                        }
                    }
                }
            } while (cAdd.moveToNext());
        }
        if (cAdd != null) {
            cAdd.close();
        }
        return name;
    }


    private String getMmsText(String id) {
        Uri partURI = Uri.parse("content://mms/part/" + id);
        InputStream is = null;
        StringBuilder sb = new StringBuilder();
        try {
            is = getContentResolver().openInputStream(partURI);
            if (is != null) {
                InputStreamReader isr = new InputStreamReader(is, "UTF-8");
                BufferedReader reader = new BufferedReader(isr);
                String temp = reader.readLine();
                while (temp != null) {
                    sb.append(temp);
                    temp = reader.readLine();
                }
            }
        } catch (IOException e) {
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                }
            }
        }
        return sb.toString();
    }

注意,彩信需要分开两次查询,以便区分收件与发件,如果想要一次拿取所有彩信,修改getMMS方法即可

        List<Map<String, String>> MMSList= getMMS(true);
        KLog.e("<<彩信>>  收到的彩信:" + MMSList.toString());
        List<Map<String, String>> MMSList1= getMMS(false);
        KLog.e("<<彩信>>  发出的彩信:" + MMSList1.toString());

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 获取所有短信-彩信 的相关文章

  • 在 Android 中动态填充年份的微调器?

    我一直在绞尽脑汁试图让它发挥作用 我想动态地将 1900 年到当前年份的年份输入到旋转器中 我认为使用 XML 定义的数组不可能做到这一点 但是我可以使用数组适配器来做到这一点吗 这是我到目前为止所拥有的 ArrayList
  • APK META-INF/library_release.kotlin_module 中复制的重复文件

    我最近通过 JitPack 添加了两个 Android 库 但出现以下错误 Duplicate files copied in APK META INF library release kotlin module 我已经清除了缓存 并尝试使
  • 相当于Android中的javax.swing.Timer

    有没有类似的东西javax swing Timer在安卓上 我知道如何创建自己的线程 但是有类似摆动计时器的东西吗 您可能正在寻找课程android os CountDownTimer http developer android com
  • 为网络和/或持久存储序列化 Android Bundle?

    我需要序列化一个全面的应用程序 游戏 状态 以便通过网络传输或保存到磁盘并在以后检索 当然 捆绑包用于在多个用例中保存 恢复状态 因此使用它们将是理想的选择 但是 由于某种原因 Bundle 不可序列化 寻找解决方案只发现了将 Bundle
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • Android 上的硬币识别

    我目前正在开发一个 Android 应用程序 它能够拍摄硬币的现有图像 或者使用内置摄像头扫描单个硬币 非常像 Google Goggles 我正在使用 Android 版 OpenCV 我的问题如下 什么方法最适合使用 OpenCV 在
  • Android,语言文件不起作用

    我现在正在创建一个 Android 应用程序 并尝试为我的母语添加语言文件 但在某种程度上 这对我不起作用 我尝试在两部不同的手机中加载该应用程序 但结果相同 之前创建过语言文件 效果良好 但这次不行 手机设置为瑞典语 语言文件适用于我创建
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 在 Android 中关闭 Spinner 中的下拉菜单

    在 Android 中打开和关闭微调器时 我需要为箭头图标设置动画 打开微调器时我可以旋转箭头 我只是放了一个setOnTouchListener on the Spinner 当下拉菜单关闭或隐藏时 问题就来了 因为我不知道如何在该操作上
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • ImageButton 拉伸背景图像

    我正在尝试创建一个没有边框的 ImageButton 但遇到了图像按钮大小的问题 我使用 Eclipse ADT 将 ImageButton 拖到布局中并选择背景图像 图像按钮显示如下 正如您所看到的 背景图像和图像按钮周边之间有一个边框
  • 如何使用 onSearchRequested() 调用搜索对话框

    我正在尝试实现搜索对话框 但无法显示活动中的搜索 我在清单文件中定义了主要活动 此活动向用户显示了他们必须从中选择的选项列表 选项之一是 搜索 选项
  • 改造Android基本且简单的问题

    我的服务器返回简单的 Json 结果 如下所示 message Upload Success 我正在尝试将结果放入改造模型类中 public class MyResponse SerializedName message String me
  • 如何使用asynctask显示倒计时的进度条?

    在我的应用程序中 我希望用户按下按钮 然后等待 5 分钟 我知道这听起来很糟糕 但就这样吧 5 分钟等待期间的剩余时间应显示在进度条中 我使用带有文本视图的 CountDownTimer 来倒计时 但我的老板想要看起来更好的东西 这就是进度
  • 我可以在主线程上读取一个小 txt 文件,还是应该始终避免那里的 I/O?

    我正在读取一个小的 json 文件 其中有几行 它存储在用户设备的内部应用程序文件夹中 我所做的就是这样 JSONObject jsonObject new JSONObject MyUtils inputStreamToString My
  • 在Android中提取视频帧

    我想知道是否可以从 Android 中正在运行的视频中提取帧 我需要定期提取帧并将其发送以进行进一步处理 有人能为我找到答案吗 Thanks Abhi 您可以使用媒体元数据检索器 http developer android com ref
  • 在android中的日期选择器对话框中显示当前日期

    我多次尝试在日期选择器对话框中显示当前日期 但失败了 它显示 1 1 1990 我已经遵循了堆栈溢出的一些答案 但不幸的是这些对我不起作用 谁能解释一下在日期选择器对话框中显示当前日期的代码 谢谢 It may help you publi
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • 将数据放入短信发送意图中?

    我想发送短信 如果文字太长 我会将其分成多条消息 我试图将一些额外的信息放入 已发送 意图中 以了解哪个部分已发送 以及所有部分何时完成 ArrayList

随机推荐