Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

在安卓APP中如何打电话和发送短信

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

在本教程中,你将了解Android Telephony和SMS API。你将学习如何从APP中拨打电话,以及如何监控电话和如何发送接收短信。

1.如何拨打电话

我将展示如何通过使用手机拨号APP或直接从APP来打电话。

创建一个新的Android Studio项目

启动Android Studio并创建一个名为MainActivity的空Activity的新项目  。

Android Studio create a new Activity screenshot

屏幕布局

现在,我们的布局将只有一个EditText控件和一个拨号按钮:

Emulator dial screen with phone number given

修改MainActivity

下面的代码块,创建 显示电话拨号器的ACTION_DIAL  intent。电话号码从telURI方案解析:  tel:XXXXXXXX。请注意,这里不需要任何权限:

如果运行APP并单击拨号按钮,你将被带到拨号界面,你可以在这里拨打号码。 你可以通过简单地修改ACTION_DIAL intent为ACTION_CALL来实际拨打电话  。这需要  android.permission.CALL_PHONE权限。

Emulator screen defualt phone dialer with the phone number

2.  监听电话事件

在本节中,我们将学习如何在Android系统中监控电话事件。手机可以处于三种状态:

  1. 空闲(未使用时)
  2. 振铃(有来电时)
  3. 摘机(接电话时)

添加权限

我们需要 READ_PHONE_STATE权限 才能监控电话状态。将其添加到AndroidManifest.xml中:

创建PhoneStateListener对象

我们创建一个PhoneStateListener 类的对象,然后重写它的  onCallStateChanged()方法(在IntelliJ中使用Control-O快捷键选择或搜索要重写的方法)。 我们将通过显示Toast来处理呼叫状态更改。请注意,当触发此方法时,我们还可以访问来电号码:

根据你的应用需求,你也可以重写下列方法之一:onCellInfoChanged()onCallForwardingIndicatorChanged(),  onCellLocationChanged(),或  onSignalStrengthChanged()

监听电话的状态

为了开始监听电话状态,我们需要在onCreate()方法中从系统服务获取并初始化TelephonyManager

onResume()方法中,我们可以使用TelephonyManager listen()方法进行监听,需要参数PhoneStateListener实例和静态LISTEN_CALL_STATE。我们通过传递LISTEN_NONE 给 listen()的第二个参数在onStop()方法中停止监听。

其他的手机监听选项还有:  LISTEN_CELL_LOCATION,   LISTEN_SIGNAL_STRENGTH,  LISTEN_CALL_FORWARDING_INDICATOR,和LISTEN_CELL_INFO

最后,运行APP,并确保有电话进来。

Emulator incoming call states

只有当APP处于前台时,此监听才会起作用。 为了在后台工作(当我们的APP没有运行时),我们需要创建一个BroadcastReceiver,这样即使APP没有运行,我们仍然可以监视电话状态。 根据你的应用需求,这可能是监听电话状态的更好方式了。我将在下一节中告诉你如何做到这一点。

请注意,我们只监听来电。为了我监听来电,我们需要额外的权限。要监听拨出电话,请在AndroidManifest.xml文件中包含以下行  。

如何使用模拟器拨打电话和发送短信

你可以使用你的模拟器来模拟通话或发送短信,但你需要进行一些设置。打开模拟器,单击右侧导航栏上的最后一个按钮打开扩展控件对话框,然后选择手机控制按钮。

Using emulator to make call and send SMS

3.  在后台监控拨打电话事件

创建BroadcastReceiver

就像上一节一样,我们需要创建一个事件监听器来监听电话状态的变化。 不同的是,这次我们将继承 BroadcastReceiver基类,所以即使APP没有运行,我们也可以收听电话状态。 确保不要多次注册监听!检查第36行。

修改 AndroidManifest.xml

广播接收者只有在注册后才工作。我们需要通过在AndroidManifest中注册我们的广播接收者来通知Android系统,将  PhoneCallStateReceiver 类连接到描述系统广播的,如下。

监控拨出电话

对于拨出电话,你需要在AndroidManifest.xml接收者的引入NEW_OUTGOING_CALL action intent  。

要获取想要拨出的电话号码,在onReceive(Context, Intent)方法中,我们从intent中获取电话号码作为extra。 为了防止预期的呼叫完成,我们可以调用  setResultData()方法并传递一个空参数。resultData用作实际要拨打的电话号码。

有关广播和广播接收器的更多信息,请参见Envato Tuts +中的教程:

4.发送短信

发送短信有两个主要选择:使用设备的短信客户端APP或直接从你的应用发送短信。 我们将研究这两种情况,你决定哪一种情况适合你。我们先使用设备的短信客户端发送短信。

设置布局

首先,我们需要修改我们的主要布局,一个EditText控件和一个发送消息的按钮。

修改MainActivity

MainActivity类的onCreate()方法中,创建一个ACTION_SENDTO作为第一个参数的intent,一个smsto:〈phone number〉 URI作为第二个参数。sms_body extra的值是短信内容:

这里,SMS客户端将监听消息传递的状态。

运行应用程序

当输入所有必填字段时,单击发送短信 按钮将打开用户的SMS客户端,或者如果用户没有选择APP,给用户选择。

Send SMS flow

5.直接发送短信

接下来,我们来看看如何直接从我们的APP发送短信,而不是使用设备的短信客户端。

在 AndroidManifest.xml中添加权限

像往常一样,我们需要在AndroidManifest.xml中添加权限。

修改MainActivity类

接下来,对于Android 6.0(API级别23)及以上版本,我们需要在运行时申请SEND_SMS权限。

要了解有关Android运行时权限的更多信息以及它们在6.0版本中的修改,请参阅我们的Envato Tuts +教程:

要发送短信,我们获取默认的SmsManager 实例,然后调用其sendTextMessage()方法,将电话号码作为第一个参数传递,消息内容作为第二个参数:

要监听发送状态,SMSManager sendTextMessage()方法有两个可选的 PendingIntent参数:  sentIntentdeliveryIntent

如果你想使用sentIntent,观察成功后的结果代码  Activity.RESULT_OK,或下面三种错误码中的一种  RESULT_ERROR_GENERIC_FAILURE,  RESULT_ERROR_RADIO_OFF以及  RESULT_ERROR_NULL_PDU

6.  接收短信

为了让你的APP开始从用户手机接收短信,最好注册一个广播接收者,以便即使APP未在前台运行时也能在新短信到达时收到通知。

添加权限

RECEIVE_SMS权限添加到  AndroidManifest.xml :

接下来,我们需要检查APP是否有权在运行时接收短信。所以在MainActivity类中检查  RECEIVE_SMS许可。如果找不到,就申请该权限。

创建一个广播接收者

我们通过使用createFromPdu(byte[] pdu)方法检索SmsMessage类的每个对象,参数为PDU(协议数据单元)。然后我们将它添加到我们的消息数组中。

为了支持API 23及以上版本,应该包括String extra格式(在3GPP格式中,“3gpp”代表GSM / UMTS / LTE消息,在3GPP2格式中,“3gpp2”代表CDMA / LTE消息)。

现在,运行APP,然后关闭它,给模拟器发送手机短信。

Emulator showing a toast when it receives an SMS in the background

结论

在本教程中,你学到的知识有:

  • 从你的APP中拨打电话
  • 监听电话事件
  • 使用设备的消息发送APP或直接从你自己的APP发送短信
  • 在后台接收短信

你还可以通过Android中的电话和短信进行更多操作。访问Android Telephony API  和  SMSManager API  文档以了解更多信息。

与此同时,请查看我们在Android开发中的其他文章!

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.