×
Namespaces

Variants
Actions
(Difference between revisions)

在GPS应用程序中使用Notification API

From Nokia Developer Wiki
Jump to: navigation, search
flycarl (Talk | contribs)
hamishwillee (Talk | contribs)
m (Text replace - "<code cpp>" to "<code cpp-qt>")
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
[[Category:Lang-Chinese]][[Category:Qt]][[Category:Location]]
 +
{{ArticleMetaData
 +
|sourcecode=[[Media:NotificationChat.zip]]
 +
|installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) -->
 +
|devices= <!-- Devices tested against - e.g. ''devices=Nokia 6131 NFC, Nokia C7-00'') -->
 +
|sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) -->
 +
|platform= <!-- Compatible platforms - e.g. Symbian^1 and later, Qt 4.6 and later -->
 +
|devicecompatability= <!-- Compatible devices e.g.: All* (must have internal GPS) -->
 +
|dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 -->
 +
|signing=<!-- Signing requirements - empty or one of: Self-Signed, DevCert, Manufacturer -->
 +
|capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. -->
 +
|keywords= <!-- APIs, classes and methods (e.g. QSystemScreenSaver, QList, CBase -->
 +
|id= <!-- Article Id (Knowledge base articles only) -->
 +
|language=Lang-Chinese
 +
|translated-by=[[User:Flycarl]]
 +
|translated-from-title=Using Notification API in GPS based application
 +
|translated-from-id=85337 <!-- automated guess -->
 +
|review-by=<!-- After re-review: [[User:username]] -->
 +
|review-timestamp= <!-- After re-review: YYYYMMDD -->
 +
|update-by= <!-- After significant update: [[User:username]]-->
 +
|update-timestamp= <!-- After significant update: YYYYMMDD -->
 +
|creationdate=20110508
 +
|author=[[User:Aj4mobile]]
 +
}}
  
  
 
==介绍==
 
==介绍==
*本文翻译自[[Using Notification API in GPS based application]] 。
+
 
 
Qt做为跨平台的应用程序和用户界面 开发框架,最近引进了"通知API"(“Notification API”)这个引人注目的功能,用来实现实时推送通知。Notification API发送轻量的通知,优化了带宽和电池的耗用,具有很高的效率。移动应用的实现处在一个革命性的阶段,在这里,由服务端发起向移动客户端推送消息是一个不可避免的要素,现在这个功能在Qt SDK中发布了。Notification API 使得客户端即使在未激活的时候也能立即受到来自 邮件,facebook,twitter,天气更新,股票更新等的通知。 在这篇文章中我给出一个在GPS应用中使用Notification API的例子。
 
Qt做为跨平台的应用程序和用户界面 开发框架,最近引进了"通知API"(“Notification API”)这个引人注目的功能,用来实现实时推送通知。Notification API发送轻量的通知,优化了带宽和电池的耗用,具有很高的效率。移动应用的实现处在一个革命性的阶段,在这里,由服务端发起向移动客户端推送消息是一个不可避免的要素,现在这个功能在Qt SDK中发布了。Notification API 使得客户端即使在未激活的时候也能立即受到来自 邮件,facebook,twitter,天气更新,股票更新等的通知。 在这篇文章中我给出一个在GPS应用中使用Notification API的例子。
  
Line 38: Line 62:
 
*'''UI'''可以用Qt Quick轻松创建。Qt SDK自带很多例子,开发者可以从想要的例子中截取或进行相应的开发。
 
*'''UI'''可以用Qt Quick轻松创建。Qt SDK自带很多例子,开发者可以从想要的例子中截取或进行相应的开发。
 
*'''经纬度获取'''代码如下
 
*'''经纬度获取'''代码如下
<code cpp>
+
<code cpp-qt>
  
 
void MainWindow::startGPS()
 
void MainWindow::startGPS()
Line 103: Line 127:
 
</code>
 
</code>
  
这可以从这个链接获取 [http://www.forum.nokia.com/document/Mobile_Hands-on_Labs/Qt/MobilityLocation/05.html http://www.forum.nokia.com/document/Mobile_Hands-on_Labs/Qt/MobilityLocation/05.html],下载QtMobilityLocation.zip,在Qt SDK 1.1中打开,复制代码添加到工程中。
+
这可以从这个链接获取 [http://www.developer.nokia.com/document/Mobile_Hands-on_Labs/Qt/MobilityLocation/05.html http://www.developer.nokia.com/document/Mobile_Hands-on_Labs/Qt/MobilityLocation/05.html],下载QtMobilityLocation.zip,在Qt SDK 1.1中打开,复制代码添加到工程中。
  
*'''通知监听'''的实现细节可以从这个链接的到: [https://projects.forum.nokia.com/notificationsapi/files https://projects.forum.nokia.com/notificationsapi/files]。下载notificationexample.zip,改编需要的数据。 本工程需要的代码片段列在下面
+
*'''通知监听'''的实现细节可以从这个链接的到: [https://projects.developer.nokia.com/notificationsapi/files https://projects.developer.nokia.com/notificationsapi/files]。下载notificationexample.zip,改编需要的数据。 本工程需要的代码片段列在下面
  
 
注册&注销通知的部分:
 
注册&注销通知的部分:
<code cpp>
+
<code cpp-qt>
 
void NotificationExample::registerApplication()
 
void NotificationExample::registerApplication()
 
{
 
{
Line 125: Line 149:
 
</code>
 
</code>
 
接收通知消息的代码如下。这可以定制使得当接收消息时,应用激活上面描述的经纬度获取部分。
 
接收通知消息的代码如下。这可以定制使得当接收消息时,应用激活上面描述的经纬度获取部分。
<code cpp>
+
<code cpp-qt>
 
void NotificationExample::received(QObject* aNotification)
 
void NotificationExample::received(QObject* aNotification)
 
{
 
{
Line 158: Line 182:
 
===服务器===
 
===服务器===
  
开发者可以在他选择的平台上开发一个简单的服务器端应用。服务器通过Notification API向移动终端发消息。 参考[https://projects.forum.nokia.com/notificationsapi/wiki/serviceapisample https://projects.forum.nokia.com/notificationsapi/wiki/serviceapisample]
+
开发者可以在他选择的平台上开发一个简单的服务器端应用。服务器通过Notification API向移动终端发消息。 参考[https://projects.developer.nokia.com/notificationsapi/wiki/serviceapisample https://projects.developer.nokia.com/notificationsapi/wiki/serviceapisample]
 
,这是一个使用Notification REST API给客户端发送消息的简单服务。
 
,这是一个使用Notification REST API给客户端发送消息的简单服务。
 
+
=== 例子代码 ===
 +
[[Media:NotificationChat.zip]]
 
----
 
----
 
==总结==
 
==总结==
Line 167: Line 192:
  
 
== 参考链接 ==
 
== 参考链接 ==
 +
*[[Qt 开发]]
 +
*[[Qt Quick (Chinese)]]
 +
*[https://projects.developer.nokia.com/notificationsapi/ Notification API 工程站点]
  
http://www.forum.nokia.com/
+
*http://www.developer.nokia.com/
 
+
http://developer.qt.nokia.com/prereleases
+
  
http://qt.gitorious.org/
+
*http://developer.qt.nokia.com/prereleases
  
http://qt.nokia.com/qtquick/
+
*http://qt.gitorious.org/
  
https://projects.forum.nokia.com/notificationsapi/
+
*http://qt.nokia.com/qtquick/
 +
<!-- Translation --> [[en:Using Notification API in GPS based application]][[Category:MeeGo Harmattan]] [[Category:Symbian]]

Revision as of 04:19, 11 October 2012

Article Metadata

代码示例
兼容于
平台:
Symbian

文章
翻译:
flycarl
最后由 hamishwillee 在 11 Oct 2012 编辑


Contents

介绍

Qt做为跨平台的应用程序和用户界面 开发框架,最近引进了"通知API"(“Notification API”)这个引人注目的功能,用来实现实时推送通知。Notification API发送轻量的通知,优化了带宽和电池的耗用,具有很高的效率。移动应用的实现处在一个革命性的阶段,在这里,由服务端发起向移动客户端推送消息是一个不可避免的要素,现在这个功能在Qt SDK中发布了。Notification API 使得客户端即使在未激活的时候也能立即受到来自 邮件,facebook,twitter,天气更新,股票更新等的通知。 在这篇文章中我给出一个在GPS应用中使用Notification API的例子。

目标

利用 Notification API 开发一个实时粘附应用程序(sticky application),花几个小时和最少的开发工作。

问题表述

考虑在用户在某种紧急情况下,需要被追踪,以获得他们的实时位置。可以通过一个使用Notification API的GPS应用来处理。两个注册到服务器的用户,这个应用帮助一个用户被另一个连接到他的用户追踪。这个应用在下面这种情形下有用: 被追踪者不能回复消息,但是希望他/她的位置被跟踪。

实现策略

客户端应用获取经纬度数据,从服务器后端接受消息。使用Qt的Notification API发送通知,使用Qt Mobility Location API获取经纬度。 服务器后端提供功能包括: 用户注册,认证,发送消息给请求的用户。服务器使用Notification Serevice API向移动终端发消息。Notification Service API通过 HTTP REST接口 提供对通知服务器的访问。

为什么用Qt

使用第三方SMS网关服务器向移动终端发消息 花费不菲。 黑莓手机使用的推送机制 使用的黑莓企业服务 非常昂贵。 尽管苹果的推送服务机制跟Qt比较类似,但是iPhone开发智能在Mac环境下开发,而基于Qt的推送服务开发可以用Qt Quick完成,不指定开发平台,并且开发过程始终那么愉轻松快。 Android也是在开发上不如Qt Quick轻松,且其推送服务的实现不是通用的有效。

资源需求

  • 一个支持Qt SDK 1.1的移动应用程序
  • 移动设备有internet连接
  • 一台有公共IP的服务器机器
  • 一个开发者

应用如何工作

这个应用程序帮助注册的客户端追踪他们的地理位置,即使在他们不能回复消息的情况下。注册在服务器上的客户端可以访问服务器上连接的其他客户端,当一个客户端要求追踪另一个客户端,服务器通过Notification API给后者手机发信息,后者手机回复自己的经纬度给服务器,然后服务器将这个坐标推送给请求客户端,并将坐标以地标形式显示在前者移动终端的地图上。每个注册用户都有权按他们的意愿启用或禁用跟踪设备。

应用实现导引

实现这个工程十分容易,所有需要的资源,都在Forum Nokia和Qt Nokia网站上提供了。

客户端

客户端包含三个模块,即,UI, 经纬度获取和通知监听(notification listener)

  • UI可以用Qt Quick轻松创建。Qt SDK自带很多例子,开发者可以从想要的例子中截取或进行相应的开发。
  • 经纬度获取代码如下
void MainWindow::startGPS()
{
// Obtain the location data source if it is not obtained already
if (!locationDataSource)
{
locationDataSource =
QGeoPositionInfoSource::createDefaultSource(this);
if (locationDataSource)
{
// Whenever the location data source signals that the current
// position is updated, the positionUpdated function is called.
QObject::connect(locationDataSource,
SIGNAL(positionUpdated(QGeoPositionInfo)),
this,
SLOT(positionUpdated(QGeoPositionInfo)));
// Start listening for position updates
locationDataSource->startUpdates();
} else {
// Not able to obtain the location data source
// TODO: Error handling
}
} else {
// Start listening for position updates
locationDataSource->startUpdates();
}
}
 
void MainWindow::positionUpdated(QGeoPositionInfo geoPositionInfo)
{
if (geoPositionInfo.isValid())
{
// Stop regular position updates, because a valid position has been
// obtained
locationDataSource->stopUpdates();
 
// Get the current location as latitude and longitude
QGeoCoordinate geoCoordinate = geoPositionInfo.coordinate();
qreal latitude = geoCoordinate.latitude();
qreal longitude = geoCoordinate.longitude();
 
// Fetch the map using the display size and the coordinates
QUrl url = createGoogleMapURL(size(), latitude, longitude);
webView->stop(); // Stop the ongoing request
webView->load(url); // Load the Google Map
}
}
 
QUrl MainWindow::createGoogleMapURL(const QSize& size, qreal latitude,qreal longitude)
{
const QString GOOGLE_MAPS_URL_TEMPLATE =
"http://maps.google.com/maps/api/staticmap?center=%1,%2&zoom=12&size=%3x%4&maptype=mobile&markers=color:red|label:Y|%1,%2&sensor=true";
QUrl url = QUrl(GOOGLE_MAPS_URL_TEMPLATE.arg(
QString::number(latitude), QString::number(longitude),
QString::number(size.width()), QString::number(size.height())));
return url;
}
Instantiate QWebView() as below and invoke startGPS() from your application module.
webView = new QWebView(this);
// Start the GPS
startGPS();

这可以从这个链接获取 http://www.developer.nokia.com/document/Mobile_Hands-on_Labs/Qt/MobilityLocation/05.html,下载QtMobilityLocation.zip,在Qt SDK 1.1中打开,复制代码添加到工程中。

注册&注销通知的部分:

void NotificationExample::registerApplication()
{
// Register to Notifications
iTextConsole->append("Registering to Notifications ...");
iNotificationInterface->registerApplication(application_id);
}
 
void NotificationExample::unregisterApplication()
{
// Unregister from Notifications
iTextConsole->append("Unregistering from Notifications...");
iNotificationInterface->unregisterApplication();
}

接收通知消息的代码如下。这可以定制使得当接收消息时,应用激活上面描述的经纬度获取部分。

void NotificationExample::received(QObject* aNotification)
{
// Casting the QObject to OviNotificationMessage to gain access
// to all its members.
OviNotificationMessage* notification =
static_cast<OviNotificationMessage*>(aNotification);
 
// Show the received notification in the screen
OviNotificationPayload* payload = static_cast<OviNotificationPayload*>(notification->payload());
 
iTextConsole->setText("Notification received!");
iTextConsole->append("Application " + notification->senderInformation()
+ " of the service "+notification->from()+ " service sent: \n"
+ "'" + payload->dataString() + "'");
// Printing out the notification details in text console. Optional.
iTextConsole->append("Notification received.");
iTextConsole->append("Notification was sent at " + notification->timestamp());
if (!payload->type().isEmpty())
{
iTextConsole->append("Payload type was set to " + payload->type());
}
if (!payload->encoding().isEmpty())
{
iTextConsole->append("Payload was encoded in " + payload->encoding());
}
 
delete notification;
}

服务器

开发者可以在他选择的平台上开发一个简单的服务器端应用。服务器通过Notification API向移动终端发消息。 参考https://projects.developer.nokia.com/notificationsapi/wiki/serviceapisample ,这是一个使用Notification REST API给客户端发送消息的简单服务。

例子代码

Media:NotificationChat.zip


总结

在Facebook之前有很多社交网络站点,但他们都没有Facebook成功。这说明引进的时间不是最关键的,观点的唯一性表示才是关键。类似的,上面的使用Qt框架和Notification API开发的应用将会在同类中脱颖而出。


参考链接

216 page views in the last 30 days.
×