开发android系统上面的收发短信程序

正文

首先配置好开发环境

1.下载安装eclipse集成开发环境

2.下载安装java开发包jdk

3.下载安装android sdk软件开发包

4.下载安装android开发工具ADT

注:下载安装过程环境软件具体配置过程略去,并且本文讨论的是在window上面开发apk程序,但是我是在linux下面操作的。

安装完毕后,开始编写和验证第一个android应用程序“helloworld”,验证可以正常地生成android应用程序代码和实际在虚拟设备AVD上执行,如果有android系统的手机,也可以安装apk在手机上面运行。

  1 接收短信程序
2
3 /*自定义类receivemessage继承自 BroadcastReceiver 类,监听系统服务广播的信息*/
4
5 public class receivemessage extends BroadcastReceiver{
6
7 /*声明静态字符串,并使用 android.provider.Telephony.SMS_RECEIVED作为Action为短信的依据*/
8
9 private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED";
10
11 private String num;
12
13 private String det;
14
15 private String tim;
16
17 private databasehelper mydatabasehelper;
18
19 @Override
20
21 public void onReceive(Context context, Intent intent) {
22
23 /*判断传来intent是否为短信*/
24
25 if (intent.getAction().equals(mACTION)) {
26
27 /*构建一字符串集合变量sb*/
28
29 StringBuilder sb = new StringBuilder();
30
31 /*接收由intent传来的数据*/
32
33 Bundle bundle = intent.getExtras();
34
35 /*判断intent是否有数据*/
36
37 if (bundle != null) {
38
39 /*pdus为android内置短信参数identifier
40
41 通过bundle.get(“”)返回一包含pdus的对象*/
42
43 Object[] myOBJpdus = (Object[]) bundle.get("pdus");
44
45 SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
46
47 for (int i = 0; i < myOBJpdus.length; i++) {
48
49 messages[i] = SmsMessage
50
51 .createFromPdu((byte[]) myOBJpdus[i]);
52
53 }
54
55 /*将送来的短信合并自定义信息于StringBuilder当中*/
56
57 for (SmsMessage currentMessage : messages) {
58
59 sb.append("来自:\n");
60
61 /*取得发信人的电话号码,并存储到num里面*/ num = currentMessage.getDisplayOriginatingAddress();
62
63 sb.append(currentMessage.getDisplayOriginatingAddress());
64
65 sb.append("\n的短信\n");
66
67 /*取得出来信息的body,并储存到det里面*/
68
69 det = currentMessage.getDisplayMessageBody();
70
71 sb.append(currentMessage.getDisplayMessageBody());
72
73
74
75 /*获取当前接受短信的时间*/
76
77 Calendar c = Calendar.getInstance();
78
79 int year = c.get(Calendar.DAY_OF_YEAR);
80
81 int day = c.get(Calendar.DAY_OF_MONTH);
82
83 int hour = c.get(Calendar.HOUR_OF_DAY);
84
85 int minute = c.get(Calendar.MINUTE);
86
87 /*把获取的时间保存在tim里面
88
89 tim = (String) (day + "天" + hour + "小时" + minute + "分");
90
91 }
92
93 }
94
95 /*用toast显示短信内容*/
96
97 Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
98
99 /*构造数据库管理类的对象*/
100
101 mydatabasehelper = new databasehelper(context);
102
103 /*取得数据库对象*/
104
105 mydatabasehelper.open();
106
107 /*num,det,tim储存到数据库中*/
108
109 mydatabasehelper.insertData(num, det, tim);
110
111 /*关闭数据库*/
112
113 mydatabasehelper.close();
114
115 }
116
117
118
119 }
120
121
122
123 }

 

发送短信程序

public class sendmessage extends Activity {

private Button button;

private EditText edittext01;

private EditText edittext02;

private String num;

String strMessage;

private ImageButton imagebutton;

private static final int PICK_CONTACT_SUBACTIVITY = 2;



/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/*通过findViewById构造器来构建 edittext01, edittext02,button , imagebutton的对象*/

edittext01 = (EditText) findViewById(R.id.edittext01);

edittext02 = (EditText) findViewById(R.id.edittext02);

button = (Button) findViewById(R.id.button);

imagebutton = (ImageButton) findViewById(R.id.imagebutton);

final String num = this.getIntent().getStringExtra("name");

/*将默认文字加载到editview中*/

edittext01.setText(num);

edittext02.setHint("请输入短信内容");

/*设置onclicklistener让用户单击imagebutton时作出反应*/

imagebutton.setOnClickListener(new Button.OnClickListener() {



@Override

public void onClick(View arg0) {

// TODO Auto-generated method stub

Uri uri = Uri.parse("content://contacts/people");

Intent intent = new Intent(Intent.ACTION_PICK, uri);

String strMessage = edittext02.getText().toString();

startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);

}

});

/*设置onclicklistener让用户单击imagebutton时作出反应*/

button.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

/*由edittext01取得短信收件人的电话号码*/

String strDestAddress = edittext01.getText().toString();

/*由edittext02取得短信文字内容*/

String strMessage = edittext02.getText().toString();

/*构建一取得default instance的SmsManager对象*/

SmsManager smsManager = SmsManager.getDefault();

/*先构建一个PendingIntent对象并使用getBroadcast广播

*将pendingIntent,电话号码,短信文字等参数

*传入sendTextMessage()方法发送短信

*/

PendingIntent mPI = PendingIntent.getBroadcast(

sendmessage.this, 0, new Intent(), 0);

smsManager.sendTextMessage(strDestAddress, null, strMessage,mPI, null);

/*清空EditText*/

edittext02.setText("");

}

});

}



@Override

// protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

switch (requestCode) {

case PICK_CONTACT_SUBACTIVITY:

final Uri uriRet = data.getData();

if (uriRet != null) {

try {

/*需要android.permission.READ_CONTACTS权限*/

Cursor c = managedQuery(uriRet, null, null, null, null);

/*将cursor移到数据库前端*/

c.moveToFirst();

String strName = "";

String strPhone = "";

/*取得_id这个字段的值*/

int contactId = c.getInt(c

.getColumnIndex(ContactsContract.Contacts._ID));

/*用_id去查询电话的Cursor*/

Cursor curContacts = getContentResolver().query(

ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID

+ " = " + contactId, null, null);

if (curContacts.getCount() > 0) {

curContacts.moveToFirst();

/*取得联系人的姓名*/

strName = curContacts

.getString(curContacts .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

/*取得联系人的电话*/

strPhone = curContacts

.getString(curContacts

.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

} else {

// nothing selected

}

edittext01.setText(strPhone);

} catch (Exception e) {

edittext02.setText(e.toString());

e.printStackTrace();

}

}

break;

}

super.onActivityResult(requestCode, resultCode, data);

}

}

 

发送的短信的时候有很多信息需要储存,比如说短信的号码,短信的内容,短信发送到达的时间,这就需要建立一个数据库,android系统中储存数据的方式很多,有Shared

preferences,Files,SQLite,Network,这里简单的介绍一下。

Shared perferences:用来储存“键值对”格式的数据,它是一个轻量级的键值储存机制,只可以存储基本数据类型。

Files:它通过FileInputStream和FileOutputStream对文件进行文件操作,但是在Android中,文件是一个应用程序所私有的,一个应用程序无法读写其他应用程序的文件。

Network:通过网络来储存和获得数据。

SQLite:是一个开源的关系型数据库,可以用来储存大量的数据,并且能给很容易地对数据进行使用、更新、维护等操作。

 

数据库帮助类

public class databasehelper {

//主键

private static final String KEY_ID = "_id";

//储存电话号码

private static final String KEY_NUM = "num";

//存储短信内容

private static final String KEY_DET = "det";

//储存短信到来的时间

private static final String KEY_TIM = "tim";

//数据库的名字

private static final String DB_NAME = "hd.db";

//数据库的表名

private static final String DB_TABLE = "table1";

//数据库的版本

private static final int DB_VERSION = 1;

//本地context对象

private Context mycontext = null;



//创建一个表的SQL语句

private static final String DB_CREATE = " CREATE TABLE " + DB_TABLE + "("+ KEY_ID + " INTEGER PRIMARY KEY, " + KEY_NUM + " TEXT , " + KEY_DET

+" TEXT, " + KEY_TIM + " TEXT )";

//执行open()打开数据库是,保存返回的数据对象

private SQLiteDatabase mysqlitedatabase = null;

//由SQLiteOpenHelper继承过来

private DatabaseHelper databasehelper = null;

private static class DatabaseHelper extends SQLiteOpenHelper {

/*构造函数创建一个数据库*/

DatabaseHelper(Context context) {

//创建一个数据库

super(context, DB_NAME, null, DB_VERSION);

}

/*创建一个表*/

@Override

public void onCreate(SQLiteDatabase db)

{

//数据库没有表时创建一个

db.execSQL(DB_CREATE);

}

/*升级数据库*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP table IF EXISTS notes");

onCreate(db);

}

}

/*构造函数-取得context*/

public databasehelper(Context context) {

mycontext = context;

}

//打开数据库,返回数据库对象

public void open() throws SQLException {

databasehelper = new DatabaseHelper(mycontext);

mysqlitedatabase = databasehelper.getWritableDatabase();

}

//关闭数据库

public void close() {

databasehelper.close();

}

//插入一条数据

public long insertData(String num, String det, String tim) {

ContentValues initialValues = new ContentValues();

initialValues.put(KEY_NUM, num);

initialValues.put(KEY_DET, det);

//获得系统时间

Calendar c = Calendar.getInstance();

int year=c.get(Calendar.DAY_OF_YEAR);

int day=c.get(Calendar.DAY_OF_MONTH);

int hour = c.get(Calendar.HOUR_OF_DAY);

int minute = c.get(Calendar.MINUTE);

tim = (String) (day+"天"+hour + "小时" + minute+"分");

initialValues.put(KEY_TIM, tim);

return mysqlitedatabase.insert(DB_TABLE, KEY_ID, initialValues); }

//删除一条数据

public boolean deleteData(long rowId) {

return mysqlitedatabase.delete(DB_TABLE, KEY_ID + "=" + rowId, null) > 0;

}

//通过cursor查询所有数据

public Cursor fetchAllData() {

return mysqlitedatabase.query(DB_TABLE, new String[] { KEY_ID,KEY_NUM, KEY_DET,KEY_TIM }, null, null, null, null, "_id desc");

}

/*更新一条数据*/

public boolean updateData(long rowId, int num, String det, String tim) {

ContentValues args = new ContentValues();

args.put(KEY_NUM, num);

args.put(KEY_DET, det);

Calendar c = Calendar.getInstance();

int year=c.get(Calendar.DAY_OF_YEAR);

int day=c.get(Calendar.DAY_OF_MONTH);

int hour = c.get(Calendar.HOUR_OF_DAY);

int minute = c.get(Calendar.MINUTE);

tim = (String) (day+"天"+hour + "小时" + minute+"分");

args.put(KEY_TIM, tim);

return mysqlitedatabase

.update(DB_TABLE, args, KEY_ID + "=" + rowId, null) > 0;

}

}

//界面设计与点击反馈

public class hd extends ListActivity implements OnItemLongClickListener {

private databasehelper mydatabasehelper;

protected static final int GUINOTIFIER = 0x1234;

public Handler mHandler;

private Thread mClockThread;

LinearLayout m_LinearLayout = null;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ListView m_ListView=this.getListView();

//设置listview的颜色

m_ListView.setBackgroundColor(-5247249);

m_ListView.setCacheColorHint(-5247249);

mydatabasehelper = new databasehelper(this);

mydatabasehelper.open();

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction("cn.abel.action.broadcast");

this.registerReceiver(new MyBroadcastReciver(), intentFilter);

//更新listview的显示

UpdataAdapter();

getListView().setOnItemLongClickListener(hd.this);

}

@Override

//点击列表并且响应点击

protected void onListItemClick(ListView l, View v, int position, long id) {

// TODO Auto-generated method stub

super.onListItemClick(l, v, position, id);

Intent intent = new Intent();

//获取数据库的指针

Cursor cur = mydatabasehelper.fetchAllData();

//传送被点击列里面的电话号码给另外一个ACTIVITY

if (cur.moveToPosition(position)) {

String num = cur.getString(cur.getColumnIndex("num"));

intent.putExtra("name", num);

}

intent.setClass(this, sendmessage.class);

startActivity(intent);

}

//android 菜单键的响应

public boolean onCreateOptionsMenu(Menu menu) {

menu.add(0, 0, 0, "设置");

menu.add(0, 1, 1, "退出");

return super.onCreateOptionsMenu(menu);

}

public boolean onOptionsItemSelected(MenuItem item) {

super.onOptionsItemSelected(item);

switch (item.getItemId()) {

case 0:

Intent intent = new Intent();

intent.setClass(this, setting.class);

startActivity(intent);

break;

case 1:

finish();

break;

}

return true;

}

//更新列表的显示的函数

public void UpdataAdapter() {

Cursor cur = mydatabasehelper.fetchAllData();

if (cur != null) {

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,

R.layout.zhuye,

cur, new String[] { "num", "det","tim" }, new int[] {

R.id.num, R.id.det ,R.id.tim});

setListAdapter(adapter);

adapter.notifyDataSetChanged();

}

}

//响应长时间点击

@Override

public boolean onItemLongClick(AdapterView<?> arg0, View arg1,

final int arg2, final long arg3) {

//弹出一个对话框

new AlertDialog.Builder(hd.this)

.setTitle("信息选项")

.setIcon(null)

.setMessage("是否删除短信")

.setPositiveButton("是", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialoginterface, int i) {

mydatabasehelper.deleteData(arg3);

UpdataAdapter();

}

}

)

.setNegativeButton("否", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialoginterface, int i) {

}

}).show();

return false;

}

private class MyBroadcastReciver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if(action.equals("cn.abel.action.broadcast")) {

UpdataAdapter();

}}}}

 

本文由于篇幅原因,只展示了部分代码,想得到更加详细的代码,请看我的源码。实际编成中出现了很多问题,当然也是经过反复的调试和修改。这里也不叙述。

这是程序的主界面,上面显示了收到短信的电话号码,短信内容,和短信到达的时间,由于程序是在linux下面运行的,所以运行过程中出现了乱码

上面这张图片是点击了上张图片的list后打开的另外一个activity,这个界面是用来发送短信。可以点击“+”用来查找手机里面储存的联系人的号码,点击发送键就可以发送短信。虽然可以通过程序监控短信是否发送出去,但是由于时间仓促并没有对此验证,若想验证程序是否正确,可以直接把程序安装在Android操作系统的手机上面进行验证。

posted on 2012-03-22 19:32  胡登  阅读(692)  评论(0)    收藏  举报

导航