关于如何实现Android的短信发送功能呢?下面就具体为大家介绍一下:
(1)首先给大家看一下系统界面:
这里主要有两个EditText和三个Button,当点击第一个按钮时,跳转到系统联系人界面,可以选择相应的联系人号码,点击后返回到这个界面,第一个EditText填充上号码。点击第二个按钮后,跳转到短信的列表界面,选择短信内容,回到本页面,填充第二个EditText,然后点击第三个Button可以进行发送短信的操作。
(2)系统的具体实现
对于XML文件布局,由于 比较简单,这里就不在论述,下面是具体的代码实现:
主页面的代码实现
package com.example.lvjianwen150504;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.telephony.gsm.SmsManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
* 第二题主页面
*
* @author Lvjianwen
*
*/
public class Exercise1_view7_ex4_activity extends Activity implements
OnClickListener {
//注册控件
private EditText et_num, et_text;
private Button btn_num, btn_text, btn_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载布局
setContentView(R.layout.activity_view7_ex4);
init();
}
/**
* 初始化方法
*/
private void init() {
et_num = (EditText) findViewById(R.id.et_view7_ex4_num);
et_text = (EditText) findViewById(R.id.et_view7_ex4_text);
btn_num = (Button) findViewById(R.id.btn_view7_ex4_num);
btn_text = (Button) findViewById(R.id.btn_view7_ex4_text);
btn_send = (Button) findViewById(R.id.btn_view7_ex4_send);
//注册事件监听
btn_num.setOnClickListener(this);
btn_text.setOnClickListener(this);
btn_send.setOnClickListener(this);
}
/**
* 实现按钮事件监听
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_view7_ex4_num://页面跳转,获取联系人
Intent num = new Intent(Intent.ACTION_PICK);
num.setType("vnd.android.cursor.dir/contact");
startActivityForResult(num, 0);
break;
case R.id.btn_view7_ex4_text://页面跳转,获取短信内容
Intent text = new Intent();
text.setClass(Exercise1_view7_ex4_activity.this, Exercise1_view7_ex4_msg_activity.class);
startActivityForResult(text, 1);
break;
case R.id.btn_view7_ex4_send://发送短信
if(et_num.getText().toString().trim().length()==0){
Toast.makeText(Exercise1_view7_ex4_activity.this, "电话号码不能为空", Toast.LENGTH_SHORT).show();
return;
}else if(et_text.getText().toString().trim().length()==0){
Log.i("test1", et_text.getText().toString().trim().length()+"");
//当短信内容为空时,弹出确认对话框
new AlertDialog.Builder(Exercise1_view7_ex4_activity.this)
.setTitle("确认对话框")
.setMessage("是否要发送空短信?")
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SmsManager sm=SmsManager.getDefault();
sm.sendTextMessage(et_num.getText().toString().trim(), null, " ", null, null);
insertMsgData(et_num.getText().toString().trim(), " ");
Toast.makeText(Exercise1_view7_ex4_activity.this, "短信发送中...请稍后到信箱查看", Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
return;
}
})
.show();
}else{
SmsManager sm=SmsManager.getDefault();
sm.sendTextMessage(et_num.getText().toString().trim(), null, et_text.getText().toString()+"", null, null);
insertMsgData(et_num.getText().toString().trim(), et_text.getText().toString());
Toast.makeText(Exercise1_view7_ex4_activity.this, "短信发送中...请稍后到信箱查看", Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
/**
* 将短信插入到数据库中的方法
* 所需权限
* <uses-permission android:name="android.permission.WRITE_SMS" />
* <uses-permission android:name="android.permission.READ_SMS" />
*/
private void insertMsgData(String tel,String msg) {
ContentValues values = new ContentValues();
// 发送时间
values.put("date", System.currentTimeMillis());
// 阅读状态
values.put("read", 0);
// 1为收 2为发
values.put("type", 2);
// 送达号码
values.put("address", tel);
// 送达内容
values.put("body", msg);
// 插入短信库
getContentResolver().insert(Uri.parse("content://sms/sent"), values);
}
/**
* intent跳转后接受到activity的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0://操作联系人
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String contactId = c.getString(c
.getColumnIndex(ContactsContract.Contacts._ID));
// String name = c
// .getString(c
// .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String hasPhone = c
.getString(c
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String phoneNumber = null;
if (hasPhone.equalsIgnoreCase("1"))
hasPhone = "true";
else
hasPhone = "false";
if (Boolean.parseBoolean(hasPhone)) {
Cursor phones = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + contactId, null, null);
while (phones.moveToNext()) {
phoneNumber = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
et_num.setText(phoneNumber);
}
phones.close();
}
}
}
break;
case 1://操作短信
if(resultCode==11){
String sms_body=data.getStringExtra("msg_body");
et_text.setText(sms_body);
}
break;
default:
break;
}
}
}
以上就是主要功能的代码,有相应的注释,大家应该可以明白。这里注意由于联系人是调用的系统主页面,而短信内容是调用自定义的Listview中的内容,因此还有ListView的具体设计。
短信封装实体类
package com.iotek.entity;
/**
* 短信封装实体类
*
* @author Lvjianwen
*
*/
public class SmsInfo {
/**
* 短信内容
*/
private String smsbody;
/**
* 发送短信的电话号码
*/
private String phoneNumber;
/**
* 发送短信的日期和时间
*/
private String date;
/**
* 发送短信人的姓名
*/
private String name;
/**
* 短信类型1是接收到的,2是已发出
*/
private String type;
public String getSmsbody() {
return smsbody;
}
public void setSmsbody(String smsbody) {
this.smsbody = smsbody;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
上面是对于短信的内容的封装。
获取短信方法类的封装
package com.iotek.entity;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
/**
* class description:获取手机中的各种短信信息<BR>
* PS: 需要权限 <uses-permission android:name="android.permission.READ_SMS" /><BR>
* Date:2012-3-19<BR>
*
* @version 1.00
*/
public class SmsContent {
private Activity activity;
private Uri uri;
List<SmsInfo> infos;
public SmsContent(Activity activity, Uri uri) {
infos = new ArrayList<SmsInfo>();
this.activity = activity;
this.uri = uri;
}
/**
* Role:获取短信的各种信息 <BR>
* Date:2012-3-19 <BR>
*
*/
public List<SmsInfo> getSmsInfo() {
String[] projection = new String[] { "_id", "address", "person",
"body", "date", "type" };
Cursor cusor = activity.managedQuery(uri, projection, null, null,
"date desc");
int nameColumn = cusor.getColumnIndex("person");
int phoneNumberColumn = cusor.getColumnIndex("address");
int smsbodyColumn = cusor.getColumnIndex("body");
int dateColumn = cusor.getColumnIndex("date");
int typeColumn = cusor.getColumnIndex("type");
if (cusor != null) {
while (cusor.moveToNext()) {
SmsInfo smsinfo = new SmsInfo();
smsinfo.setName(cusor.getString(nameColumn));
smsinfo.setDate(cusor.getString(dateColumn));
smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn));
smsinfo.setSmsbody(cusor.getString(smsbodyColumn));
smsinfo.setType(cusor.getString(typeColumn));
infos.add(smsinfo);
}
cusor.close();
}
return infos;
}
}
上面主要封装了如何获取方法的封装。有关于短信这块的内容参考了网上其他的博客,这里向这些博主们提出感谢。
其他功能的实现
这里除了发送短信的功能,还包括了一个人品测试的小程序,其界面如下:
这里主要应用了Intent传递数据的功能,在二级界面中,还应用了一个按两次返回键退出界面的功能。
主界面代码
package com.example.lvjianwen150504;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
* 第一题主界面
* @author Lvjianwen
*
*/
public class Exercise1_view7_ex3_activity extends Activity {
private EditText et;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view7_ex3);
init();
}
private void init(){
et=(EditText)findViewById(R.id.et_view7_ex3);
btn=(Button)findViewById(R.id.btn_view7_ex3);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(et.getText().toString().trim().length()==0){
Toast.makeText(Exercise1_view7_ex3_activity.this, "输入的名字不能为空!", Toast.LENGTH_SHORT).show();
}else{
String data=et.getText()+"";
Intent intent=new Intent();
intent.setClass(Exercise1_view7_ex3_activity.this, Exercise1_view7_ex3_item_activity.class);
intent.putExtra("name", data);
startActivity(intent);
}
}
});
}
}
二级页面代码
package com.example.lvjianwen150504;
import java.util.Random;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* 第一题二级页面
* @author Lvjianwen
*
*/
public class Exercise1_view7_ex3_item_activity extends Activity {
private TextView tv;
private ProgressBar pbar;
private Random random;
private long mExitTime=0;
// private Boolean flag=true;
private Intent data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view7_ex3_item);
init();
// flag=data.getBooleanExtra("data_flag", true);
}
private void init(){
random=new Random();
tv=(TextView)findViewById(R.id.tv_view7_ex3);
pbar=(ProgressBar)findViewById(R.id.pbar_view7_ex3);
data=getIntent();
String name=data.getStringExtra("name");
int temp=random.nextInt(101);
tv.setText(name+":您的RP值为:"+temp);
pbar.setProgress(temp);
}
/**
* 捕获按键的方法
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
if(System.currentTimeMillis()-mExitTime>2000){
Toast.makeText(Exercise1_view7_ex3_item_activity.this, "再按一次退出程序", Toast.LENGTH_LONG).show();
mExitTime=System.currentTimeMillis();
}else{
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onDestroy() {
super.onDestroy();
// Intent temp=new Intent();
// temp.setClass(Exercise1_view7_ex3_item_activity.this, Exercise1_view7_ex3_item_activity.class);
// if(flag){
// flag=false;
// temp.putExtra("data_flag", flag);
// Toast.makeText(Exercise1_view7_ex3_item_activity.this, "再按一次退出程序", Toast.LENGTH_LONG).show();
// startActivity(temp);
// }else{
// finish();
// System.exit(0);
// }
}
}
这里的功能比较简单,就不在具体论述,以上就是本功能代码的主要实现。
这是本人第一次写博客,在安卓软件领域目前输入菜鸟级别,有什么不足的地方请大家多多指教
想要源代码的可以到下面的链接自行下载
短信助手源代码下载链接