`

SMS管理:收信箱 发信息 编写新信息

 
阅读更多

SMS管理:收信箱 发信息 编写新信息

文章分类:移动开发

SMS管理

[功能]

1. 收信箱:显示所有收到的信息 且实时显示 即:当有新信息收到 能自动刷新显示

2. 发信箱:显示所有已发信息 同上

3. 编写新信息: 鉴于一些问题 打算不自行定义 而只通过Intent调用系统的

[原理]

1. 通过目标Uri显示收信箱 发信箱 目标Uri:content://sms/inbox content://sms/sent

2. 实时刷新:一个办法是开辟thread 定时查询目标Uri 显示之 但会带来一些效能影响 所以决定使用ContentObserve监听目标Uri 当有变动 由ContentObserve通知注册方 该Uri:content://sms

3. 注意:ContentObserve不能监听: content://sms/inbox & content://sms/sent 而只能监听content://sms

[代码 步骤]

1. 定义SMSObserver 用于监听目标 并通过Handle通知注册方

  1. public class SMSObserver extends ContentObserver{
  2. public final static int SMS_CHANGE= 0 ;
  3. Handlerhandle;
  4. public SMSObserver(Handlerh){
  5. super (h);
  6. //TODOAuto-generatedconstructorstub
  7. handle=h;
  8. }
  9. public void onChange( boolean selfChange){
  10. //TODOAuto-generatedmethodstub
  11. super .onChange(selfChange);
  12. //notifySMSInbox&SMSSent
  13. handle.sendEmptyMessage(SMS_CHANGE);
  14. }
  15. }

2. 定义注册方:SMSInbox 鉴于SMSSent与其原理类似 故打算以SMSInbox为例

> 2.1. 显示当前所有收信箱 并与ListView适配

  1. lv=(ListView)findViewById(R.id.list);
  2. cursor=getContentResolver().query(Uri.parse("content://sms/inbox" ), null , null , null , null );
  3. adapter=new ItemAdapter( this );
  4. lv.setAdapter(adapter);

> 2.2. 定义Handle 用于接受变动 并注册与ContentObserve 当接到通知后 查询目标Uri 并刷新显示

  1. handler= new Handler(){
  2. public void handleMessage(Messagemsg){
  3. if (msg.what==SMSObserver.SMS_CHANGE){
  4. cursor=getContentResolver().query(Uri.parse("content://sms/inbox" ), null , null , null , null );
  5. adapter.notifyDataSetChanged();
  6. }
  7. }
  8. };
  9. sObserver=new SMSObserver(handler);
  10. this .getContentResolver().registerContentObserver(Uri.parse( "content://sms" ), true ,sObserver);

> 2.3. SMSInbox 仅用于显示 收信箱 故定义 SMSDetails extends Activity 用于详细显示 sms信息

- 2.3.1. 定义布局:details.xml

  1. <?xmlversion= "1.0" encoding= "utf-8" ?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/detailsNumber"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. />
  12. <TextView
  13. android:id="@+id/detailsBody"
  14. android:layout_width="fill_parent"
  15. android:layout_height="200dip"
  16. />
  17. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  18. android:orientation="horizontal"
  19. android:layout_width="300dip"
  20. android:layout_height="wrap_content"
  21. >
  22. <Button
  23. android:id="@+id/detailsReply"
  24. android:layout_width="100dip"
  25. android:layout_height="wrap_content"
  26. android:layout_gravity="left"
  27. android:text="回复"
  28. />
  29. <Button
  30. android:id="@+id/detailsOK"
  31. android:layout_width="100dip"
  32. android:layout_height="wrap_content"
  33. android:layout_gravity="right"
  34. android:text="确定"
  35. />
  36. </LinearLayout>
  37. </LinearLayout>

- 2.3.2. 其中2个TextView 分别显示信息地址和正文 2个Button 一个用于关闭当前窗口 一个用于短信回复 且自动填充 收信人地址

  1. public class SMSDetails extends Activity{
  2. TextViewtextNumber,textBody;
  3. ButtonbtnOK,btnReply;
  4. OnClickListenercl;
  5. Stringaddress,body;
  6. /**Calledwhentheactivityisfirstcreated.*/
  7. @Override
  8. public void onCreate(BundlesavedInstanceState){
  9. super .onCreate(savedInstanceState);
  10. setContentView(R.layout.details);
  11. textNumber=(TextView)findViewById(R.id.detailsNumber);
  12. textBody=(TextView)findViewById(R.id.detailsBody);
  13. btnReply=(Button)findViewById(R.id.detailsReply);
  14. btnOK=(Button)findViewById(R.id.detailsOK);
  15. Intenti=this .getIntent();
  16. Bundlebundle=i.getExtras();
  17. address=bundle.getString("address" );
  18. body=bundle.getString("body" );
  19. textNumber.setText("from:" +address);
  20. textBody.setText("messagebody:/n" +body);
  21. cl=new OnClickListener(){
  22. @Override
  23. public void onClick(Viewarg0){
  24. //TODOAuto-generatedmethodstub
  25. switch (arg0.getId()){
  26. case R.id.detailsReply:
  27. sendGoNativeNew(address);
  28. break ;
  29. case R.id.detailsOK:
  30. sendBack();
  31. break ;
  32. }
  33. }
  34. };
  35. btnReply.setOnClickListener(cl);
  36. btnOK.setOnClickListener(cl);
  37. }
  38. public void sendGoNativeNew(Stringaddress){
  39. //nativesendsmsapp
  40. IntentsendIntent=new Intent(Intent.ACTION_SENDTO,Uri.parse( "sms://" ));
  41. //autofill"address"
  42. sendIntent.putExtra("address" ,address);
  43. startActivity(sendIntent);
  44. }
  45. public void sendBack(){
  46. Intenti=new Intent();
  47. this .setResult(RESULT_OK,i);
  48. this .finish();
  49. }
  50. }

- 2.3.3. 点击SMSInbox 某项 跳转到SMSDetails

  1. lv.setOnItemClickListener( new OnItemClickListener(){
  2. @Override
  3. public void onItemClick(AdapterView<?>arg0,Viewarg1, int arg2,
  4. long arg3){
  5. //TODOAuto-generatedmethodstub
  6. cursor.moveToPosition(arg2);
  7. Stringbody=cursor.getString(cursor.getColumnIndexOrThrow("body" )).toString();
  8. Stringaddress=cursor.getString(cursor.getColumnIndexOrThrow("address" )).toString();
  9. Bundleb=new Bundle();
  10. b.putString("body" ,body);
  11. b.putString("address" ,address);
  12. Intentintent=new Intent(SMSInbox. this ,SMSDetails. class );
  13. intent.putExtras(b);
  14. startActivity(intent);
  15. }
  16. });

- 2.3.4. 其中item.xml 用于定义子项布局

  1. <? xml version = "1.0" encoding = "utf-8" ?>
  2. < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
  3. android:orientation = "vertical"
  4. android:layout_width = "fill_parent"
  5. android:layout_height = "fill_parent"
  6. >
  7. < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
  8. android:orientation = "horizontal"
  9. android:layout_width = "wrap_content"
  10. android:layout_height = "wrap_content"
  11. >
  12. < ImageView
  13. android:id = "@+id/body"
  14. android:layout_width = "wrap_content"
  15. android:layout_height = "wrap_content"
  16. />
  17. < TextView
  18. android:id = "@+id/num"
  19. android:layout_width = "wrap_content"
  20. android:layout_height = "wrap_content"
  21. android:paddingLeft = "5dip"
  22. />
  23. </ LinearLayout >
  24. < TextView
  25. android:id = "@+id/body"
  26. android:layout_width = "fill_parent"
  27. android:layout_height = "wrap_content"
  28. android:paddingLeft = "10dip"
  29. />
  30. </ LinearLayout >

3. 鉴于SMSSent与SMSInbox大同小异 故不再细说 仅补上代码

  1. public class SMSSent extends Activity{
  2. ListViewlv;
  3. Cursorcursor;
  4. ItemAdapteradapter;
  5. SMSObserversObserver;
  6. Handlerhandler;
  7. /**Calledwhentheactivityisfirstcreated.*/
  8. @Override
  9. public void onCreate(BundlesavedInstanceState){
  10. super .onCreate(savedInstanceState);
  11. setContentView(R.layout.list);
  12. setTitle(R.string.sent);
  13. lv=(ListView)findViewById(R.id.list);
  14. cursor=getContentResolver().query(Uri.parse("content://sms/sent" ), null , null , null , null );
  15. adapter=new ItemAdapter( this );
  16. lv.setAdapter(adapter);
  17. lv.setOnItemClickListener(new OnItemClickListener(){
  18. @Override
  19. public void onItemClick(AdapterView<?>arg0,Viewarg1, int arg2,
  20. long arg3){
  21. //TODOAuto-generatedmethodstub
  22. cursor.moveToPosition(arg2);
  23. Stringbody=cursor.getString(cursor.getColumnIndexOrThrow("body" )).toString();
  24. Stringaddress=cursor.getString(cursor.getColumnIndexOrThrow("address" )).toString();
  25. Bundleb=new Bundle();
  26. b.putString("body" ,body);
  27. b.putString("address" ,address);
  28. Intentintent=new Intent(SMSSent. this ,SMSDetails. class );
  29. intent.putExtras(b);
  30. startActivity(intent);
  31. }
  32. });
  33. //registerSMSObserve
  34. handler=new Handler(){
  35. public void handleMessage(Messagemsg){
  36. if (msg.what==SMSObserver.SMS_CHANGE){
  37. cursor=getContentResolver().query(Uri.parse("content://sms/sent" ), null , null , null , null );
  38. adapter.notifyDataSetChanged();
  39. }
  40. }
  41. };
  42. sObserver=new SMSObserver(handler);
  43. this .getContentResolver().registerContentObserver(Uri.parse( "content://sms" ), true ,sObserver);
  44. }
  45. public class ItemAdapter extends BaseAdapter{
  46. Activityactivity;
  47. public ItemAdapter(Activitya){
  48. activity=a;
  49. }
  50. @Override
  51. public int getCount(){
  52. //TODOAuto-generatedmethodstub
  53. return cursor.getCount();
  54. }
  55. @Override
  56. public ObjectgetItem( int arg0){
  57. //TODOAuto-generatedmethodstub
  58. return cursor.getString(arg0);
  59. }
  60. @Override
  61. public long getItemId( int arg0){
  62. //TODOAuto-generatedmethodstub
  63. return arg0;
  64. }
  65. @Override
  66. public ViewgetView( int arg0,Viewarg1,ViewGrouparg2){
  67. //TODOAuto-generatedmethodstub
  68. return composeItem(arg0);
  69. }
  70. private ViewcomposeItem( int position){
  71. cursor.moveToPosition(position);
  72. Stringbody=cursor.getString(cursor.getColumnIndexOrThrow("body" )).toString();
  73. Stringnumber=cursor.getString(cursor.getColumnIndexOrThrow("address" )).toString();
  74. LinearLayoutitem=(LinearLayout)activity.getLayoutInflater().inflate(R.layout.item,null );
  75. LinearLayoutl1=(LinearLayout)item.getChildAt(0 );
  76. TextViewtbody=(TextView)item.getChildAt(1 );
  77. if (tbody!= null ){
  78. tbody.setText(body);
  79. }
  80. TextViewtnum=(TextView)l1.getChildAt(1 );
  81. if (tnum!= null ){
  82. tnum.setText(number);
  83. }
  84. ImageViewimage=(ImageView)l1.getChildAt(0 );
  85. image.setImageResource(R.drawable.message);
  86. return item;
  87. }
  88. }
  89. }

4. emulator 运行截图

> 4.1.SMSInbox:

- 4.1.1. 通过telnet localhost 5554 登录emulator 通过 sms send 123 hello to 123 模拟发送短信

- 4.1.2. 短信发送记录为:

  1. AndroidConsole:type 'help' for alistofcommands
  2. OK
  3. smssend12 ds
  4. OK
  5. smssend23 hito 23
  6. OK
  7. smssend34 iamgriddinshi
  8. OK

- 4.1.3. SMSInbox:

<!-- StartFragment -->
<!-- StartFragment -->

> 4.2. SMSSent

- 4.2.1. 已发短信记录:

- 4.2.2. SMSSent:

5. 未解决问题:

> 5.1. ContentObserver 只能监听content://sms 而不支持content://sms/inbox content://sms/sent 个人猜测是因为:android 在写sms数据库 insert(...) 没有通过ContentResolver通知content://sms/inbox content://sms/sent 所致 即:没有以下代码:

getContext().getContentResolver().notifyChange(noteUri, null);

分享到:
评论

相关推荐

    C# 编写的短信猫发送短信dll源码和一个简单的winform测试

    c#编写的短信猫(WAVECOM)发送短信程序dll,没有任何功能限制,在你的程序中引用SIMSMS.dll就可以了。帮助文档就不写了,在程序中有注释,在测试的winform中也有简单应用的示例。看看就明白了! 如果感觉功能不够,...

    关于JAVA的jmail组件

    一方面,电子邮件的使用越来越频繁,...该软件对指定邮件服务器的邮箱进行监控,可以实现邮件到达通知、直接用邮件发送短信息、发送邮件的同时发送短消息、短信群发等功能,将信息的传递从桌面上延伸到移动通讯设备上。

    JAVA上百实例源码以及开源项目源代码

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

    JAVA上百实例源码以及开源项目

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

    AquaMail_Pro-v1.23.0-1556_build_102300002.apk

    与Light Flow,增强的SMS和呼叫者ID,云打印,Apex Launcher Pro,Nova Launcher / Tesla Unread,执行助理,DashClock Widget集成。 许多设置可以按您想要的方式配置应用程序。WiFi和移动连接的单独设置。 ...

    myxy:Calendar42的API包装器

    我们提供SMS文本(并非每个人都拥有智能手机),交易邮件(老式邮箱没有问题)和本机推送通知,包括自定义模板和通知掩码。 安装 将此行添加到您的应用程序的Gemfile中: gem 'myxy' 然后执行: $ bundle 或将...

    java开源包2

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    Java资源包01

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包1

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包11

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包3

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包6

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包5

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包10

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包4

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包8

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包7

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包9

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

    java开源包101

    LemonSMS 这个Java库可以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、...

Global site tag (gtag.js) - Google Analytics