macgg 发表于 2013-8-28 16:27

Android读取彩信附件

本帖最后由 hiand 于 2011-9-7 13:07 编辑       代码主要实现一个读取彩信列表的功能,原本功能是点击某条彩信记录,显示相关包括文本、图片(该处并没有对音频附件处理)等,该处就把他们整合到一起了。    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;   
                  for(int i=0; i< cPart.getColumnCount(); i++){   
                        values = cPart.getString(i);   
                  }   
                  if(values.equals("image/jpeg") || values.equals("image/bmp") || values.equals("image/gif") || values.equals("image/jpg") || values.equals("image/png")){//判断附件类型   
                        image.setImageBitmap(getMmsImage(values);//该处只会显示一张图片,如果有需求的朋友可以根据自己的需求将ImageView换成Gallery,修改一下方法   
                        image.setVisibility(View.VISIBLE);   
                  }else if(values.equals("text/plain")){   
                        /**该处详细描述一下   
                        *发现一个版本问题,之前用的2.1版本的多台手机测试通过,结果用1.6的G2报异常   
                        *经过调试发现,1.6版本part表中根本就没有"text"列,也就是values,所以就   
                        *报错了,好像在1.6版本(我只测过G2,嘿嘿),就算是文本信息也是以一个附件形   
                        *式存在_date里面也就是values里面,与图片类似,但在2.1里面却不是这样存   
                        *的,文本信息被存在了"text"这个字段中,且"_date"为null*/   
   
                        if(values!=null){//所以该处需判断一下,如果_date为null,可直接设置内容为"text"   
                            bodyStr=getMmsText(values);   
                        }else{   
                            bodyStr = values;   
                        }   
                  }   
                }   
                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;   
            //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;   
    }   
}</div
页: [1]
查看完整版本: Android读取彩信附件