Android下实现GPS定位服务
1.申请Google API Key,参考前面文章
2.实现GPS的功能需要使用模拟器进行经纬度的模拟设置,请参考前一篇文章进行设置
3.创建一个Build Target为Google APIs的项目
4.修改Androidmanifest文件:
- <uses-library android:name="com.google.android.maps" />
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
5.修改main.xml文件
- <com.google.android.maps.MapView
- android:id="@+id/MapView01"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:apiKey="0f8FBFJliR7j_7aNwDxClBv6VW8O12V2Y21W_CQ"/>
注意:这里的apiKey值请相应修改为自己的key值
6.代码清单:
- package com.hoo.android.LocationMap;
- import java.io.IOException;
- import java.util.List;
- import java.util.Locale;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.graphics.Point;
- import android.location.Address;
- import android.location.Criteria;
- import android.location.Geocoder;
- import android.location.Location;
- import android.location.LocationListener;
- import android.location.LocationManager;
- import android.os.Bundle;
- import android.widget.TextView;
- import com.google.android.maps.GeoPoint;
- import com.google.android.maps.MapActivity;
- import com.google.android.maps.MapController;
- import com.google.android.maps.MapView;
- import com.google.android.maps.Overlay;
- public class ActivityLocationMap extends MapActivity
- {
- public MapController mapController;
- public MyLocationOverlay myPosition;
- public MapView myMapView;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //取得LocationManager实例
- LocationManager locationManager;
- String context=Context.LOCATION_SERVICE;
- locationManager=(LocationManager)getSystemService(context);
- myMapView=(MapView)findViewById(R.id.MapView01);
- //取得MapController实例,控制地图
- mapController=myMapView.getController();
- //设置显示模式为街景模式
- myMapView.setStreetView(true);
- //*************使用系统自带的控件放大缩小视图***************************
- //取得MapController对象(控制MapView)
- mapController = myMapView.getController();
- //设置地图支持设置模式
- myMapView.setEnabled(true);
- //设置地图支持点击
- myMapView.setClickable(true);
- //设置缩放控制,这里我们自己实现缩放菜单
- myMapView.displayZoomControls(true);
- myMapView.setBuiltInZoomControls(true);
- //*******************************************************************
- ////设置设置地图目前缩放大小倍数(从1到21)
- mapController.setZoom(17);
- //设置使用MyLocationOverlay来绘图
- myPosition=new MyLocationOverlay();
- List<Overlay> overlays=myMapView.getOverlays();
- overlays.add(myPosition);
- //设置Criteria(标准服务商)的信息
- Criteria criteria =new Criteria();
- //*****设置服务商提供的精度要求,以供筛选提供商************************
- criteria.setAccuracy(Criteria.POWER_HIGH);//表明所要求的经纬度的精度
- criteria.setAltitudeRequired(false); //高度信息是否需要提供
- criteria.setBearingRequired(false); //压力(气压?)信息是否需要提供
- criteria.setCostAllowed(false); //是否会产生费用
- criteria.setPowerRequirement(Criteria.POWER_MEDIUM);//最大需求标准
- //*****************************************************
- //取得效果最好的criteria
- String provider=locationManager.getBestProvider(criteria, true);
- //得到坐标相关的信息
- Location location=locationManager.getLastKnownLocation(provider);
- //更新位置信息
- updateWithNewLocation(location);
- //注册一个周期性的更新,3000ms更新一次,0代表最短距离
- //locationListener用来监听定位信息的改变(OnLocationChanged)
- locationManager.requestLocationUpdates(provider, 3000, 0,locationListener);
- }
- //更新位置信息
- private void updateWithNewLocation(Location location)
- {
- String latLongString; //声明经纬度的字符串
- TextView myLocationText = (TextView)findViewById(R.id.TextView01);
- //初始化地址为没有找到,便于处理特殊情况
- String addressString="没有找到地址/n";
- if(location!=null)
- {
- //****************获取当前的经纬度,并定位到目标*************************
- //为绘制标志的类设置坐标
- myPosition.setLocation(location);
- //取得经度和纬度
- Double geoLat=location.getLatitude()*1E6;
- Double geoLng=location.getLongitude()*1E6;
- //将其转换为int型
- GeoPoint point=new GeoPoint(geoLat.intValue(),geoLng.intValue());
- //定位到指定坐标
- mapController.animateTo(point);
- //*********************************************************************
- double lat=location.getLatitude(); //获得经纬度
- double lng=location.getLongitude();
- latLongString="经度:"+lat+"/n纬度:"+lng; //设置经纬度字符串
- // double latitude=location.getLatitude();
- //double longitude=location.getLongitude();
- //根据地理位置来确定编码
- Geocoder gc=new Geocoder(this,Locale.getDefault());
- try
- {
- //取得地址相关的一些信息:经度、纬度
- List<Address> addresses=gc.getFromLocation(lat, lng,1);
- StringBuilder sb=new StringBuilder();
- if(addresses.size()>0)
- {
- Address address=addresses.get(0);
- for(int i=0;i<address.getMaxAddressLineIndex()-1;i++)
- sb.append(address.getAddressLine(i)).append(",");
- //获得地址sb.append(address.getLocality()).append("/n");
- //获得邮编sb.append(address.getPostalCode()).append("/n");
- sb.append(address.getCountryName());
- addressString=sb.toString();
- }
- }catch(IOException e){}
- }
- else
- {
- latLongString="没有找到坐标./n";
- }
- //显示
- myLocationText.setText("您当前的位置如下:/n"+latLongString+"/n"+addressString);
- }
- //监听位置信息的改变
- private final LocationListener locationListener=new LocationListener()
- {
- //当坐标改变时触发此函数
- public void onLocationChanged(Location location)
- {
- updateWithNewLocation(location);
- }
- //Provider被disable时触发此函数,比如GPS被关闭
- public void onProviderDisabled(String provider)
- {
- updateWithNewLocation(null);
- }
- //Provider被enable时触发此函数,比如GPS被打开
- public void onProviderEnabled(String provider){}
- //Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
- public void onStatusChanged(String provider,int status,Bundle extras){}
- };
- //方法默认是true,服务器所知的状态列信息是否需要显示
- protected boolean isRouteDisplayed()
- {
- return false;
- }
- class MyLocationOverlay extends Overlay
- {
- Location mLocation;
- //在更新坐标,以便画图
- public void setLocation(Location location)
- {
- mLocation = location;
- }
- @Override
- public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
- {
- super.draw(canvas, mapView, shadow);
- Paint paint = new Paint();
- Point myScreenCoords = new Point();
- // 将经纬度转换成实际屏幕坐标
- GeoPoint tmpGeoPoint = new GeoPoint((int)(mLocation.getLatitude()*1E6),(int)(mLocation.getLongitude()*1E6));
- mapView.getProjection().toPixels(tmpGeoPoint, myScreenCoords);
- //*********paint相关属性设置*********
- paint.setStrokeWidth(0);//文
- paint.setARGB(255, 255, 0, 0);
- paint.setStyle(Paint.Style.STROKE);
- //***********************************
- Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.green_dot);
- canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint);
- canvas.drawText("您目前的位置", myScreenCoords.x, myScreenCoords.y, paint);
- return true;
- }
- }
- }
代码参考网络,加以修改优化,谢谢
7.程序运行截图,前提是在命令行下输入geo fix 121.5 31.24(定位到上海东方明珠),在命令行下可以输入其他坐标,系统会根据坐标显示其他位置,如接着输入geo fix 113.325 23.113(定位到广州海心沙),不知为什么输入坐标的时候经常会不识别,有时能够成功而有时不行,郁闷,求解……


Android下实现GPS定位服务的更多相关文章
- 在iOS8下使用CLLocationManager定位服务需要系统授权
最近在ios8.0使用CLLocationManager定位服务,发现老不能定位,查看设置菜单中的项也是处于未知状态.想起之前都有一个弹出框提示用户是否允许定位,这次一直没有出现了.原来ios8.0下 ...
- android模拟器使用gps定位
在模拟器上获取GPS信息时,使用Location loc = LocationManager.getLastKnownLocation("gps");来获取location信息,但 ...
- Android入门之GPS定位详解
一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager. LocationManger locationMa ...
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- [android学习]android_gps定位服务简单实现
前言 gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接 ...
- 【Android】18.1 利用安卓内置的定位服务实现位置跟踪
分类:C#.Android.VS2015: 创建日期:2016-03-04 一.安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务.这种服务是通过电信运营商的无线电通信网络(如GS ...
- android 获取GPS定位
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xm ...
- 解决在iOS8环境下,当用户关闭定位服务总开关时,无法将APP定位子选项加入定位权限列表的问题
关键点:- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizati ...
- Android中通过GPS或NetWork获取当前位置的经纬度
今天在Android项目中要实现一个通过GPS或NetWork来获取当前移动终端设备的经纬度功能.要实现该功能要用到Android Framework 中的 LocationManager 类.下面我 ...
随机推荐
- ASP.NET的六种验证控件的使用
C# 中的验证控件分为一下六种 :1 CompareValidator:比较验证,两个字段的值是否相等,比如判断用户输入的密码和确认密码是否一致,则可以用改控件: 2 CustomValidator ...
- bzoj1433:[ZJOI2009]假期的宿舍
明显的二分图最大匹配. #include<cstdio> #include<cstring> #include<cctype> #include<algori ...
- OpenGL学习之路(五)
1 引子 不知不觉我们已经进入到读书笔记(五)了,我们先对前四次读书笔记做一个总结.前四次读书笔记主要是学习了如何使用OpenGL来绘制几何图形(包括二维几何体和三维几何体),并学习了平移.旋转.缩放 ...
- UpYun上传 401 Unauthorized
_upt=3b9b444a14059041252014-07-21 08:46:25,218 ERROR (com.UpYun:518) - Upload file error:<h1>4 ...
- chmod命令
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- andorid 进度条
SeekBar类似于ProgressBar,但是ProgressBar的主要功能是让用户知道目前的状态,而SeekBar的功能在于让用户调整进度,举个例子,在音乐播放器中,可以通过调整SeekBar来 ...
- Codeforces 611C New Year and Domino DP+容斥
"#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...
- JS兼容性处理
百度 - 终端适配API 适合服务器端使用.POST客户端传递的http头信息越多,得到的适配信息越准确.百度返回的数据为: 正确情况: { device_type :/*1:手机2:pc*/ os: ...
- 仿酷狗音乐播放器开发日志三——修复CEditUI的bug2
无意中发现了CEditUI控件的另一个bug,当我给播放器的搜索栏获取焦点时,这时再改变窗体大小,原本搜索栏应该对应着也改变大小,却发现CEditUI内嵌的edit控件没有跟着改变(如下图),跟着调试 ...
- ZeroR-baseline分类器
ZeroR分类器是一种最简单的分类器,这种方法仅仅根据历史数据统计规律,而选择一种概率最大的类别作为未知样本的分类结果,也就是说对于任意一个未知样本,分类结果都是一样的.ZeroR分类器简单的以多数类 ...