开发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操作系统的手机上面进行验证。
浙公网安备 33010602011771号