android 发短信、打电话、发邮件

标签: android 短信 打电话 | 发表时间:2012-02-29 15:03 | 作者:
出处:http://www.iteye.com

短信

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() {
		
		@Override
		public 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() {
			
			@Override
			public 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[]{"[email protected]"};
      
        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 短信 打电话] 推荐:

android 发短信、打电话、发邮件

- - ITeye博客
需要权限 android.permission.SEND_SMS. 使用android.telephony.SmsManager类. sendDataMessage()接受一个附加参数以指定一个端口号,还会接受一个字节数组(不是一个String 消息). sendMultipartTextMessage()支持在整条消息大于SMS规范所允许的大小时发送文本消息.

Android 短信发送

- - CSDN博客推荐文章
在AndroidMainfest.xml中应加入:. . 作者:h7870181 发表于2012-11-7 22:13:25 原文链接. 阅读:5 评论:0 查看评论.

android一个拨打电话的小程序

- We_Get - 博客园-首页原创精华区
1、获取权限,因为拨打电话属于低层服务,插入权限方式. 在AndroidMainfest.xml中间插入.     以下语句为添加拨打权限,因为拨打电话要用到底层的服务. 2、通过自定义的Intent对象带入"android.intent.action.CALL"这个关键的ACTION,以及通过Uri.parse()的方法把用户输入的电话号码带入,最后以startActivity()方法启动程序.

Android短信蠕虫XXshenqi分析

- - 极客范 - GeekFan.net
今天从余弦大大微博上看到了这款Android短信蠕虫的信息,于是自己下载了一款研究,看到网上很多报告的md5值不同,不知道是否是变种. 接下来就分析一下,这款病毒究竟做了些什么. 病毒分为两个部分,一个是XXshenqi.apk,另一个是com.android.Trogoogle.apk. 后者存在于前者解压文件下的assets目录中.

[Android]SMS Backup+ – 将短信同步备份到 Gmail | 小众软件 > Android

- Hexi - 小众软件
SMS Backup 是款 Android 手机上的备份短信应用,可将短信同步备份至 Gmail. 感谢 香灰堂 的推荐,SMS Backup+ 有中文界面. SMS Backup+ 能自动将手机的所有短信同步备份到 Gmail,(以邮件的格式,每个联系人一组对话)并建立一个标签,比如”SMS”,这个标签默认是存档(Archive)的,所以不会出现在收件箱,最大的优势在于可以搜索.

随机选择收件人——Android 短信门?

- nAODI - 爱范儿 · Beats of Bits
前两周可能很多人都在网上看到一个颇为搞笑的地下恋情曝光事件,无辜的记者和报社就这么莫名地被起诉了. 古人有云:若要人不知,除非己莫为. 这种狗血的事情不仅可能会因为记者随意扫街的镜头,也可能因为你拿在手里的 Android 手机. 根据 ZDNET 博客 Hardware 2.0 消息,Android  的文字短信息系统存在故障:在你发送短信时,它会将你的信息随机发送给错误的接收人.

免费短信和电话服务TextFree在Android上爆发

- licheng - 36氪
TextFree是由Pinger开发的一款手机应用,允许用户通过真实的手机号码免费收发手机短信,拨打免费电话. TextFree还推出了Android版客户端. Pinger CEO Greg Woock 称TextFree用户现在每月收发15亿条短信,拨打4500万分钟语音电话,目前已是全美十大运营商之一.

直接用 Chrome 扩展来回复 Android 手机上的短信

- Sinan - 谷奥——探寻谷歌的奥秘
标题已经说明一切了,没错,Android手机发短信怎么着也比用电脑键盘打字慢,尤其是没有实体键盘的纯触摸屏手机. 所以直接用电脑来回手机上的短信最方便了,尤其适合一上班或一回家就开电脑的挨踢人士. 下载DeskSMS for Android应用,并在自己的Android手机上安装. 下载DeskSMS for Chrome扩展,并在自己的Chrome浏览器上安装.

Android系统的阿基里斯之踵:伪造短信篇

- - FreeBuf.COM
‍‍ 导读:Android系统的日益强大,但Android平台的安全问题一直是其“阿基里斯之踵”. 据统计,2012 年有 79% 的恶意软件都寄生于 Andriod 之上,此数字比 2011 年更高出 12.3%. 相较之下,iOS 平台内的恶意软件仅占总量的 0.7%,继续成为最安全的移动系统.

苹果 iPhone 上无需注册不用加好友直接免费打电话发短信的应用:Viber(免费 App)

- HICU - 苹果fans-中文 Apple Blog
    苹果 iPhone 上不用电话费进行语音通话的途径很多,Facetime、Skype、QQ 等等,免费发文字信息的就更多了. 但这些 App 有个共同缺点:先要注册账号,再要添加好友,才能通话. 下面就介绍一个很神奇的免费 App:Viber,不用注册 — 电话号码就是账号;不用加好友 — 自动检查 iPhone 本机通讯录里的联系人是否安装了 Viber.