在程序中发送短信,并写入短信数据库

效果如下:

 

我们经常在应用中有这样的需要:发送短信邀请其他人使用。当然,你可以调用系统发送短信的界面,也可以在自己的应用程序中进行发送,并写入短信数据库(如果不写,那么发送短信后,短信数据库中是没有记录的)。今天我们就来看看如何实现。

 

下面直接上代码:

/**
 * This demo shows how to send message in self application.
 * 
 * 这个demo展示了如何在自己的程序中发送短信
 * 
 *	参考:http://stackoverflow.com/questions/8447735/android-sms-type-constants
 *	MESSAGE_TYPE_ALL    = 0;//发送(和2一个效果)
 *	MESSAGE_TYPE_INBOX  = 1;//接收
 *	MESSAGE_TYPE_SENT   = 2;//发送
 *	MESSAGE_TYPE_DRAFT  = 3;//存在草稿箱中
 *	MESSAGE_TYPE_OUTBOX = 4;//待发箱(和发送中一个效果)
 *	MESSAGE_TYPE_FAILED = 5; // for failed outgoing messages发送失败
 *	MESSAGE_TYPE_QUEUED = 6; // for messages to send later//发送中
 * 
 *  ContentValues values = new ContentValues();
 *  values.put("address", "13023895555");
 *  values.put("body", "short message content");
 *  values.put("date", "1322039220502");
 *  values.put("type", "1");
 *  values.put("status", "-1");
 *  values.put("read", "1");
 *  values.put("protocol", "0");
 *  getContentResolver().insert(Uri.parse("content://sms"), values);
 * 
 * 
 * @author MichaelYe
 * @since 2012-8-30
 * 
 * */
public class MainActivity extends Activity 
{

	private EditText etNumber;
	private EditText etSmsContent;
	private Button btnSend;
	private Button btnCancel;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etNumber = (EditText)findViewById(R.id.et_number);
        etSmsContent = (EditText)findViewById(R.id.et_sms_content);
        btnSend = (Button)findViewById(R.id.btn_send);
        btnCancel = (Button)findViewById(R.id.btn_cancel);
        
        btnSend.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {

				String phoneNumber = etNumber.getText().toString().trim();
				if(phoneNumber.equals(""))
				{
					Toast.makeText(MainActivity.this, "Number can not be empty!", Toast.LENGTH_SHORT).show();
					return;
				}
				else
				{
					String smsContent = etSmsContent.getText().toString().trim();
					sendSms(phoneNumber, smsContent);
					writeToDataBase(phoneNumber, smsContent);
				}
			}
		});
        btnCancel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				finish();
			}
		});
    }

    /**
     * send sms
     * 
     * 发送短信
     * 
     * */
    private void sendSms(String phoneNumber, String smsContent)
    {
        
        //当文本超过限定字符长度的时候(中文70,英文160),在2.2中会nullpoint,4.1.1中发送无效
        //SmsManager smsManager = SmsManager.getDefault();
        //smsManager.sendTextMessage(phoneNumber, null, smsContent, null, null);
          
        //改为sendMultipartTextMessage()
        ArrayList<String> messageArray = smsManager.divideMessage(smsContent);
    	smsManager.sendMultipartTextMessage(phoneNumber, null, messageArray, null, null);

        Toast.makeText(this, "Send Success", Toast.LENGTH_LONG).show();
    }
    
    /**
     * write to database
     * 
     * 写入数据库
     * 
     * */
    private void writeToDataBase(String phoneNumber, String smsContent)
    {
    	ContentValues values = new ContentValues();
        values.put("address", phoneNumber);
        values.put("body", smsContent);
        values.put("type", "2");
        values.put("read", "1");//"1"means has read ,1表示已读
        getContentResolver().insert(Uri.parse("content://sms/inbox"), values);
    }

}

 

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <EditText
        android:id="@+id/et_number"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/number_hint"
        android:inputType="number"
        android:paddingLeft="20dip"
        android:paddingRight="20dip" />

    <EditText
        android:id="@+id/et_sms_content"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_number"
        android:hint="@string/sms_hint"
        android:paddingLeft="20dip"
        android:paddingRight="20dip" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_sms_content"
        android:orientation="horizontal"
        android:paddingLeft="20dip"
        android:paddingRight="20dip" >

        <Button
            android:id="@+id/btn_send"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingLeft="5dip"
            android:paddingRight="5dip"
            android:text="@string/btn_send" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingLeft="5dip"
            android:paddingRight="5dip"
            android:text="@string/btn_cancel" />
    </LinearLayout>

</RelativeLayout>

 

注意权限:

	<uses-permission android:name="android.permission.SEND_SMS"/>
	<uses-permission android:name="android.permission.WRITE_SMS"/>
	<uses-permission android:name="android.permission.READ_SMS"/>

 

注意:测试的时候可以新建两个模拟器测试下,模拟器左上角的端口号就是电话号码。比如:5554

 

工程下载地址:

https://github.com/michaelye/DemoSendSms

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移动飞信代发服务数据库编程接口说明 移动飞信代发服务接口使用数据库记录查询方式实现,支持MS SQL及Access数据库,只用到一个FetionTb表进行交换,运行之前请先创建好FetionTb表,然后配置SYSSET.INI文件的"数据库类型"及"连接字符串"。 一、FetionTb表结构字段含意如下: id字段(自动编号):主键,标识不同的命令记录 Com字段(字符型,长20):命令字符串,支持四个命令是"发送短信"、"添加好友"、"好友列表"、"接收短信" myMNo字段(字符型,长20):发送短信手机的号码 myMPass字段(字符型,长30):发送短信手机的飞信密码 toMNo字段(字符型,长250):接收短信手机的号码,多个接收号码可以用逗号","分开 (是飞信好友才会发送成功,当与发送手机号相同时就会发给自己了) Msg字段(字符型,长250):短信内容,不能超过移动短信要求的长度 reok字段(数字型):命令记录处理状态,有4个值表示,-1=正在处理,0=等待处理,1=处理完成,2=已经提取处理结果,10=收到的短信 retxt字段(备注型):处理完成后返回的信息 addTime字段(时间型):记录加入时间或最后处理时间 mtype字段(字符型,长20):可以是任意字符,客户程序可用来自行定义命令执行区分标志 二、客户程序发送流程: 1)客户程序将命令记录(如"发送短信")插入表(注意reok字段要等于0,retxt字段要为空) SQL语句例:INSERT FetionTb(Com,myMNo,myMPass,toMNo,Msg,reok,retxt,addTime,mtype) VALUES('发送短信','13700000008','888888','13600000088','你好!',0,'',getdate(),'1234') 2)客户程序定时查询执行结果,主要查reok字段是否变为1 SQL语句例:SELECT retxt from FetionTb where reok=1 and myMNo='13700000008' and toMNo='13600000088' and mtype='1234' 当结果不为空时说明记录执行完成 3)客户程序查到命令结果后,还要把reok字段改为2,以通知服务程序命令完成,可以删除此记录了 SQL语句例:UPDATE FetionTb SET reok=2 where reok<>0 and myMNo='13700000008' and toMNo='13600000088' and mtype='1234' 注:如果不修改reok字段改为2,服务程序也会在10分钟至1个半小时左右删除已经执行完成的记录,如要保存发送记录,请自行记录到别的表。 对于"添加好友"命令,Msg字段可以为空串;"好友列表"命令toMNo字段与Msg字段可以为空串 三、好友列表返回结果说明:好友之间以逗号","分开,每个好友又以"|"分开名称与手机号码,客户程序可以把字符串处理分割成列表。 例如:"张三|13788888881,李四|1360000002" 四、接收短信说明:“接收短信”是服务程序收到的当前号码短信,reok字段为10,用户以这个为条件查收短信,查收后请把reok字段改为2,或直接删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值