欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android基于位置的服务应用程序– GPS位置

程序员文章站 2022-05-11 15:01:27
...
随着智能手机中GPS设备的集成, 基于位置的服务 (LBS)在过去几年中变得非常热门。 iPhone是第一个为这类应用程序带来巨大推动力的应用程序,而现在Android仍沿用相同的方式。 在本教程中,我将向您展示如何为Android构建第一个LBS应用程序。 第一步是获取用户的当前位置,然后使用其坐标为该位置提供数据。通常,用户可以通过以下方式之一在地图上进行精确定位:
  1. 使用手机随附的GPS设备
  2. 使用用户当前所服务的单元格的ID

第一个更容易,更准确(因为第二个仅提供了近似值)。 由于现在这些电话中确实有很多内置GPS设备,因此我们将采用第一种方法。 Android SDK的模拟器可以模拟用户位置的变化,并为其坐标提供虚拟数据。

让我们开始在Eclipse中创建一个新的Android项目。 我给它起了奇特的名称“ AndroidLbsGeocodingProject”,并使用了如下图所示的属性:

Android基于位置的服务应用程序– GPS位置

请注意,我使用的是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支持:

Android基于位置的服务应用程序– GPS位置

接下来,使用“运行–>运行配置…”为项目创建新配置:

Android基于位置的服务应用程序– GPS位置

如果单击“运行”,则将启动仿真器,但是单击该按钮时实际上不会发生任何事情。 这是因为仿真器启动时,没有要检索的最后一个已知位置(返回的Location实例为null)。

我们必须向仿真器提供一些虚拟数据。 转到Eclipse的DDMS视图,然后查找“仿真控件”选项卡。 在那里,您将找到“位置控制”部分,该部分可以将模拟位置数据发送到仿真器。 在“手动”选项卡中,只需单击“发送”按钮,就已经设置了一些坐标。

Android基于位置的服务应用程序– GPS位置

当数据发送到模拟器的GPS设备时,我们的监听器将被触发,并且当前位置将以Toast通知的形式打印在屏幕上。

Android基于位置的服务应用程序– GPS位置

现在,存在一个最后的已知位置,因此,如果单击“检索位置”按钮,将获取一个非空位置,并且坐标将再次打印在屏幕中:

Android基于位置的服务应用程序– GPS位置

而已。 现在,您可以模拟用户位置中的更改并检索有关它们的更新。 在下一个教程中,我将向您展示如何利用这些坐标为用户提供有用的数据。 现在,您可以在此处找到Eclipse项目。

编码愉快!!!

相关文章 :
相关片段:

翻译自: https://www.javacodegeeks.com/2010/09/android-location-based-services.html