今天我遇到了一个我以前没有做过的功能请求——从应用程序中拨打一个号码。一些快速研究表明,它可以使用特定的 URI 方案。
什么是 URI 方案?老实说,维基百科在描述它们方面做得比我做得更好,但我认为它们允许特定功能在互联网上发生,因此它们通常被称为协议。您可能已经看过它们——最常见的是 http: 和 https:(用于网页浏览)和 ftp: 等。有些是应用程序独有的,实际上不符合方案,绝对不是“协议”,例如 mailto:(在个人计算机上打开邮件客户端)、javascript: 或 about:——事实上,试试在浏览器的地址栏中输入 about: 并在键盘上按“回车”,注意会发生什么……
在我们想要从应用程序中拨打号码的情况下,我们需要一种方法来告诉手机我们要拨打电话。有一个用于此目的的方案称为 tel:。使用此方案的示例编号如下所示:“tel:+1-800-555-1234”。如果您希望某个号码可以在世界各地使用,您可以使用包含国家代码的国际号码。
实现这一点很简单,我们可以在我们的移动 html5 应用中这样做:
...
拨打这个号码
...
理想情况下,尽管我们会委托事件并触发一个函数来呼叫我们的神秘电话号码。要将 url(“tel”url)发送到浏览器,我们将编写以下代码:
...
document.location.href = '电话:+1-800-555-1234';
...
从 PhoneGap 3.6 开始,所有方案都受制于白名单。这意味着您必须将 tel 方案添加到允许您的应用程序启动外部应用程序的第二个白名单中。为此,您需要编辑 config.XML 以包含以下内容(包括 mailto 示例):
点击此处了解更多信息:Cordova 3.6.0 白名单指南。
这个主题的有趣之处在于让 Android 将电话号码(以及 URL 和 mailto 方案)视为文本字段中的可点击链接。我尚未对其进行测试,但请尝试将以下内容添加到您的 config.xml。
可在此处找到更多信息:http://developer.android.com/reference/android/widget/TextView.html#attr_android:autoLink。
[编辑:请注意,以下内容不再适用,但出于历史目的保留在这里。]
当我们在 Android 2.3.6 中运行上述代码时,电话拨号器会出现,并且我们的号码已预先填充好以便拨打。不幸的是,在 iOS 5 上这不会发生。对 iOS 文档的快速回顾意味着它应该可以工作——所以我想它只是坏了。
不必惊慌,有一个 PhoneGap 插件可以解决问题。插件可以从这里下载:
点击此处下载iOS电话拨号器PhoneGap插件
安装简单——只需将“m”和“h”文件拖放到 xcode 项目的 classes 文件夹中即可。执行此操作时,将出现一个对话框,其中包含一些选项 - 请务必单击单选按钮以复制“...文件如果需要..”。
接下来,更新 PhoneGap.plist 文件以反映您正在添加新插件。下载插件的链接将 plist 值解释为“phonedialer > PhoneDialer”……但我认为用图像更容易解释:
最后一步是将“PhoneDialer.js”javascript 文件放在项目根目录中的某个位置,然后通过脚本标签将其添加到 index.html 文件中。
既然安装了电话拨号器插件,您自然会想知道如何使用它:
...
window.plugins.phoneDialer.dial('1-800-555-1234');
...
总而言之,非常简单直接,但是现在您有两种方法可以在单个项目中拨打号码。您想要的是在 Android 中使用 tel: url 方案和在 iOS 中使用电话拨号器插件。
在 Sencha Touch 中,我们有一个称为 Ext.is 对象的东西,它的属性反映了您可能想知道的关于您的移动应用所处环境的所有信息。
出于我们的目的,我们只想知道我们是在 iOS 中还是在 Android 中。这两行为我们提供了答案:
...
Ext.is.Android // 布尔值,对于 android 为 "true",否则为 false
Ext.is.iOS // 布尔值,iOS 为“true”,否则为 false
...
这就是我们在移动应用程序中跨两个平台实现电话拨号所需的全部内容。让我们构建一个使用上述之一的函数(我们不需要两者),我们还应该给用户一个选择,所以下面的代码包含一条消息给用户,看看他们是否真的想要暂停应用程序以支持设备的电话拨号器:
...
函数调用某人(){
var msg = Ext.Msg.confirm('请确认','确定要打电话吗?',
函数(r){
如果(r =='是'){
如果(Ext.is.Android){
document.location.href = '电话:+1-800-555-1234';
} else { // 我们假设设备运行的是 iOS
window.plugins.phoneDialer.dial('1-800-555-1234');
}
}
});
msg.doComponentLayout();
}
...
全部完成……我想最后要做的就是提供一个完整的 Sencha Touch 示例,以及一些屏幕截图……
...
分机设置({
onReady: 函数(){
var rootPanel = new Ext.form.FormPanel({
fullscreen: true,
items: [
{
xtype:'button',
text:'Call 1-800-555-1234',
scope:this,
handler: callSomeone
}
],
dockedItems:[
{
xtype:'toolbar',
dock:'top',
title:'Phone Dialer Example'
}
]
}
);
function callSomeone(){
var msg = Ext.Msg.confirm('Please Confirm','Are you sure you want to make a phone call?',
function(r){
if (r == 'yes'){
if (Ext.is.Android){
document.location.href = 'tel:+1-800-555-1234';
} else { // we assume the device is running iOS
window.plugins.phoneDialer.dial('1-800-555-1234');
}
}
}
);
msg.doComponentLayout();
}
}
});
...
来自http://rickluna.com/wp/2012/02/making-a-phone-call-from-within-phonegap-in-android-and-ios/