android利用GPS和高德地图获取定位案例

一、main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/text_location"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:editable="false" />

</LinearLayout>

二、activity

package com.mytest.huilife;

import java.util.Date;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

public class LocationActivity extends Activity {

    private static final String LOG_TAG = "LocationActivity";

    private LocationManager locationManager;
    private ProgressDialog progressDialog;
    private EditText textLoaction;
    private String loactionSoureFrom; // 定位数据来自哪,GPS,还是网络
    // private TimerTask timerTask;
    // private Timer timer;

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            if(progressDialog!=null){
                progressDialog.dismiss();
            }

            //更新界面位置信息
            updateTextLoaction();

        };
    };

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if (locationManager != null && locationListener != null) {
            locationManager.removeUpdates(locationListener);
        }

        // if (timer != null) {
        // timer.cancel();
        // }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.location);
        textLoaction = (EditText) this.findViewById(R.id.text_location);

        if (NetWorkUtil.isNetAvailable(this) == false) {
            Toast.makeText(this, "请打开网络连接", Toast.LENGTH_SHORT).show();
            return;
        }

        if (NetWorkUtil.isGPSAvailable(this)) {
            // 从GPS获取位置信息
            getLocationFromGPS();
        } else {

            // 如果GPS不可用
            new AlertDialog.Builder(this).setTitle("你是否要打开GPS?")
                    .setPositiveButton("是", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            // 让用户打开GPS
                            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivityForResult(intent, 0);
                        }

                    }).setNegativeButton("否", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 从网络获取位置信息
                            getLocationFromNetWork();
                        }
                    }).show();

        }

    }

    private double latitude; // 纬度
    private double longitude; // 经度
    private double altitude; // 海拔
    private String getLocationLastTime;

    private void updateTextLoaction() {
        // Log.v(LOG_TAG,"updateTextLoaction:"+"经度:"+longitude+",纬度:"+latitude+",海拔:"+altitude);
        textLoaction.setText("定位数据来自:" + loactionSoureFrom + ",\n经度:" + longitude + "\n纬度:" + latitude + ",\n海拔:"
                + altitude + ",获取时间:" + getLocationLastTime);

    }

    /**
     * 采用高德地图,执行网络定位,并在定位中显示等待
     */
    private void getLocationFromNetWork() {
        progressDialog = new ProgressDialog(LocationActivity.this);
        progressDialog.setMessage("正在定位中...");
        progressDialog.setCanceledOnTouchOutside(false);// 点击外部,进度提示框不会消失
        progressDialog.show();

        // 初始化高德地图定位
        initAmapLocation();

    }

    /**
     * 初始化高德定位
     */
    private void initAmapLocation() {
        LocationManagerProxy locationManagerProxy = LocationManagerProxy.getInstance(this);
        locationManagerProxy.setGpsEnable(false);
        locationManagerProxy.requestLocationData(LocationProviderProxy.AMapNetwork, 3 * 1000, 10,
                new AMapLocationListener() {

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {

                    }

                    @Override
                    public void onProviderEnabled(String provider) {

                    }

                    @Override
                    public void onProviderDisabled(String provider) {

                    }

                    @Override
                    public void onLocationChanged(Location location) {

                    }

                    @Override
                    public void onLocationChanged(AMapLocation amapLocation) {
                        if (amapLocation != null && amapLocation.getAMapException().getErrorCode() == 0) {
                            // 定位成功回调信息,设置相关消息
                            latitude = amapLocation.getLatitude();
                            longitude = amapLocation.getLongitude();
                            altitude = amapLocation.getAltitude();
                            Date date = new Date(amapLocation.getTime());
                            String dateStr = String.format("%d:%d %d", date.getHours(), date.getMinutes(),
                                    date.getSeconds());
                            getLocationLastTime = dateStr;
//                            Log.v(LOG_TAG, "(amap)位置发生改变," + "时间:" + dateStr + "经度:" + amapLocation.getLongitude()
//                                    + "纬度:" + amapLocation.getLatitude() + "海拔:" + amapLocation.getAltitude());
                            if (progressDialog != null) {
                                progressDialog.dismiss();
                            }

                            loactionSoureFrom = "amap";

                            // 发送消息,更新界面位置信息
                            handler.sendEmptyMessage(0);

                        }

                    }
                });
    }

    /**
     * 从GPS获取位置信息
     */
    private void getLocationFromGPS() {

        progressDialog = new ProgressDialog(LocationActivity.this);
        progressDialog.setMessage("正在定位中...");
        progressDialog.setCanceledOnTouchOutside(false);// 点击外部,进度提示框不会消失
        progressDialog.show();

        // 获取manager
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        String bestProvider = locationManager.getBestProvider(getCriteria(), true);
        Location location = locationManager.getLastKnownLocation(bestProvider);

        if (location != null) {

            Date date = new Date(location.getTime());
            String dateStr = String.format("%d:%d %d", date.getHours(), date.getMinutes(), date.getSeconds());
            getLocationLastTime = dateStr;
            longitude = location.getLongitude(); // 纬度
            latitude = location.getLatitude(); // 经度
            altitude = location.getAltitude(); // 海拔

            if (progressDialog != null) {
                progressDialog.dismiss();
            }

            loactionSoureFrom = "GPS";

            // 更新界面位置信息
            updateTextLoaction();

        } else {

//            Log.i(LOG_TAG, "从GPS获取数据为空");

            if (progressDialog != null) {
                progressDialog.dismiss();
            }

            loactionSoureFrom = "GPS";

            // Toast.makeText(this, "从GPS获取位置信息,得到数据为空",
            // Toast.LENGTH_SHORT).show();
            new AlertDialog.Builder(this).setTitle("GPS数据为空,改从网络?")
                    .setPositiveButton("是", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            getLocationFromNetWork();

                        }

                    }).setNegativeButton("否", null).show();

        }

        locationManager.addGpsStatusListener(gpsListener);

        // 绑定监听,有4个参数
        // 参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种
        // 参数2,位置信息更新周期,单位毫秒
        // 参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
        // 参数4,监听
        // 备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
        // 3秒更新一次,或最小位移变化超过1米更新一次;
        // 注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 1, locationListener);

    }

    /**
     * 设置查询条件
     *
     * @return
     */
    private Criteria getCriteria() {
        // 创建查询条件
        Criteria criteria = new Criteria();
        // 设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        // 设置是否要求速度
        criteria.setSpeedRequired(false);
        // 设置是否允许运营商收费
        criteria.setCostAllowed(false);
        // 设置是否需要方位信息
        criteria.setBearingRequired(false);
        // 设置是否需要海拔信息
        criteria.setAltitudeRequired(false);
        // 设置对电源的需求
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        return criteria;
    }

    /**
     * 位置监听
     */
    private LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
            // GPS状态为可见时
            case LocationProvider.AVAILABLE:
                // Log.i(LOG_TAG, "当前GPS状态为可见状态");
                break;
            // GPS状态为服务区外时
            case LocationProvider.OUT_OF_SERVICE:
                // Log.i(LOG_TAG, "当前GPS状态为服务区外状态");
                break;
            // GPS状态为暂停服务时
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                // Log.i(LOG_TAG, "当前GPS状态为暂停服务状态");
                break;
            }
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {
            Date date = new Date(location.getTime());
            String dateStr = String.format("%d:%d %d", date.getHours(), date.getMinutes(), date.getSeconds());
            getLocationLastTime = dateStr;
            longitude = location.getLongitude(); // 纬度
            latitude = location.getLatitude(); // 经度
            altitude = location.getAltitude(); // 海拔
            // Log.v(LOG_TAG, "GPS位置发生改变," + "时间:" + dateStr + "经度:" +
            // location.getLongitude() + "纬度:"
            // + location.getLatitude() + "海拔:" + location.getAltitude());

            if (progressDialog != null) {
                progressDialog.dismiss();
            }

            loactionSoureFrom = "GPS";

            // 发送消息,更新界面位置信息
            handler.sendEmptyMessage(0);

        }
    };

    /**
     * GPS状态监听
     */
    GpsStatus.Listener gpsListener = new GpsStatus.Listener() {

        @Override
        public void onGpsStatusChanged(int event) {
            switch (event) {
            case GpsStatus.GPS_EVENT_FIRST_FIX:
//                Log.v(LOG_TAG, "第一次定位");
                break;
            case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
//                Log.v(LOG_TAG, "卫星状态发生改变");
                break;
            case GpsStatus.GPS_EVENT_STARTED:
//                Log.v(LOG_TAG, "启动定位");
                break;
            case GpsStatus.GPS_EVENT_STOPPED:
//                Log.v(LOG_TAG, "结束定位");
                break;
            }

        }
    };

}

三、NetWorkUtil

package com.mytest.huilife;

import android.content.Context;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetWorkUtil {

    /**
     * 判断网络是否可用
     * @param context
     * @return
     */
    public static boolean isNetAvailable(Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netWorkInfo = connManager.getActiveNetworkInfo();
        if(netWorkInfo==null || !netWorkInfo.isAvailable()){
            return false;
        }

        return true;
    }

    /**
     * 判断GPS是否可用
     */
    public static boolean isGPSAvailable(Context context) {
        LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean net = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if(gps || net){
            return true;
        }
        return false;
    }    

}

四、AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mytest.huilife"
    android:versionCode="2"
    android:versionName="2" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="??????在此输入高德地图的key" />

        <activity
            android:name=".LocationActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".GPSActivity" >
        </activity>
        <activity android:name=".LocationActivity" >
        </activity>
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />

</manifest>

五、小结

1、导入高德地图的jar包(Android_Location_V1.2.0)。

2、用了一个手机卡的旧手机测试,GPS虽然打开,但获取数据为空,改用从网络获取。

3、上述引用,注意在androidmainfest.xml中配置高德地图的相关meta、权限等。

(具体配置参考官网:http://lbs.amap.com/api/android-location-sdk/guide/project/)

时间: 2024-10-04 00:11:37

android利用GPS和高德地图获取定位案例的相关文章

Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity版本为5.5,Androad Studio 2.3.1 接下来开始讲具体操作 首先是Androad Studio的基本配置 1.创建工程,空白的就行,反正也用不到界面布局 等待创建完成 2.新建库模块: 切换到Project视图 右击你的项目 新建一个库模块-用来负责与Unity交互 当然你也可以不

Android Studio之高德地图实现定位和3D地图显示

在应用开发中,地图开发是经常需要使用的"组件",国内比较出名的是就是百度地图和高德地图. 此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码. 效果如图: 首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息,如下图: 途中包含了发布版的SHA1安全码和测试版SHA1安全码,两者的值可以看  博客 :Android Studio apk打包,keystore.jks文件生成,根据keystore密钥获取SH

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终

Android学习十一:高德地图使用

写这篇文章主要有三个目的: 1.使用高德地图api定位 2.获取天气数据 3.编程练手 文件结构 清单文件信息说明: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.tonny" android:versionCode

高德地图获取当前屏幕中心点的经纬度

公司有个需求就是要随着屏幕的改变而载入附近的商户信息. 那么高德地图获取当前屏幕中心点的经纬度呢? 核心方法:aMap.setOnCameraChangeListener(this); 实现接口: @Override public void onCameraChange(CameraPosition position) { LatLng target = position.target; System.out.println(target.latitude + "jinjin------&quo

H5高德地图获取当前位置

<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="initial-scale=1.0, user-scalable=no, wi

Android 高德地图的定位,周边搜索

刚弄完这两个功能,当然是结合官网例子实现的.效果还行,稍作优化便可整合到app使用.在这里做一下总结,及说明下我的思路. 刚开始上手感觉比较乱学起来也比较累,方法,类太多,直接复制各种错,还不知道为什么这么做.现在我们一起交流下实现的思路: 1:定位:这是所有地图功能实现的基础,所以不管要实现诸如周边搜索啊,导航啊什么的都需要基于定位. 如何定位:官网上例子也很详细,主要是实现几个监听,并实现方法: aMap.setLocationSource(this);// 设置定位监听 //绑定监听 ma

高德地图之定位篇-----&gt;定位、预测天气、围栏、搜索周边、行踪轨迹

跟集成百度地图一样,首先获取KEY,获取方式(官方的截图) 这篇主要是讲解高德地图定位篇,高德地图定位篇跟高德地图篇是不同的sdk,分离开了... 来看下配置流程吧,配置是第一位的 1.从网站下载并解压得到定位包"Android_Location_V1.xx.jar". 2.开发工程中新建"libs"文件夹,将定位包拷贝到 libs 的根目录下.拷贝完成后的工程目录(以 V1.0.4 为例)如图所示: image 注意:若您在 Eclipse 上使用 adt22 版

高德地图获取骑行距离,路线规划

1 高德地图路线规划  http://lbs.amap.com/api/javascript-api/reference/route-search 2 获取骑行距离 function getrding() { var map = new AMap.Map("container", { resizeEnable: true, center: [116.397428, 39.90923],//地图中心点 zoom: 16 //地图显示的缩放级别 }); //两个经纬度 自己定位获取到 va