Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 937|回复: 0

[实例教程]Android客户端GPS定位源码 学习

[复制链接]

该用户从未签到

发表于 2011-10-22 14:22:03 | 显示全部楼层 |阅读模式
AndroidManifest.xml文件配置

<?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文件

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);
        
        //获得服务供应商
        Stringprovider=locationManager.getBestProvider(criteria, true);
        //获取上一个定位点
        Locationlocation=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-generatedmethod stub
           
       }
      
       @Override
       public void onProviderDisabled(String provider) {
           // TODO Auto-generatedmethod 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-generatedmethod stub
       return false;
    }
}
注1:如果你的手机上没有gps定位系统,会有以下错误
08-10 13:04:55.610:ERROR/AndroidRuntime(492): java.lang.RuntimeException: Unable to start activityComponentInfo{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,你用不好使
<com.google.android.maps.MapView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
android:apiKey="0EITsWoXq7NC_mgKW6yIxIViNLhMGsIW4dbmlsg
                 />
最终实现效果:随着android客户端得移动,在地图上提供精确的当前所在位置
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:22:07 | 显示全部楼层
这必须得用真机测试吧。我没有真机,没法测试。还有,在公司开发是不是提供真机测试啊?还是得自己买手机?
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:22:15 | 显示全部楼层
一般的都有真机的...
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:22:22 | 显示全部楼层
老大 ,,你太给力了。。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:22:31 | 显示全部楼层
非常好,真的很给力
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 14:22:35 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-22 19:43 , Processed in 0.360524 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表