`

让你的app可以定位

阅读更多

 

用户带和他们的移动设备与他们几乎无处不在。移动应用程序的独特功能之一是位置意识。明确的位置定位,并明智地使用信息,可以让使用者体验带来了更多的便利。

这篇文章将告诉你,如何在你的Andr​​oid应用程序将基于位置的服务。您会学到一些方法,以接收位置更新和最佳做法。本文的重点分为下面三点,下面会一一讲到,并指出其中的重点内容:

1.使用LocationManager(学习如何配置你的app,在它能接受到android的位置更新之前)

2.获取当前位置(学习如何使用底层位置技术平台上可用来获得当前位置)

3.显示位置地址(学习如何翻译为地址位置坐标对用户是可读的)

 

 

.使用LocationManager

manifest中声明网络权限:

 

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
 

 

获得位置管理的引用:

LocationManager是主要的类,通过这个应用程序可以访问的位置服务在Android上。类似于其他系统服务,可以得到一个引用从调用getSystemService()方法。如果你的应用程序准备接收位置更新前景(在一个活动),您应该执行该步骤通常在onCreate()方法。代码如下:

 

LocationManager locationManager =
        (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
 

 

获得位置的提供者:

取决于您的应用程序的用例,你必须选择一个特定位置,或多个提供者、提供者基于类似的权衡。例如,一个的兴趣点签入应用程序将需要更高的定位精度比说,零售商店定位器,一个城市水平位置修正就足够了。下面的代码片段要求一个提供者支持的GPS代码如下:

 

LocationProvider provider =
        locationManager.getProvider(LocationManager.GPS_PROVIDER);
 

 

添加条件增加精确度:

你可以提供一些输入标准如精度、电力需求,货币成本等等,Android决定一个最接近的匹配位置提供者。下面的代码片段要求一个位置提供者与细准确性和没有货币成本。注意,标准可能没有解决任何提供者,在这种情况下,将返回null。代码如下:

 

// Retrieve a list of location providers that have fine accuracy, no monetary cost, etc
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setCostAllowed(false);
...
String providerName = locManager.getBestProvider(criteria, true);

// If no suitable provider is found, null is returned.
if (providerName != null) {
   ...
}
 

 

验证位置提供者是否可以:

如果位置提供者是禁用的,您可以为用户提供一个机会,使它在设置一个Intent

ACTION_LOCATION_SOURCE_SETTINGS代码如下:

 

@Override
protected void onStart() {
    super.onStart();

    // This verification should be done during onStart() because the system calls
    // this method when the user returns to the activity, which ensures the desired
    // location provider is enabled each time the activity resumes from the stopped state.
    LocationManager locationManager =
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    final boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!gpsEnabled) {
        // Build an alert dialog here that requests that the user enable
        // the location services, then when the user clicks the "OK" button,
        // call enableLocationSettings()
    }
}

private void enableLocationSettings() {
    Intent settingsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(settingsIntent);
}

 

 

 

 

.获取当前位置

设置位置的监听

LocationManager类公开的一些方法来应用程序接收位置更新。在其最简单的形式,你注册一个事件侦听器,确定位置的经理,你想接收位置更新,并指定最小间隔时间和距离,接收位置更新。这个onLocationChanged()回调将调用的频率与时间和距离的间隔。在样例代码片段,下面的位置侦听器被设置为接收通知至少每10,如果设备移动超过10米。其他的回调方法通知应用程序状态更改任何来自提供者的位置。代码如下:

 

private final LocationListener listener = new LocationListener() {
@Override
    public void onLocationChanged(Location location) {
        // A new location update is received.  Do something useful with it.  In this case,
        // we're sending the update to a handler which then updates the UI with the new
        // location.
        Message.obtain(mHandler,
                UPDATE_LATLNG,
                location.getLatitude() + ", " +
                location.getLongitude()).sendToTarget();
...
        }
    ...
};
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
        10000,          // 10-second interval.
        10,             // 10 meters.
        listener);
 

 

停止位置更新:

如果用户不再使用导航或者使用别的应用时,你应该停止位置更新通过调用removeUpdates()onStop()(onStop()时调用活动不再是可见的,代码如下:

 

protected void onStop() {
    super.onStop();
    mLocationManager.removeUpdates(listener);
}
 

 

 

 

 

.显示位置地址

执行反向地址编码:

逆向地理编码是翻译的过程,一个人类可读的纬度经度坐标地址注意,在幕后,API是依赖于web服务。如果这样的服务不可用的设备,API将抛出一个“Service not Available exception”或者返回一个空列表的地址

一个helper方法称为isPresent()添加于Android 2.3(API级别9)来检查服务的存在,

下面的代码片段演示了如何使用该API来执行反向地理编码Geocoder代码如下:

 

private final LocationListener listener = new LocationListener() {
public void onLocationChanged(Location location) {
        // Bypass reverse-geocoding if the Geocoder service is not available on the
        // device. The isPresent() convenient method is only available on Gingerbread or above.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD && Geocoder.isPresent()) {
            // Since the geocoding API is synchronous and may take a while.  You don't want to lock
            // up the UI thread.  Invoking reverse geocoding in an AsyncTask.
            (new ReverseGeocodingTask(this)).execute(new Location[] {location});
        }
    }
    ...
};
// AsyncTask encapsulating the reverse-geocoding API.  Since the geocoder API is blocked,
// we do not want to invoke it from the UI thread.
private class ReverseGeocodingTask extends AsyncTask<Location, Void, Void> {
    Context mContext;
public ReverseGeocodingTask(Context context) {
        super();
        mContext = context;
    }
@Override
    protected Void doInBackground(Location... params) {
        Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
Location loc = params[0];
        List<Address> addresses = null;
        try {
            // Call the synchronous getFromLocation() method by passing in the lat/long values.
            addresses = geocoder.getFromLocation(loc.getLatitude(), loc.getLongitude(), 1);
        } catch (IOException e) {
            e.printStackTrace();
            // Update UI field with the exception.
            Message.obtain(mHandler, UPDATE_ADDRESS, e.toString()).sendToTarget();
        }
        if (addresses != null &s;&s; addresses.size() > 0) {
            Address address = addresses.get(0);
            // Format the first line of address (if available), city, and country name.
            String addressText = String.format("%s, %s, %s",
                    address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
                    address.getLocality(),
                    address.getCountryName());
            // Update the UI via a message handler.
            Message.obtain(mHandler, UPDATE_ADDRESS, addressText).sendToTarget();
        }
        return null;
    }
}

 

以上就是详细的对app定位的一些讲解和事例代码,只有部分代码,为的是突出重点和帮助大家理解,下面我贴上该例子全部的源代码,代码也不多,注释也很清楚,希望能帮到大家。

0
0
分享到:
评论

相关推荐

    address(uni-app经纬度定位范围内签到)

    此外,为了提升用户体验,可以利用地图插件(如高德地图、百度地图等)在页面上显示用户的位置和签到范围,让用户直观地看到自己是否在区域内。同时,还可以通过后台服务存储签到记录,防止用户重复签到。 综上所述...

    自定义vue跳转app定位(当前高德定位i)

    自定义vue跳转app定位(当前高德定位i) 自定义vue跳转app定位(当前高德定位i) 自定义vue跳转app定位(当前高德定位i) 自定义vue跳转app定位(当前高德定位i) 自定义vue跳转app定位(当前高德定位i) 自定义vue跳转app定位...

    IBeacon室内定位APP(三角定位)

    【IBeacon室内定位APP(三角定位)】 在现代智能设备和物联网技术的快速发展中,室内定位成为了一项重要的需求,特别是在大型购物中心、机场、医院等复杂环境内。IBeacon,苹果公司推出的一种低功耗蓝牙技术,是...

    WIFI室内定位Android APP,包括定位APP和数据采集APP

    标题中的“WIFI室内定位Android APP”涉及到的是一个利用Wi-Fi信号进行室内定位的移动应用,主要面向Android操作系统。在Android平台上开发这样的应用,开发者需要掌握以下关键知识点: 1. **Wi-Fi信号强度与定位**...

    app测试快速定位问题的方法

    ### APP测试快速定位问题的方法详解 #### 一、前言 在APP开发过程中,测试环节至关重要。有效的测试不仅能帮助研发团队快速发现并解决问题,还能显著提高产品的质量和用户体验。本文将结合作者近3年的APP测试经验...

    uni-app腾讯地图显示定位

    【uni-app腾讯地图显示定位】 ...你可以在此基础上进一步扩展,如添加标记、路线规划、地理编码等。uni-app与腾讯地图的结合,为开发者提供了强大的地图服务,使你能轻松地构建各种基于地理位置的应用。

    读取通讯录短信定位信息APP源码.zip

    在这个"读取通讯录短信定位信息APP源码.zip"压缩包中,我们可以深入探讨与Android应用开发相关的几个核心知识点,主要包括读取通讯录、访问短信以及获取设备定位信息的功能实现。 首先,读取通讯录是Android应用中...

    基于语音识别和GPS定位的智能垃圾分类APP.pdf

    "基于语音识别和GPS定位的智能垃圾分类APP" 本文提出了一款智能垃圾分类APP的设计,采用经典三层结构设计,使用物联网技术及百度定位服务使得移动端与垃圾站点互联,实现站点信息的“可视化”同时支持路线导航功能...

    基于LBS的商场定位APP设计实现.pdf

    在Android平台上,开发基于LBS的商场定位APP,可以提供更加灵活和自由的开发环境,满足各种用户需求。该APP可以提供实时的商场位置信息,帮助用户快速找到目标商场,提高用户的购物体验。 关键技术点: 1、WL AN...

    基于无线网络融合定位的安卓手机APP设计与实现.pdf

    【基于无线网络融合定位的安卓手机APP设计与实现】 随着移动设备的普及,尤其是安卓手机,定位服务已经成为日常生活中不可或缺的一部分。为了提供更精确的定位服务,开发基于无线网络融合定位的安卓应用程序(APP)...

    APP中实现H5定位于原生APP切换

    在实现H5定位和原生APP切换时,我们需要编写H5代码,可以参考gosave中的例子。在AppiumBasePage中,我们可以使用contextWebview方法来切换到H5页面,并使用returnToNative方法来返回到原生APP界面。 在代码中,我们...

    基于Android的寻人定位APP——爱守护·老人.pdf

    "基于Android的寻人定位APP——爱守护·老人" 本文旨在开发基于Android系统的寻人定位APP,旨在解决老年人走失的问题。该APP名称为"爱守护·老人",分为主控端和被控端两个部分。主控端安装在儿女的手机上,用于...

    定位app 好友定位,高德地图,百度地图更换Key即可,好友路线轨迹 精准定位

    对于好友定位,你可以利用其定位接口获取用户的位置信息,并通过网络将这些信息发送到服务器,再由服务器推送给其他好友。同时,高德地图的轨迹服务可以记录和回放用户的移动路线,从而实现路线轨迹的展示。 百度...

    基于Android人脸识别定位签到app(源码+演示视频)

    基于Android人脸识别定位签到app(源码+演示视频) 【项目技术】 android+php后台 【实现功能】 该系统分为普通用户和管理员两个角色,功能如下: 管理员: 1.发布签到任务:包含经纬度(签到地点),签到二维码...

    App定位偱迹软件--项目说明书

    【App定位偱迹软件--项目说明书】 该项目旨在开发一款Android手机应用,旨在解决公交和校内电瓶车(小绿)的定时不定点问题,为用户提供实时追踪和定位服务,同时结合社交功能以增强用户体验。以下是项目的核心知识...

    app定位+定时提交坐标信息到服务器

    在移动应用开发中,"app定位+定时提交坐标信息到服务器"是一个常见的需求,尤其对于导航、社交、物流等类型的应用。这个功能涉及到多个技术层面,包括地理定位、网络通信、定时任务以及服务器端的数据处理。 1. **...

    WiFiScan.zip_wifi指纹库_安卓app_室内定位_指纹室内定位_指纹库定位

    这个应用程序可以帮助用户在特定环境中收集WiFi信号强度数据,构建一个WiFi指纹库,从而实现基于WiFi信号的室内定位功能。WiFi指纹室内定位是一种利用无线网络信号特征进行位置识别的技术,它在诸如购物中心、机场、...

Global site tag (gtag.js) - Google Analytics