andriod彩信接受

简介:
public class SmsPage extends ListActivity{
    
    private final String TAG="SmsPage"; 
    
    private final Uri CONTENT_URI = Uri.parse("content://mms/inbox"); //查询彩信收件箱
    
    private final Uri CONTENT_URI_PART = Uri.parse("content://mms/part"); //彩信附件表
    
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.smslist);    
        Cursor cursor = getContentResolver().query(CONTENT_URI, null, null,null, null);
        if(cursor.getCount()>0){
            MyAdapter adapter = new MyAdapter(this,R.layout.smsitem,cursor,new String[]{},new int[]{});
            setListAdapter(adapter);
        }
    }
    
    public class MyAdapter extends SimpleCursorAdapter{
        private String name="";
        public MyAdapter(Context context, int layout, Cursor c, String[] from,
                int[] to) {
            super(context, layout, c, from, to);
        }
        
        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            TextView address = (TextView)view.findViewById(R.id.sms_address);
            TextView body = (TextView)view.findViewById(R.id.sms_body);
            TextView date = (TextView)view.findViewById(R.id.sms_date);
            TextView sub = (TextView)view.findViewById(R.id.sms_sub);
            ImageView image = (ImageView)view.findViewById(R.id.sms_image);

            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date time=new Date(cursor.getLong(cursor.getColumnIndex("date"))*1000);//彩信时间
            int id = cursor.getInt(cursor.getColumnIndex("_id"));//彩信Id
            String subject = cursor.getString(cursor.getColumnIndex("sub"));//彩信主题
            Cursor cAdd =null;
            Cursor cPhones=null;
            Cursor cPeople=null;
            Cursor cPart=null;
            try {
                //根据彩信id从addr表中查出发送人电话号码,其中外键msg_id映射pdu表的id;
                String selectionAdd = new String("msg_id=" + id + ");
                Uri uriAddr = Uri.parse("content://mms/" + id + "/addr");
                cAdd = getContentResolver().query(uriAddr, null, selectionAdd, null, null);
                
                //根据addr表中的电话号码在phones表中查出PERSON_ID,外键PERSON_ID映射people表中的_id
                if(cAdd.moveToFirst()){//该处会得到2条记录,第一条记录为发件人号码,第二条为本机号码
                    String number= cAdd.getString(cAdd.getColumnIndex("address"));
                    cPhones = getContentResolver().query(Contacts.Phones.CONTENT_URI, new String[]{Contacts.Phones.PERSON_ID},Contacts.Phones.NUMBER +"=?",new String[]{number}, null);
                    if(cPhones.getCount()>0){//根据phones表中的PERSON_ID查出 people 表中联系人的名字
                        while (cPhones.moveToNext()) {
                            String pId = cPhones.getString(cPhones.getColumnIndex(Contacts.Phones.PERSON_ID));
                            Uri uriPeo = Uri.parse(Contacts.People.CONTENT_URI+"/"+pId);
                            cPeople = getContentResolver().query(uriPeo, null,null,null, null);
                            if(cPeople.getCount()>0){
                                String str="";
                                while (cPeople.moveToNext()) {
                                    if(str == ""){
                                        str = cPeople.getString(cPeople.getColumnIndex(Contacts.People.DISPLAY_NAME));
                                    }else{
                                        str += ","+cPeople.getString(cPeople.getColumnIndex(Contacts.People.DISPLAY_NAME));
                                    }
                                }
                                name=number+"/"+str;//如果通讯录中存在,则以 ‘电话号码/名字’ 形式显示
                            }else{
                                name=number;//如果是陌生人直接显示电话号码
                            }
                        }
                    }else{
                        name=number;//如果是陌生人直接显示电话号码
                    }    
                }
                
                //根据彩信ID查询彩信的附件
                String selectionPart = new String("mid="+id);//part表中的mid外键为pdu表中的_id
                cPart = getContentResolver().query(CONTENT_URI_PART, null,selectionPart,null, null);            
                String bodyStr="";
                String[] coloumns = null; 
                String[] values = null; 
                while(cPart.moveToNext()){ 
                    coloumns = cPart.getColumnNames(); 
                    if(values == null) 
                        values = new String[coloumns.length]; 
                    for(int i=0; i< cPart.getColumnCount(); i++){ 
                        values[i] = cPart.getString(i); 
                    } 
                    if(values[3].equals("image/jpeg") || values[3].equals("image/bmp") || values[3].equals("image/gif") || values[3].equals("image/jpg") || values[3].equals("image/png")){  //判断附件类型
                        image.setImageBitmap(getMmsImage(values[0]);//该处只会显示一张图片,如果有需求的朋友可以根据自己的需求将ImageView换成Gallery,修改一下方法
                        image.setVisibility(View.VISIBLE);
                    }else if(values[3].equals("text/plain")){
                        /**该处详细描述一下
                        *发现一个版本问题,之前用的2.1版本的多台手机测试通过,结果用1.6的G2报异常
                        *经过调试发现,1.6版本part表中根本就没有"text"列,也就是values[13],所以就
                        *报错了,好像在1.6版本(我只测过G2,嘿嘿),就算是文本信息也是以一个附件形
                        *式存在_date里面也就是values[12]里面,与图片类似,但在2.1里面却不是这样存
                        *的,文本信息被存在了"text"这个字段中,且"_date"为null*/

                        if(values[12]!=null){//所以该处需判断一下,如果_date为null,可直接设置内容为"text"
                            bodyStr=getMmsText(values[0]);
                        }else{
                            bodyStr = values[13];
                        }
                    }
                }
                if(!"".equals(subject) && subject != null){
                    try {
                        sub.setText(new String(subject.getBytes("iso-8859-1"),"UTF-8"));//设置彩信主题的编码格式
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
                if(!"".equals(bodyStr)){
                    body.setText(bodyStr);
                }
                address.setText(name); 
                date.setText(format.format(time));
            } catch (RuntimeException e) {
                Log.e(TAG, e.getMessage());
            }finally{
                if(cAdd != null){
                    cAdd.close();
                }
                if(cPart != null){
                    cPart.close();
                }
                if(cPeople != null){
                    cPeople.close();
                }
                if(cPhones != null){
                    cPhones.close();
                }
            }
            super.bindView(view, context, cursor);
        }
    }
    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){
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
                String temp = reader.readLine();
                while (temp != null) {
                    sb.append(temp);
                    temp=reader.readLine();//在网上看到很多把InputStream转成string的文章,没有这关键的一句,几乎千遍一律的复制粘贴,该处如果不加上这句的话是会内存溢出的
                }
            }
        }catch (IOException e) { 
            e.printStackTrace();  
            Log.v(TAG, "读取附件异常"+e.getMessage());
        }finally{ 
            if (is != null){ 
                try { 
                    is.close(); 
                }catch (IOException e){
                    Log.v(TAG, "读取附件异常"+e.getMessage());
                }
            } 
        }
        return sb.toString();
    }
    private Bitmap getMmsImage(String _id){ //读取图片附件
        Uri partURI = Uri.parse("content://mms/part/" + _id ); 
        //ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        InputStream is = null; 
        Bitmap bitmap=null;
        try { 
            is = getContentResolver().openInputStream(partURI); 
            //byte[] buffer = new byte[256];  
            //int len = -1;
            //while ((len = is.read(buffer)) != -1) {
            //    baos.write(buffer, 0, len);
            //}
            //bitmap = BitmapFactory.decodeByteArray(baos.toByteArray(), 0, baos.toByteArray().length);
           bitmap = BitmapFactory.decodeStream(is);     }catch (IOException e) { 
            e.printStackTrace();  
            Log.v(TAG, "读取图片异常"+e.getMessage());
        }finally{ 
            if (is != null){ 
                try { 
                    is.close(); 
                }catch (IOException e){
                    Log.v(TAG, "读取图片异常"+e.getMessage());
                }
            } 
        }
        return bitmap;
    }
}

相关文章
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
这篇文章介绍了在Visual Studio Code (VSCode) 中进行离线安装插件的详细步骤,包括如何下载插件、以SVN插件为例的离线安装过程、通过命令行安装以及一个更加简单的离线安装方式,还提供了操作界面的截图帮助理解。
简单易操作 VsCoe离线安装插件【步骤+图片+插件】
|
7天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
6天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
本文讲解 Prompt 基本概念与 10 个优化技巧,结合学术分析 AI 应用的需求分析、设计方案,介绍 Spring AI 中 ChatClient 及 Advisors 的使用。
315 130
AI 超级智能体全栈项目阶段二:Prompt 优化技巧与学术分析 AI 应用开发实现上下文联系多轮对话
|
18天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1330 8
|
5天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
17天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1407 87
|
6天前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
312 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
5天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。