到目前为止,我们所做的工作都是从手机数据库读取数据并加以显示,而这一次,我们要开始尝试其他类型的操作了,就是将用户发出的信息存至手机短信数据库中,按照惯例,还是先上图,看看效果怎么样再说吧。

     

左图为正在发送短信,右图为短信发送成功后的效果,通过上图还可以看到界面上面导航栏增加了对短信会话人信息的显示,以及其它诸如分享删除功能按钮,限于篇幅,在这一篇中先介绍会话人信息的显示,其它功能按钮的实现留到下一篇文章中再加以解说。

首先,先来看一下如何在短信会话记录页面上方导航栏显示会话人的信息吧。要显示会话人的资料,首先要解决的是如何取得联系人的信息问题,参照在上一篇文章中传递信息会话threadId的方式,不难想到可以通过同样的方法来传递获取联系人信息,下面来看一下具体的做法。

第一步,需要在MessageListAdapter的getMessageSessions()中获取联系人号码和名称,在方法中增加如下代码:

String phoneAndUnread[]=getPhoneNum(threadId);
String phone = phoneAndUnread[0];
contact = getContactFromPhoneNum(mContext, phone);smsinfo.setContactNumber(phone);smsinfo.setContactName(contact.getContactName());

通过getMessageSessions()方法中调用自定义的getPhoneNum()和getContactFromPhoneNum()获取会话人号码和名称,并将其存入到smsinfo对象中,然后,在getView()方法中设置每个列表项被点击时通过Intent跳转传递绘画人号码和名称,增加如下红色部分代码。

convertView.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Intent intent = new Intent();//通过Intent向显示短信会话信息的Activity传递会话id和会话人号码及名称intent.putExtra("threadId",infos.get(position).getThreadId());    intent.putExtra("contactName", infos.get(position).getContactName());intent.putExtra("phoneNumber", infos.get(position).getContactNumber());intent.setClass(mContext, ShowSessionMessagesActivity.class);mContext.startActivity(intent);}
});

在跳转后的ShowSessionMessagesActivity中,根据联系人号码查询得到联系人的头像,并将联系人的详细信息显示在页面导航栏ActionBar上,在ShowSessionMessagesActivity的onCreate()中做如下操作。

<span style="white-space:pre">  </span>//获取ActionBar对象ActionBar actionBar = getActionBar();//获取Intent对象        intent = getIntent();//获取短信会话人名称和号码phoneNumber = intent.getStringExtra("phoneNumber");contactName = intent.getStringExtra("contactName");    /** 1.若该会话人名称为空,判断为陌生号码,在短信会话界面上方只显示其号码* 2.若联系人名称为空,查询名称得到结果将与其号码相同,此时也应该只显示号码*/if(contactName.equals("")||contactName.equals(phoneNumber)){actionBar.setTitle(phoneNumber);}else{//若该会话人名称不为空,判断该号码是手机联系人,且名称值不为空,显示其名称和号码actionBar.setTitle(contactName); actionBar.setSubtitle(phoneNumber);}            //根据电话号码查询得到该联系人头像contact.setPhotoUri(null);contact = getContactFromPhoneNum(ShowSessionMessagesActivity.this, phoneNumber);//如果有该联系人头像,则设置显示其头像,如果没有则显示默认图标if (contact.getPhotoUri() == null){ actionBar.setLogo(R.drawable.ic_launcher);                                    }else{  Uri photoUri = contact.getPhotoUri();InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, photoUri);  //将Bitmap格式的联系人头像转换成Drawable格式Drawable drawablePhoto = new BitmapDrawable(BitmapFactory.decodeStream(input));//设置联系人头像作为短信会话左上角显示图标actionBar.setLogo(drawablePhoto);}

在上面的操作中,用到了android.app.ActionBar对象,即Android提供的用于显示程序导航栏的接口对象,来设置显示会话人的号码,名称和头像,其中,用于查询会话人资料的方法getContactFromPhoneNum定义如下。

//根据联系人号码从通讯录中获取联系人信息,包括名称和头像uri

 public ContactData getContactFromPhoneNum(Context context, String phoneNum)  {   Cursor cursor = null;String phone = phoneNum;ContactData contact = new ContactData();contact.setContactName("");contact.setPhotoUri(null);String contactName;long photoId = -1;long contactId = -1;Bitmap contactPhoto = null;try{           cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,  ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?",  new String[]{phone}, null);                          if(cursor == null){return contact;}if(cursor.getCount() == 0){cursor.close();cursor = null;return contact;}//若根据号码能够查到相应的联系人记录,说明该会话人为手机联系人之一,返回该联系人名称和头像资料if (cursor.moveToFirst()){  contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); photoId = (Long)cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_ID));contactId = (Long)cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));                //photoId 大于0 表示联系人有头像 if(photoId > 0 ) {  contact.setPhotoUri(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactId)); }contact.setContactName(contactName);                  cursor.close(); cursor = null;return contact;}  }catch(Exception e){Log.e(GetContactByPhoneTAG,"E:" + e.toString()); }finally{if (cursor != null){cursor.close();cursor = null;               }            }      return contact;} 

好了,通过上面的操作,我们就可以再程序导航栏显示短信会话人信息了,接下来,来看一下如何将发送短信存到手机数据库吧。为了发送短信,我们在布局文件activity_show_session_messages.xml中增加输入框和发送按钮,在文件中添加如下代码。

  <EditTextandroid:id="@+id/sessionMessagesEditText"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentLeft="true"android:layout_alignParentBottom="true"android:layout_marginRight="60dp"android:hint="@string/message_content"/><Buttonandroid:id="@+id/sessionMessagesSendButton"android:layout_width="60dp"android:layout_height="50dp"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:text="发送" />

然后,在ShowSessionMessagesActivity的onCreate()中增加代码如下所示:

 //找到输入短信收件人号码和信息内容的控件contentEditText = (EditText) this.findViewById(R.id.sessionMessagesEditText);        sendMessageButton = (Button) this.findViewById(R.id.sessionMessagesSendButton);sendMessageButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {/** 需要在onClick方法中获取用户在控件上输入的短信内容,* 保证在发送按钮被点击后再获取用户输入,确保能获取到用户输入数据*/messageContent = contentEditText.getText().toString().trim();                            /** 手机号码必需不为空 **/  if (!TextUtils.isEmpty(phoneNumber)){             /**将短信添加到数据库**/  ContentValues values = new ContentValues();  //发送时间  values.put("date", System.currentTimeMillis());  //阅读状态,0未读1已读  values.put("read", 0);  //1为收 2为发  values.put("type", 2);  //接受信息号码  values.put("address", phoneNumber);  //信息内容  values.put("body", messageContent);  //插入短信库  try{ShowSessionMessagesActivity.this.getContentResolver().insert(Uri.parse("content://sms/sent"),values);/*信息发送成功后重新为为ListView设置适配器,* 刷新为控件显示的数据,显示刚刚发送出去的信息*/ShowSessionMessagesAdapter sessionMessagesAdapter = new ShowSessionMessagesAdapter(ShowSessionMessagesActivity.this);sessionMessagesAdapter.getSessionMessages(threadId);sessionMessagesListView.setAdapter(sessionMessagesAdapter);//实时通知数据已更新sessionMessagesAdapter.notifyDataSetChanged();//清空输入信息内容contentEditText.setText("");}catch(Exception e){Log.e(WriteToMessageDatabaseTAG,"E:" + e.toString());}}  }            });

在往手机数据库插入发送的短信时,用到了ContentResolver的insert()方法,该方法是Android提供封装好的数据库操作API方法,它调用了ContentProvider中的方法,执行对数据库的操作命令。

OK,就先到这里吧,ActionBar导航栏的详细功能会在下一篇中再介绍。

基于Android的短信应用开发(六)——将发出短信存至数据库相关推荐

  1. 基于Android的手机安全卫士的开发

    基于Android的手机安全卫士的开发 开发环境 处理器:Intel® Core™ i5-5200U CPU 2.20GHz 内存:4GB 硬盘:500GB 操作系统:Windows 7中文版,64位 ...

  2. interlib android客户端开发,基于Android移动图书馆设计与开发.doc

    基于Android移动图书馆设计与开发 基于Android移动图书馆设计与开发 [摘 要]随着移动 技术的发展,图书馆数字化的资源已不局限于在电脑上进行展示,手机已成为用户浏览图书 馆数字化资源的重要 ...

  3. 茶百科 android 论文,基于android平台手机茶百科开发_学位论文.doc

    基于android平台手机茶百科开发_学位论文 摘要 随着智能手机一步步走进普通人的生活,它将成为人们获取信息的主要设备.因此,手机的应用服务将会有很大的发展空间,手机茶百科软件就是其中的一项.And ...

  4. php mysql 开发微博_php+mysql基于Android的手机微博应用开发

    摘要:本系统采用Eclipse作为开发工具,数据库基于MySQL,服务器的编写使用的是PHP语言,开发了基于Android平台开的C/S模式的手机微博系统.系统从符合操作简便.界面友好.使用灵活.实用 ...

  5. 小米8系统推送服务器,小米8推送基于Android 10的MIUI 11开发版

    据IT之家网友反馈,小米8开始推送基于Android 10的MIUI 11开发版.本次更新包大小2.1G,除了升级底层为Android 10之外,还带来了谷歌10月安全更新. 更新日志: MIUI 1 ...

  6. 网页短信平台开发为什么要用短信服务程序

    网页短信平台开发为什么要用短信服务程序 一:概述 有人会问开发网页版的平台或者系统直接写BS就可以了,为什么还要写服务程序.其实不用写服务程序也可以但是大量的逻辑操作或者是数据操作的话直接写到网页上会 ...

  7. android记事本的设计报告,基于android记事本的设计与开发开题报告.doc

    基于android记事本的设计与开发开题报告.doc 太 原 科 技 大 学 华 科 学 院毕业设计开题报告学 生 姓 名学 号学 院.系 专 业论 文 题 目基于android的记事本的开发与设计指 ...

  8. 基于Android小巫新闻客户端开发---显示新闻详细内容UI设计

    基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的内容介 ...

  9. 基于Android + Web+ MySQL设计和开发微博应用

    基于Android + Web+ MySQL设计和开发微博应用 实践内容要求 客户端效果图 源码分享 微博应用系统设计 系统功能设计 关键问题设计 实践内容要求 ①用Android开发微博客户端: ② ...

  10. android备忘录开题报告,基于android记事本的设计与开发开题报告.doc

    基于android记事本的设计与开发开题报告 太 原 科 技 大 学 华 科 学 院 毕业设计开题报告 学 生 姓 名:学 号:学 院.系: 专 业:论 文 题 目:基于android的记事本的开发与 ...

最新文章

  1. Icomparer和Icomparable集合排序
  2. 正态分布的前世今生(一)
  3. Kubernetes探针踩坑记
  4. php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码
  5. 【转】基于WebSocketSharp 的IM 简单实现
  6. python删除指定字符_python删除字符串中指定字符的方法
  7. css画三角形以及各种图形
  8. java队列类_用Java编写一个队列类
  9. 如何在AD上重定向电脑加域后默认保存位置?
  10. String s1 = new String(abc)到底创建了几个对象?底层原理是什么?
  11. linux忘记git库密码,忘记gitlab的root密码
  12. Java SpringMVC毕业项目实战-学生信息管理系统
  13. 《山本耀司》- 我不烦你,请你也不要来烦我
  14. 把领导发展成朋友,而不是仅仅的同事关系
  15. 国产CI/CD工具Commander
  16. 原来华为的鸿蒙就是换皮安卓,OPPO公关抖出鸿蒙是安卓换皮的猛料,结果被骂到辞职...
  17. 解决vscode打开中文乱码,用记事本打开却无乱码
  18. SeleniumChrome实战:动态爬取51job招聘信息
  19. LDA和PCA降维的区别
  20. 简易图书馆借还书系统(核心部分)

热门文章

  1. 【故障检测问题】基于matlab免疫算法求解故障检测问题【含Matlab源码 196期】
  2. 基于Python-Pycharm的猴子摘桃小game
  3. figure,figcaption的用法
  4. 什么是抽象类和抽象方法,以及他们的特点
  5. Robcup2D足球学习记录【2020.01.30】
  6. python 选择文件对话框插件_Python DearPyGui 常用控件一
  7. 单细胞转录组文章复现系列(一)——seurat
  8. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(4)
  9. 华师大计算机入门模拟卷,华东师范大学网络本科计算机基础考试大纲
  10. 我的一点企业上云经验