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_); 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("m"; 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; } }
最後更新:2017-04-04 07:03:53