zoukankan      html  css  js  c++  java
  • Android客户端GPS定位

    AndroidManifest.xml文件配置:

    View Code
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package
    ="cn.itcast.main"
    android:versionCode
    ="1"
    android:versionName
    ="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Main"
    android:label
    ="@string/app_name">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    <uses-library android:name="com.google.android.maps" />
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FIND_LOCATION" />
    </manifest>

    Main.java文件:

    View Code
    package cn.itcast.main;
    import java.util.List;
    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;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    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.view.MotionEvent;
    import android.widget.TextView;

    public class Main extends MapActivity{
    private MapController mapController;
    private GeoPoint geoPoint;
    private String msg;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //获得mapview
    MapView mapView=(MapView) this.findViewById(R.id.mapview);
    //地图的显示格式为交通图
    mapView.setTraffic(true);
    //设置可控
    mapView.setClickable(true);
    mapView.setEnabled(true);
    mapView.setBuiltInZoomControls(true);

    //得到gps设备的访问
    LocationManager locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //设置gps定位配置
    Criteria criteria=new Criteria();
    //设置显示精度
    criteria.setAccuracy(Criteria.ACCURACY_COARSE);
    //是否获得海拔数据
    criteria.setAltitudeRequired(false);
    //是否获得方向数据
    criteria.setBearingRequired(false);
    //是否允许运营商计费
    criteria.setCostAllowed(true);
    //设置耗电程度
    criteria.setPowerRequirement(Criteria.POWER_LOW);

    //获得服务供应商
    String provider=locationManager.getBestProvider(criteria, true);
    //获取上一个定位点
    Location location=locationManager.getLastKnownLocation(provider);
    //获得gps定位坐标信息
    Double latitude=location.getLatitude()*1E6;
    Double longitude=location.getLongitude()*1E6;
    //获得卫星定位点
    geoPoint=new GeoPoint(latitude.intValue(),longitude.intValue());

    //获得地图控制器
    mapController=mapView.getController();
    //设置地图显示初始化精度
    mapController.setZoom(12);
    mapController.animateTo(geoPoint);
    //实例化自定义绘图层
    MyOverlay myOverlay=new MyOverlay();
    //为mapview添加绘图层
    mapView.getOverlays().add(myOverlay);
    //定义一个final,TextView,以备子类引用
    final TextView textView=(TextView) findViewById(R.id.textview);
    LocationListener locationListener=new LocationListener() {

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


    }

    @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) {
    Double latitude=location.getLatitude()*1E6;
    Double longitude=location.getLongitude()*1E6;
    try {
    //获得精度纬度字符串
    msg = "经度:" + location.getLongitude() + "\n";
    msg += "纬度:" + location.getLatitude() + "\n";
    //根据经纬度获得改点地址信息
    Geocoder gc=new Geocoder(Main.this);
    List<Address> addresses=gc.getFromLocation(latitude, longitude, 1);
    if (addresses.size()>0) {
    //获得地址信息
    msg+="AddressLine:"+addresses.get(0).getAddressLine(0)+"\n";
    //获得国家名
    msg += "CountryName:" + addresses.get(0).getCountryName()+"\n";
    msg += "Locality:" + addresses.get(0).getLocality() + "\n";
    msg += "FeatureName:" + addresses.get(0).getFeatureName();
    }
    textView.setText(msg);
    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    };
    //注册位置监听器,1秒钟扫描1次
    locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);

    }


    class MyOverlay extends Overlay{
    //保证触控事件不重复操作
    private int count=0;
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
    long when) {
    //定义画笔
    Paint paint=new Paint();
    paint.setColor(Color.RED);
    //定义屏幕点
    Point screenPoint=new Point();
    //gps点转屏幕点
    mapView.getProjection().toPixels(geoPoint, screenPoint);
    //获得gps标志点图片
    Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.flag);
    //绘制gps点图片
    canvas.drawBitmap(bitmap, screenPoint.x,screenPoint.y, paint);
    //绘制文字说明
    canvas.drawText("当前位置", screenPoint.x, screenPoint.y, paint);
    return super.draw(canvas, mapView, shadow, when);
    }

    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
    //定义一个屏幕点
    Point screenPoint=new Point();
    //把gps点变成屏幕点
    mapView.getProjection().toPixels(geoPoint, screenPoint);
    //获得触点坐标
    int currentX=(int) e.getX();
    int currentY=(int) e.getY();
    //在50,30范围内触碰,显示当前经纬度
    if ((currentX-screenPoint.x)>=0&&(currentX-screenPoint.x)<50
    &&(currentY-screenPoint.y>=0)&&(currentY-screenPoint.y)<30) {
    if (count==0) {
    new AlertDialog.Builder(Main.this).setMessage(msg)
    .setPositiveButton("确定",new OnClickListener(){

    @Override
    public void onClick(DialogInterface dialog, int which) {
    count=0;
    }

    }).show();
    }
    count++;
    }
    return super.onTouchEvent(e, mapView);
    }

    }


    @Override
    protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
    }
    }

    注1:如果你的手机上没有gps定位系统,会有以下错误

    08-10 13:04:55.610: ERROR/AndroidRuntime(492): java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.itcast.main/cn.itcast.main.Main}: java.lang.IllegalArgumentException: provider==null

    注2:记得去google官网

    http://code.google.com/intl/zh-CN/android/maps-api-signup.html

    申请自己机器的apikey

    C:\Documents and Settings\Administrator\.android>keytool -list -keystore debug.kEystore

    默认密码android

    我机器的apikey,你用不好使

    View Code
      <com.google.android.maps.MapView
    android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent"
    android:apiKey
    ="0EITsWoXq7NC_mgKW6yIxIViNLhMGsIW4dbmlsg
    />

    最终实现效果:随着android客户端得移动,在地图上提供精确的当前所在位置



  • 相关阅读:
    Scrapy shell调试返回403错误
    android 获取 imei号码
    查找目录下的所有文件中是否含有某个字符串
    自动生成和配置ES的安全证书
    docker构建本地私有镜像
    ELK容器化部署
    Rancher使用基础知识1
    jenkins自动打包部署流水线
    ansible管理windows主机
    jenkins集成gitlab自动构建打包
  • 原文地址:https://www.cnblogs.com/androidsj/p/2379052.html
Copyright © 2011-2022 走看看