android 发短信、打电话、发邮件
短信
1.发送短信
需要权限 android.permission.SEND_SMS
使用android.telephony.SmsManager类
普遍使用的方式
private void sendSmsMessage(String address,String message)throws Exception { SmsManager smsMgr = SmsManager.getDefault(); Intent sent = new Intent(); sent.setAction("com.send"); PendingIntent sentIntent = PendingIntent.getBroadcast(this, 0, sent, 0); Intent delivery = new Intent(); delivery.setAction("com.delivery"); PendingIntent deliveryIntent = PendingIntent.getBroadcast(this, 0, delivery , 0); smsMgr.sendTextMessage(address, null, message, sentIntent, deliveryIntent); } BroadcastReceiver send = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if("com.send".equals(intent.getAction()))Toast.makeText(TelephonyDemo.this, "SMS send success", Toast.LENGTH_LONG).show();}}; BroadcastReceiver delivery = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if("com.delivery".equals(intent.getAction()))Toast.makeText(TelephonyDemo.this, "SMS delivery success", Toast.LENGTH_LONG).show();}};
另两种方式
sendDataMessage()接受一个附加参数以指定一个端口号,还会接受一个字节数组(不是一个String 消息)。
sendMultipartTextMessage()支持在整条消息大于SMS规范所允许的大小时发送文本消息。
SmsManager类提供了divideMessage()方法来帮助将较长的消息拆分为多个部分。
2.监视传入的SMS消息
需要权限:android.permission.RECEIVE_SMS
当设备收到SMS消息时,android会发出广播。该广播的action是android.provider.Telephony.SMS_RECEIVED
该action在文档上找不到,在源码的android.provider包下能找到Telephony类,其中有这么个action,同时有参数说明
/** * Broadcast Action: A new text based SMS message has been received * by the device. The intent will have the following extra * values:</p> * * <ul> * <li><em>pdus</em> - An Object[] od byte[]s containing the PDUs * that make up the message.</li> * </ul> * * <p>The extra values can be extracted using * {@link #getMessagesFromIntent(Intent)}.</p> * * <p>If a BroadcastReceiver encounters an error while processing * this intent it should set the result code appropriately.</p> */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
具体实现
<receiver android:name="MySMSMonitor"><intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver>public class MySMSMonitor extends BroadcastReceiver {private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";@Override public void onReceive(Context context, Intent intent) {if(intent!=null && intent.getAction()!=null && ACTION.compareToIgnoreCase(intent.getAction())==0) { Object[]pduArray = (Object[]) intent.getExtras().get("pdus"); SmsMessage[] messages = new SmsMessage[pduArray.length]; for (int i = 0; i<pduArray.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[])pduArray [i]); Log.d("MySMSMonitor", "From: " + messages[i].getOriginatingAddress()); Log.d("MySMSMonitor", "Msg: " + messages[i].getMessageBody()); } Log.d("MySMSMonitor","SMS Message Received."); }}}
访问SMS文件夹
需要权限 android.permission.READ_SMS
要读取SMS消息,必须对SMS收件箱进行查询。如下所示
public class SMSInboxDemo extends ListActivity { private ListAdapter adapter; private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox"); @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); Cursor c = getContentResolver() .query(SMS_INBOX, null, null, null, null); startManagingCursor(c); String[] columns = new String[] { "body" }; int[] names = new int[] { R.id.row }; adapter = new SimpleCursorAdapter(this, R.layout.sms_inbox, c, columns, names); setListAdapter(adapter); }}
以下是完整的SMS文件夹列表和每个文件夹的URI
所有文件夹 content://sms/all
收件箱 content://sms/inbox
已发送 content://sms/sent
草稿 content://sms/draft
发件箱 content://sms/outbox
发送失败 content://sms/failed
排队消息 content://sms/queued
未送达 content://sms/undelivered
对话 content://sms/conversations
发送电子邮件
android没有提供API来发送电子邮件,必须使用已注册的电子邮件应用程序。可以使用ACTION_SEND来启动电子邮件应用程序
Intent emailIntent=new Intent(Intent.ACTION_SEND); String subject = "Hi!"; String body = "hello from android...."; String[] extra = new String[]{"aaa@bbb.com"}; emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(Intent.EXTRA_TEXT, body);emailIntent.putExtra(Intent.EXTRA_EMAIL, extra); emailIntent.setType("message/rfc822"); startActivity(emailIntent);
可以向电子邮件Intent添加的其他"extra"消息包括EXTRA_CC(抄送)、EXTRA_BCC(密送)。如果希望在邮件中发送电子邮件附件。可以使用以下代码。
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(new File(myFileName)));
打电话
播出电话的最简单方法是使用以下代码
Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678911"));startActivity(intent);
这段代码需要android.permission.CALL_PHONE权限。如果没有此权限,可以将Intent的操作更改为Intent.ACTION_VIEW.这会导致Dialer应用程序显示要拨打的目标号码,用户需要按下Send按钮才能开始呼叫。
监听电话状态
监听电话状态最简单的办法是在"android.intent.action.PHONE_STATE"上实现一个广播接收程序。可采用与上面监听传入的SMS消息相同的方式。
该action可以在文档中找到
http://developer.android.com/reference/android/telephony/TelephonyManager.html#ACTION_PHONE_STATE_CHANGED
另一种方式是使用TelephonyManager
private TelephonyManager teleMgr = null; private MyPhoneStateListener myListener = null;@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); teleMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); myListener = new MyPhoneStateListener(); } @Override public void onResume() { super.onResume(); Log.d("PhoneCallDemo", "In onResume"); teleMgr.listen(myListener, PhoneStateListener.LISTEN_CALL_STATE); } @Override public void onPause() { super.onPause(); Log.d("PhoneCallDemo", "In onPause"); teleMgr.listen(myListener, PhoneStateListener.LISTEN_NONE); }public class MyPhoneStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch(state) { case TelephonyManager.CALL_STATE_IDLE: logText = "call state idle...incoming number is["+ incomingNumber+"]\n" + logText; break; case TelephonyManager.CALL_STATE_RINGING: logText = "call state ringing...incoming number is["+ incomingNumber+"]\n" + logText; break; case TelephonyManager.CALL_STATE_OFFHOOK: logText = "call state Offhook...incoming number is["+ incomingNumber+"]\n" + logText; break; default: logText = "call state ["+state+"]incoming number is["+ incomingNumber+"]\n" + logText; break; } print(logText); } }
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
更多相关文章
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android(安卓)给 app默认权限(不弹窗申请权限)
- Android开发之消息处理机制(一)——Handler
- Titanium 使用刘明星的Jpush module做android端的消息推送
- android获取经纬度和地方名称
- android学习轨迹之二:Android权限标签uses-permission的书写位置
- android 仿写 screen lock
- android > 建立WIFI 热点