全部博文(436)
分类: LINUX
2011-04-06 15:32:58
第五次报告
研究题目:Android手机游戏开发
小组成员:李安 李想
本周计划:3.31--4.6
本周我们要对android的交互式通信服务与手机控件进行了解。交互式通信服务就是上下行同时进行的。在界面输入电话号码或是一些文字,单击确认后,会自动打开对应事件的程序,在另一个界面中显示,达到交互式通信的目的。
①. 拨打电话②.自制发送短信程序
实验内容:
一.拨打电话---Intent.ACTION.CALL的使用o
设计一个让用户输入电话号码的EditText,通过一个Button来实现拨打电话的练习,为了避免用户输入非电话号码的字符,在拨出电话前,通过自定义的isPhoneNumberValid()方法以及Toast信息来提示用户。
拨打电话的关键有两个方面:1)要在AndroidManifest中添加uses-permission,并声明Android:name="Android.permission.CALL_PHONE"使用权限。由于拨打电话属于手机底层的服务,与用户隐私及通话费用等议题息息相关,因此,程序必须取得相关权限。2)通过自定义Intent对象,带入"ACTION_CALL"这个关键,以及通过Uri.parse()的方法将用户输入的电话号码带入,最后以startActivity()方法,即可完成通过程序直接拨打电话的工作。
可接受的电话格式有: * ^\\(? :
可以使用 "(" 作为开头 * (\\d{3}): 紧接着三个数字 * \\)? :
可以使用")"接续 * [- ]? : 在上述格式后可以使用具选择性的 "-". * (\\d{3}) :
再紧接着三个数字 * [- ]? : 可以使用具选择性的 "-" 接续. * (\\d{4})$:
以四个数字结束. * 可以比对下列数字格式:
(123)456-7890, 123-456-7890, 1234567890, (123)-456-7890
需要预加载android.net.Uri、java.util.regex.Matcher、java.util.regex.Pattern三个类。
通过Button对象监听onClick()事件来冲动拨打电话的程序
public class EX05_02 extends Activity
{
/*声明Button与EditText对象名称*/
private Button mButton1;
private EditText mEditText1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*透过findViewById建构子来建构EditText与Button对象*/
mEditText1 = (EditText) findViewById(R.id.myEditText1);
mButton1 = (Button) findViewById(R.id.myButton1);
mButton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
/*取得EditText中用户输入的字符串*/
String strInput = mEditText1.getText().toString(); if (isPhoneNumberValid(strInput)==true)
{
/*建构一个新的Intent并执行action.CALL的常数与透过Uri将字符串带入*/
Intent myIntentDial = new Intent("android.intent.action.CALL",Uri.parse("tel:"+strInput));
/*在startActivity()方法中带入自定义的Intent对象以执行拨打电话的工作*/
startActivity(myIntentDial); mEditText1.setText("");
}
else
{
mEditText1.setText("");
Toast.makeText( EX05_02.this, "输入的电话格式不符", Toast.LENGTH_LONG).show();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
}
/*检查字符串是否为电话号码的方法,并回传true or false的判断值*/
public static boolean isPhoneNumberValid(String phoneNumber)
{
boolean isValid = false;
String expression = "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$";
String expression2 ="^\\(?(\\d{2})\\)?[- ]?(\\d{4})[- ]?(\\d{4})$";
CharSequence inputStr = phoneNumber;
/*建立Pattern*/
Pattern pattern = Pattern.compile(expression);
/*将Pattern 以参数传入Matcher作Regular expression*/
Matcher matcher = pattern.matcher(inputStr);
/*建立Pattern2*/
Pattern pattern2 =Pattern.compile(expression2);
/*将Pattern2 以参数传入Matcher2作Regular expression*/
Matcher matcher2= pattern2.matcher(inputStr);
if(matcher.matches()||matcher2.matches())
{
isValid = true;
}
return isValid;
}
}
在中,添加一个拨打电话的权限,否则当单击按钮时,会发生错误。
运行结果:
可以进行后台两个电话的接打:
当拨打的电话含有英文的时候,会显示输入的电话格式不符:
二.自制发送短信程序---SmsManager 与PendingIntent对象
流程图:
运行结果:
发送短信界面 送出成功界面
电话号码格式错误界面
发送短信的关键程序是通过SmsManager对象的sendTextMessage()方法来完成,其中sendTextMessage()方法需传入5个值,依次是收件人地址(String)、发送地址(String)、正文(String)、发送服务(PendingIntent)与送达服务(PendingIntent),其中收件人与正文是不可为Null的两个参数。
主程序:1.声明变量、定义对象
在onCreat()中创建两个EditText控件与一个Button控件
2. 定义方法
(1)设置onClickLinstener()让用户做出反应
·单击EditText时,同时清除内容
·单击Button时送出短信,并通过isPhoneNumberValid()与iswithin70()这两个自定义的方法来检查收件人电话号码的正则表达式,以及短信正文的字数是否超过70个字符。
①格式正确无误,取得EditText控件的值,将输入内容当短信发送
关于try模块:
两个条件都检查通过的情况下,发送简讯
先建构一PendingIntent对象并使用getBroadcast()方法进行广播
将PendingIntent,电话,简讯文字等参数传入sendTextMessage()方法发送简讯
②电话格式与简讯文字不符合条件时,使用Toast告知用户检查
(2)检查字符串是否为电话号码的方法,并回传true or false的判断值
关于可接受的电话模式:
可接受的电话格式有: ^\\(? : 可以使用 "(" 作为开头
(\\d{2}): 紧接着两个数字
\\)? : 可以使用")"接续
[- ]? : 在上述格式后可以使用具选择性的 "-"
(\\d{4}) : 再紧接着四个数字
[- ]? : 可以使用具选择性的 "-" 接续
(\\d{4})$: 以四个数字结束
小结:
本范例使用到的PendingIntent对象,具有下列的特性:当接收到PendingIntent对象时,会进行broadcast的动作,就如同使用Context.sendBroadcast()方法一样,这也就是为什么在SmsManager.sendTextMessage()方法中需要传入PendingIntent作为传送服务的参数之一。
有一个问题就是,虽然成功实现了发出短信,但是只是通过运行程序的模拟器实现的,并不知道短信是否真的有送出,收件人是否真的受到。不知该如何测试呢?
下周计划:为我们前几周的试验做一下小结,并且进行一个九宫格的开发,我们会参照一些范例来做,并在这个的基础上,开发一些新的界面或者功能。
参考资料:
1.http://blog.csdn.net/chenzhp/archive/2009/10/25/4726910.aspx
2.CSDN社区-移动平台-Android
3.Android setContentView的应用
4. OnClickListener接口简介
5. Android基础教程(六)之------- 参数的传递(Bundle)
http://archive.cnblogs.com/a/1959784/