本文主要介绍打电话 发短信 收短信 的基本方法。以及BroadcastReceiver的用法。
以下功能需要添加如下权限:
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
一、打电话功能比较简单:
Button bt1 = (Button) findViewById(R.id.Button01);
bt1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));
startActivity(intent);
}
});
二、短信相关
1、静态的BroadcastReceiver 。编写一个收短信的BroadcastReciever。
第一步,写activity主界面。
不做任何事情,就是把activity保存下来。写了个回调 设置标题,以看效果。
public class Levy_test1Activity extends MasterActivity {
private static Levy_test1Activity ac01 = null;
public static Levy_test1Activity getapp(){
return ac01;
}
public void call_back(){
setTitle("received");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ac01 = this;
SetContentView(R.layout.main);
}
}
第二步,实现一个recevier.
静态的BroadcastReceiver要求写一个继承此类的类:最简单的情况,收到短信就改下title
package com.alibaba.levy_test1;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class myreceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Levy_test1Activity app = Levy_test1Activity.getapp();
app.call_back();
}
}
第三步,在manifast文件中注册权限和recevier
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Levy_test1Activity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="myreceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
2、动态的方法,效果同上。
直接在程序中建立receiver
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Levy_test1Activity app = Levy_test1Activity.getapp();app.call_back();
}
}
};
然后注册:
registerReceiver(myReceiver,new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));
以上是以系统短信为例,当然自己可以定义action,发送和接收消息处理。
3、发送短信和接收短信的相关函数:
SmsManager是用于短信处理的类,下文举例说明使用说法。
private void sendSMS(String phoneNumber, String message) {
// ---sends an SMS message to another device---
SmsManager sms = SmsManager.getDefault();
if (message.length() > 70) {
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, null, null);
}
} else {
sms.sendTextMessage(phoneNumber, null, message, null, null);
}
Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show();
}
上面sendTextMessage第4、5参数为空。如果需要处理短信发送后续状态的话,需要设置第4个参数,如果还需要发送送达对方手机的状态,还需要第5个参数。
这两个参数的类型是PendingIntent,表明满足条件时会执行intent广播。
以下是修改后的发送短信示例:
private void sendSMS(String phoneNumber, String message) {
SmsManager sms = SmsManager.getDefault();
String SENT_SMS_ACTION = "SENT_SMS_ACTION";
String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT_SMS_ACTION),0);
PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,new Intent(DELIVERED_SMS_ACTION), 0);
if (message.length() > 70) {
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, sentPI, deliverPI);
}
} else {
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
}
}
你可以采用前两节说的静态的方法建立相应action的BroadcastReceiver,也可以用代码注册,以下是一个例子:
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(),
"SMS sent success actions", Toast.LENGTH_SHORT)
.show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(),
"SMS generic failure actions", Toast.LENGTH_SHORT)
.show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast
.makeText(getBaseContext(),
"SMS radio off failure actions",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(),
"SMS null PDU failure actions", Toast.LENGTH_SHORT)
.show();
break;
}
}
}, new IntentFilter(SENT_SMS_ACTION));
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context _context, Intent _intent) {
Toast.makeText(getBaseContext(), "SMS delivered actions",
Toast.LENGTH_SHORT).show();
}
}, new IntentFilter(DELIVERED_SMS_ACTION));