1、Intent简介

  Android组价之间的通信,由Intent来协助完成。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

  Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。分别通过startActivity();startService();startBroadcasts();来执行操作。

  在使用Android的电话功能的时候,我们需要调用Intent的相关功能来实现拨打电话和收发短信。

2、URI

  URI是统一资源标识符(Uniform Resource Identifier)的缩写。是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。在Android中URI的意义非常重大,他是所有资源的标示符(ID),通过URI可找到一个对应的具体实体,如文件(file),数据库的表项(content)等,可以说贯穿整个Framework。 
  URI一般的格式为:[scheme:]schemeSpecificPart[#fragment]  ([...]表示可选)

3、拨打电话

  直接拨打电话需要添加android.permission.CALL_PHONE权限,在AndroidManifest.xml中添加如下代码:

<uses-permission android:name="android.permission.CALL_PHONE"/>

  完整代码为:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.doodle.button" > <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> <uses-permission android:name="android.permission.CALL_PHONE"/> </manifest>

AndroidManifest.xml

  然后,我们实例化一个Uri,其内容为要拨打电话的命令。电话号码通过TextView获得。然后我们实例化一个Intent,设置Intent的行为为“直接拨打电话”,Intent的数据为“拨打XXX电话命令”。

      Uri uri = Uri.parse("tel:" + tvPhone.getText());
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(uri);

  然后为拨打电话按钮添加此单击事件即可

        btnDriect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("tel:" + tvPhone.getText());
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(uri);
startActivity(intent);
}
});

  同理,我们可以通过Intent来启动系统自带的拨号器。启动系统自带的拨号器是不需要android.permission.CALL_PHONE权限的。

         btnSystem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Uri uri = Uri.parse("tel:" + tvPhone.getText());
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
}
});

4、发送短信

  同拨打电话一样,发送短信同样需要相应的权限。

<uses-permission android:name="android.permission.SEND_SMS"/>

  不同的是,我们在发送短信的时候是通过SmsManager来完成发送的。首先我们要实例化一个SmsManager。通过SmsManager.sendTextMessage()方法可以进行短信发送。其原型为:

 sendTextMessage(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent);
// destAddress 发送短信的地址(也就是号码)
// scAddress 短信服务中心,如果为null,就是用当前默认的短信服务中心
// text 短信内容
// sentIntent 如果不为null,当短信发送成功或者失败时,这个PendingIntent会被广播出去成功的结果代码是Activity.RESULT_OK
// deliveryIntent 如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播,状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")

  这里我们需要实例化一个PendingIntent来协助SMSManger的工作。

SmsManager smsManager = SmsManager.getDefault();
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(), 0);
smsManager.sendTextMessage(strAddr, null, strCont, pendingIntent, null);
        btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String strAddr = etPhone.getText().toString();
String strCont = etContent.getText().toString(); if (strAddr.equals("")) {
Toast.makeText(MainActivity.this, "收件人不能为空", Toast.LENGTH_SHORT).show();
}
if (strCont.equals("")) {
Toast.makeText(MainActivity.this, "短信内容不能为空", Toast.LENGTH_SHORT).show();
} SmsManager smsManager = SmsManager.getDefault();
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(), 0);
smsManager.sendTextMessage(strAddr, null, strCont, pendingIntent, null);
Toast.makeText(MainActivity.this, "短信发送成功",Toast.LENGTH_LONG).show();
}
});

  完整代码为:

 import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private EditText etPhone;
private EditText etContent;
private Button btnSend; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etPhone = (EditText) findViewById(R.id.etPhone);
etContent = (EditText) findViewById(R.id.etContent);
btnSend = (Button) findViewById(R.id.btnSend); btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String strAddr = etPhone.getText().toString();
String strCont = etContent.getText().toString(); if (strAddr.equals("")) {
Toast.makeText(MainActivity.this, "收件人不能为空", Toast.LENGTH_SHORT).show();
}
if (strCont.equals("")) {
Toast.makeText(MainActivity.this, "短信内容不能为空", Toast.LENGTH_SHORT).show();
} SmsManager smsManager = SmsManager.getDefault();
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(), 0);
smsManager.sendTextMessage(strAddr, null, strCont, pendingIntent, null);
Toast.makeText(MainActivity.this, "短信发送成功",Toast.LENGTH_LONG).show();
}
});
}
}

MainActivity.java

5、接收短信

  同拨打电话一样,发送短信同样需要相应的权限。接收短信需要

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

  接收短信的原理是,首先新建一个BroadcastReceiver来监听短信信息,然后根据监听到的广播信息中的短信进行捕捉,然后呈现出来。

  首先,新建一个Receiver类,然后重载其onReceive方法。

 public class Receiver extends BroadcastReceiver {

     @Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { }
}
}

  然后,我们新建一个Budle来接收信息,我们知道,短信信息的关键字为"pdus",所以通过一个Object[]来接收此信息,然后再将其转化为SmsMessage即可。

  由于接收到的短信由于长度原因,可能被分割成若干条信息,所以,我们通过一个for循环来处理此短信。

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
StringBuilder str = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage m : msg) {
str.append("发件人:");
str.append(m.getDisplayOriginatingAddress());
str.append("\n内容:");
str.append(m.getDisplayMessageBody());
}
Toast.makeText(context, "收到消息:\n" + str, Toast.LENGTH_LONG);
}
}

  最后在AndroidManifest.xml中处理一下新建的Receiver类即可。

  完整代码:

AndroidMainfest.xml

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.doodle.button" > <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
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=".Receiver" android:enabled="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver> </application> <uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/> </manifest>

MainActivity.java

 import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); }
}

Receiver.java

 import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast; public class Receiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
StringBuilder str = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage m : msg) {
str.append("发件人:");
str.append(m.getDisplayOriginatingAddress());
str.append("\n内容:");
str.append(m.getDisplayMessageBody());
}
Toast.makeText(context, "收到消息:\n" + str, Toast.LENGTH_LONG);
}
}
}
}

Android开发手记(15) 拨打电话和收发短信的更多相关文章

  1. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  2. 脚本控制向Android模拟拨打电话,发送短信,定位设置功能

    做行为触发的时候要向模拟器实现拨打电话,发送短信,定位设置的的功能,可以很方便通过telnet localhost  5554实现. 写个脚本很快的搞定了.网上资料很多,脚本的很少,也所积点德啦. 写 ...

  3. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先先给大家看一下最终实现的效果: ...

  4. Android 打开URL中的网页和拨打电话、发送短信功能

    拨打电话需要的权限 <uses-permission android:name="android.permission.CALL_PHONE"/> 为了省事界面都写一起 ...

  5. Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信

    场景 点击拨打电话按钮,跳转到拨打电话页面 点击发送短信按钮,跳转到发送短信页面 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程 ...

  6. ios调用本地拨打电话,发送短信

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话   [[UIApplication sharedApplicat ...

  7. a标签的妙用-拨打电话、发送短信、发送邮件

    前端时间在做手机WAP网站时,遇到需要点击页面上显示的电话号能直接拨号的需求,查找资料发现可以使用html的a标签完美实现该需求!记录下来以备后用...... 目前主流手机浏览器对H5的支持已经很不错 ...

  8. a标签拨打电话、发短信、发邮件

    1.<a href=”tel:xxxx”>拨打电话</a> 2.<a href=”sms:xxxx”>发短信</a> 3.<a href=”mai ...

  9. 如何让HTML在手机上实现直接拨打电话以及发送短信?

    拨打电话的HTML实现方式: <a href="tel:134289210xx″>拨打电话</a> 上面是比较常用的方式,但是有可能在某些场景下是支持不太好,可以试用 ...

随机推荐

  1. 运用MyEclipse插件(link方式注意点)

    Windows7 中 MyEclipse 安装位置下,有以下两个目录: MyEclipse 10 Common 注意点一 Common 下的子目录是 plugins 和 features : 而在 M ...

  2. SHELL要发送HTML这类邮件的话,还得靠msmtp 和 mutt

    参考蛮多的.. http://storysky.blog.51cto.com/628458/293005 http://www.wilf.cn/post/centos-mutt-msmtp-setup ...

  3. 15.禁用ViewState

    默认情况下ASP.net是启用ViewState的,这样在页面中会生成冗长的隐藏字段,ViewState对于需要PostBack处理的页面才可能有用,对于不需要交互的页面则完全没有必要用ViewSta ...

  4. Gvim自动编译运行c++11的程序

    gcc中对c++11的支持是默认不开启的,要想在实现对其的成功编译,需要添加参数-std=c++11: g++ -o test.exe test.cpp g++ -o test.exe test.cp ...

  5. hdu-4612-Warm up(边双连通分量--有重边)

    题意:有N 个点,M条边,加一条边,求割边最少.(有重边) 分析:先求双连通分量,缩点形成一个生成树,然后求这个的直径,割边-直径即是答案 因为有的图上可能有重边,这样不好处理.我们记录每条边的标号( ...

  6. 1B. Spreadsheets

    题目大意: 行和列的两种方式. A是1, B是2,....Z是26, AA是27, AB是28........... 如: BC23代表55列23行 还有一种表示方法:R23C55, 代表23行,55 ...

  7. 修改MySQL的递增的起始值

    在mysql中,有时候需要把递增的值初始化为1(你也可以修改成其它起始值): alter table table_name auto_increment=; 不要设置为0......

  8. 在Apache+php中使用json来通讯

    示例代码: <?php // 获取输入的内容 $request = http_get_request_body(); // 按json格式解析成一个 php对象 $json_obj = json ...

  9. DNA repair - HDU 2457(自动机+dp)

    题目大意:给你N个DNA的串,也就是至包含'A','T','G','C'四种碱基的,这些给定的串都是带有遗传病的,然后给你一个不会超过1000的串,问你至少几个地方才能让这个串不包含遗传病,如果不论怎 ...

  10. hibernate两表连接查询

    1.两表的关联关系为一对一 2.库存表Stock与商品信息表Product 3.库存表查询商品表里的商品名称,商品编号 库存表字段:    private String id;    private ...