[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
本主题将介绍如何响应用户位置的更改。
你需要了解的内容
技术
- Windows Runtime
先决条件
你应当熟悉 HTML 和 JavaScript。
说明
步骤 1: 验证是否启用了位置
在你的应用可以访问位置之前,必须在设备上启用“位置”。在“设置”****应用中,检查以下“位置隐私设置”是否已打开:
- “此设备的位置...”****已“打开”(在 Windows 10 移动版中不适用)
- 位置服务设置(“位置”****)已“打开”
- 在“选择可以使用你的位置的应用”****下,你的应用已设置为“打开”
步骤 2: 打开 Microsoft Visual Studio
创建新项目,从“JavaScript/应用商店应用”****项目类型中选择“空白应用程序”。
步骤 3: 创建一个新项目
在“新建项目”****对话框中,从 JavaScript 项目类型中选择一个空白应用程序。
步骤 4: 启用位置功能
在 Windows 和 Windows Phone 项目中,双击“解决方案资源管理器”中的“package.appxmanifest”****并选择“功能”选项卡。然后选中“功能”****列表中的“位置”。这将向程序包清单文件中添加 Location
设备功能。
<Capabilities>
<!-- DeviceCapability elements must follow Capability elements (if present) -->
<DeviceCapability Name="location"/>
</Capabilities>
步骤 5: 替换 JavaScript 代码
在“已共享”项目中,打开 default.js (/js/default.js)。使用以下代码替换文件中的代码。
(function () {
"use strict";
var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
args.setPromise(WinJS.UI.processAll().
done(function () {
// Add an event handler to the button.
document.querySelector("#startTracking").addEventListener("click",
trackloc);
// Add an event handler to the button.
document.querySelector("#stopTracking").addEventListener("click",
stoptracking);
}));
}
};
var loc = null;
function trackloc() {
if (loc == null) {
loc = new Windows.Devices.Geolocation.Geolocator();
}
if (loc != null) {
loc.addEventListener("positionchanged", onPositionChanged);
loc.addEventListener("statuschanged", onStatusChanged);
// display initial status, in case location is turned off.
document.getElementById('geolocatorStatus').innerHTML =
getStatusString(loc.locationStatus);
}
}
function stoptracking() {
if (loc != null) {
loc.removeEventListener("positionchanged", onPositionChanged);
}
}
function onPositionChanged(args) {
var pos = args.position;
document.getElementById('latitude').innerHTML =
pos.coordinate.point.position.latitude;
document.getElementById('longitude').innerHTML =
pos.coordinate.point.position.longitude;
document.getElementById('accuracy').innerHTML =
pos.coordinate.accuracy;
document.getElementById('geolocatorStatus').innerHTML =
getStatusString(loc.locationStatus);
}
// Handle change in status to display an appropriate message.
function onStatusChanged(args) {
var newStatus = args.status;
document.getElementById('geolocatorStatus').innerHTML =
getStatusString(newStatus);
}
function getStatusString(locStatus) {
switch (locStatus) {
case Windows.Devices.Geolocation.PositionStatus.ready:
// Location data is available
return "Location is available.";
break;
case Windows.Devices.Geolocation.PositionStatus.initializing:
// This status indicates that a GPS is still acquiring a fix
return "A GPS device is still initializing.";
break;
case Windows.Devices.Geolocation.PositionStatus.noData:
// No location data is currently available
return "Data from location services is currently unavailable.";
break;
case Windows.Devices.Geolocation.PositionStatus.disabled:
// The app doesn't have permission to access location,
// either because location has been turned off.
return "Your location is currently turned off. " +
"Change your settings through the Settings charm " +
" to turn it back on.";
break;
case Windows.Devices.Geolocation.PositionStatus.notInitialized:
// This status indicates that the app has not yet requested
// location data by calling GetGeolocationAsync() or
// registering an event handler for the positionChanged event.
return "Location status is not initialized because " +
"the app has not requested location data.";
case Windows.Devices.Geolocation.PositionStatus.notAvailable:
// Location is not available on this version of Windows
return "You do not have the required location services " +
"present on your system.";
break;
default:
return "Unknown status.";
}
}
app.start();
})();
步骤 6: 为应用添加 HTML
打开 Windows 和 Windows Phone 项目的 default.html 文件,并将以下 HTML 复制到该文件的 BODY 标记内。
<p>Geolocation Event Sample</p><br />
<span id="status"></span><br />
<button id="startTracking">Track Location</button><br />
<br />
<button id="stopTracking">Stop Tracking</button><br />
Latitude: <span id="latitude">Waiting for update...</span><br />
Longitude: <span id="longitude">Waiting for update...</span><br />
Accuracy (in meters): <span id="accuracy">Waiting for update...</span><br />
Location Status: <span id="geolocatorStatus"></span><br />
步骤 7: 生成应用
选择“生成”****>“生成解决方案”以生成项目。
步骤 8: 测试应用
- 在“调试”****菜单上,单击“启动调试”测试该解决方案。
- 首次运行该示例时,你会收到一个提示,询问是否可以让应用使用你的位置数据。选择“允许”****选项。
- 单击“获取位置”按钮获取当前的位置。
备注
位置服务使用多种不同的源来确定位置。在 GPS、手机基站和 Wi-Fi 不可用时可改用 IP 地址。如果出现这种情况,请注意你可能无法获取任何位置更新事件,因为 IP 地址数据不会经常更新。
如果你的应用程序需要仅获取一次位置数据,而不是订阅更新,请使用 GetGeopositionAsync 方法(在快速入门:检测用户的位置中进行了介绍)。