在模拟器上实现打电话和发短信,另外还可以在命令行下或者可以利用Eclipse的ADT插件的Emulator control实现,具体方法去如下。
命令行:
假设你现在开启的模拟器的端口号(模拟器的标题栏上有)为5554。
1.打开命令行,输入telnet localhost 5554回车后,会有如下提示,说明你已经连接5554端口成功。
Android Console: type ‘help’ for a list of commands
OK
2.再输入gsm call 123456回车,即表示拨打电话号码123456,稍后会看到模拟器上正在拨打电话的界面。
Emulator control:
在Eclipse中选择windows->show view->other->Android->Emulator Control打开Emulator Control面板。
在Telephony Actions中先输入将要拨打的电话号码,然后选择Voice或者SMS(如果这边开启的模拟器端口号是5554,我们输入5554),点击Call即可实现拨打电话,模拟器上会显示来电界面。
下面进入正题,我们通过程序的方式来模拟打电话和发短信的功能。源码下载地址
1.首先创建一个VoiceActivity和使用的布局文件main.xml,可以选择打电话或者发短信,如果打电话则直接拨打,如果是发短信则跳转到SMSActivity,代码如下。
VoiceActivity:
public class VoiceActivity extends Activity { private EditText inputEditText; private Button voiceBtn; private Button smsBtn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); inputEditText = (EditText) findViewById(R.id.inputnumedittext); voiceBtn = (Button) findViewById(R.id.voicebtn); smsBtn = (Button) findViewById(R.id.smsbtn); // Voice按钮的响应 voiceBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String phoneNum = inputEditText.getText().toString(); //判断输入是否为空 if (phoneNum == null || "".equals(phoneNum)) { Toast.makeText(VoiceActivity.this, "Please input PhoneNum!", Toast.LENGTH_SHORT) .show(); return; } // 直接连接打电话 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNum)); startActivity(intent); } }); // SMS按钮的响应 smsBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String phoneNum = inputEditText.getText().toString(); if (phoneNum == null || "".equals(phoneNum)) { Toast.makeText(VoiceActivity.this, "Please input PhoneNum!", Toast.LENGTH_SHORT) .show(); return; } // 直接连接打电话 Intent intent = new Intent(); intent.setClass(VoiceActivity.this, SMSActivity.class); // 绑定电话号码数据传递到SMSActivity中 Bundle mBundle = new Bundle(); mBundle.putString("phoneNum", phoneNum); intent.putExtras(mBundle); startActivity(intent); } }); } }
main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/inputprompt" /> <EditText android:id="@+id/inputnumedittext" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/voicebtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/voice" /> <Button android:id="@+id/smsbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/sms" /> </LinearLayout> </LinearLayout>
2. 下面为发短信的SMSActivity和布局文件sms.xml,代码如下。
SMSActivity:
public class SMSActivity extends Activity { private EditText messageEditText; private Button sendBtn; private Button clearBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sms); messageEditText = (EditText) findViewById(R.id.messageedittext); sendBtn = (Button) findViewById(R.id.sendbtn); clearBtn = (Button) findViewById(R.id.clearbtn); sendBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 接收电话号码数据 Bundle bundle = getIntent().getExtras(); String phoneNum = bundle.getString("phoneNum"); // 获取发送的内容 String message = messageEditText.getText().toString(); if (phoneNum == null || "".equals(phoneNum)) { Toast.makeText(SMSActivity.this, "Please input SMS Content!", Toast.LENGTH_SHORT) .show(); return; } // 发送短信 sendSMS(phoneNum, message); } }); // 置空message输入框 clearBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { messageEditText.setText(""); } }); } private void sendSMS(String phoneNum, String message) { //初始化发短信SmsManager类 SmsManager smsManager = SmsManager.getDefault(); PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, VoiceActivity.class), 0); //如果短信内容长度超过70则分为若干条发 if (message.length() > 70) { ArrayList<String> msgs = smsManager.divideMessage(message); for (String msg : msgs) { smsManager.sendTextMessage(phoneNum, null, msg, pi, null); } } else { smsManager.sendTextMessage(phoneNum, null, message, pi, null); } Toast.makeText(this, "Send Message Success!", Toast.LENGTH_SHORT) .show(); } }
sms.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/inputmessage" /> <EditText android:id="@+id/messageedittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:minLines="3" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/sendbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/send" /> <Button android:id="@+id/clearbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clear" /> </LinearLayout> </LinearLayout>
3.这里在附上AndroidManifest.xml和strings.xml文件代码:
AndroidManifest.xml:(需要注意的是一定要把打电话和发短信的权限加入)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.byread" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".VoiceActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SMSActivity"> </activity> </application> <uses-sdk android:minSdkVersion="4"/> <!-- 注意:这里需要给工程添加打电话和发短信的权限 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.SEND_SMS" /> </manifest>
strings.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Android Voice</string> <string name="inputprompt">Please input PhoneNum:</string> <string name="inputmessage">Please input SMS Content:</string> <string name="voice">Voice</string> <string name="sms">SMS</string> <string name="send">Send</string> <string name="clear">Clear</string> </resources>
4.大功告成,如果你开启两个模拟器的话,比如一个端口号是5554,一个是5556,运行工程是在5556端口号模拟器中,在电话号码输入框中输入5554,点击拨打或者发短信后,5554模拟器就会接收到来电请求或者短信。