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

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

编码愉快!!!

相关文章 :
相关片段:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值