- 使用手机随附的GPS设备
- 使用用户当前所服务的单元格的ID
第一个更容易,更准确(因为第二个仅提供了近似值)。 由于现在这些电话中确实有很多内置GPS设备,因此我们将采用第一种方法。 Android SDK的模拟器可以模拟用户位置的变化,并为其坐标提供虚拟数据。
让我们开始在Eclipse中创建一个新的Android项目。 我给它起了奇特的名称“ AndroidLbsGeocodingProject”,并使用了如下图所示的属性:
请注意,我使用的是Android 1.5平台版本,“ 3”作为SDK的最低版本。 该应用程序将不会使用任何新的超级Duper API,因此我决定使用第一个版本以实现向后兼容。 通常,最好支持尽可能多的版本。 您可以在此处找到有关平台版本及其相应市场份额的信息 。
首先,我们将只添加一个按钮,该按钮将触发从位置提供者检索当前位置的坐标。 因此,应用程序界面的“ main.xml”文件将像下面这样简单:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/retrieve_location_button"
android:text="Retrieve Location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
为了开始使用Android API的定位功能,第一步是引用LocationManager类,该类提供对系统定位服务的访问。 这是通过我们活动的getSystemService完成的(实际上,它是从Context父类继承的)。 然后,我们使用requestLocationUpdates方法请求更新设备的位置。 在该方法中,我们提供了首选位置提供者的名称(在我们的示例中为GPS),通知的最小时间间隔(以毫秒为单位),通知的最小距离间隔(以米为单位)以及最后一个实现LocationListener接口的类。 该接口声明用于处理用户位置更改以及位置提供者状态更改的方法。 以上所有内容都可以转换为以下代码:
package com.javacodegeeks.android.lbs;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class LbsGeocodingActivity extends Activity {
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds
protected LocationManager locationManager;
protected Button retrieveLocationButton;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MINIMUM_TIME_BETWEEN_UPDATES,
MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
new MyLocationListener()
);
retrieveLocationButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showCurrentLocation();
}
});
}
protected void showCurrentLocation() {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
String message = String.format(
"Current Location \n Longitude: %1$s \n Latitude: %2$s",
location.getLongitude(), location.getLatitude()
);
Toast.makeText(LbsGeocodingActivity.this, message,
Toast.LENGTH_LONG).show();
}
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location location) {
String message = String.format(
"New Location \n Longitude: %1$s \n Latitude: %2$s",
location.getLongitude(), location.getLatitude()
);
Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String s, int i, Bundle b) {
Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",
Toast.LENGTH_LONG).show();
}
public void onProviderDisabled(String s) {
Toast.makeText(LbsGeocodingActivity.this,
"Provider disabled by the user. GPS turned off",
Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String s) {
Toast.makeText(LbsGeocodingActivity.this,
"Provider enabled by the user. GPS turned on",
Toast.LENGTH_LONG).show();
}
}
}
对于LocationListener接口,我们实现了MyLocationListener内部类。 该类中的方法仅使用Toast来提供有关GPS状态或任何位置更改的信息。 唯一的接口元素是Button ,该按钮与OnClickListener关联,并且在单击该按钮时,将调用showCurrentLocation方法。 然后,执行LocationManager实例的getLastKnownLocation ,返回最后一个已知的Location 。 从Location对象中,我们可以获得有关用户的高度 , 纬度 , 经度 , 速度等的信息。为了能够运行上述代码,必须授予必要的权限。 这些是:
将它们包括在AndroidManifest.xml文件中,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.javacodegeeks.android.lbs"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".LbsGeocodingActivity"
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.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-sdk android:minSdkVersion="3" />
</manifest>
接下来,使用AVD Manager来创建新的Android设备,并确保功能中包括GPS支持:
接下来,使用“运行–>运行配置…”为项目创建新配置:
如果单击“运行”,则将启动仿真器,但是单击该按钮时实际上不会发生任何事情。 这是因为仿真器启动时,没有要检索的最后一个已知位置(返回的Location实例为null)。
我们必须向仿真器提供一些虚拟数据。 转到Eclipse的DDMS视图,然后查找“仿真控件”选项卡。 在那里,您将找到“位置控制”部分,该部分可以将模拟位置数据发送到仿真器。 在“手动”选项卡中,只需单击“发送”按钮,就已经设置了一些坐标。
当数据发送到模拟器的GPS设备时,我们的监听器将被触发,并且当前位置将以Toast通知的形式打印在屏幕上。
现在,存在一个最后的已知位置,因此,如果单击“检索位置”按钮,将获取一个非空位置,并且坐标将再次打印在屏幕中:
而已。 现在,您可以模拟用户位置中的更改并检索有关它们的更新。 在下一个教程中,我将向您展示如何利用这些坐标为用户提供有用的数据。 现在,您可以在此处找到Eclipse项目。
编码愉快!!!
- “ Android完整应用程序教程”系列
- Android文字转语音应用
- 带有Yahoo API的Android反向地理编码– PlaceFinder
- 使用VirtualBox在PC上安装Android OS
- 拥抱Android的强大功能:快速概述
翻译自: https://www.javacodegeeks.com/2010/09/android-location-based-services.html