android获取当前经纬度,并用地图显示跟踪

最近做了一个android的小东西(愁了一星期 android获取当前经纬度,并用地图显示跟踪 ):通过手机获取当前经纬度,通过线程(异步)时时通过socket向服务器发送定位数据,并调用google地图来追踪,并用textView来显示运行时的日志。关于怎样试用google地图这里就不啰嗦了,还用到了一些协议的解析和封装的,也就省略了
在配置文件中添加的权限:
 1. <!-- 声明链接换联网的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 声明获取GPS定为的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2. 在application中activity外添加 <uses-library android:name="com.google.android.maps" /> (google地图用到的,详细试用请百度)
第一部分Activity:

package com.unite;

import java.util.List;

import unite.xieyi.CongXieYi;
import unite.xieyi.XieYi;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.overlay.FirstOverlay;

public class UniteActivity extends MapActivity {
     

     
     
       //声明控件
       private Button xianshi;
       private Button shezhi;
       private Button openGPS;
       private Button close;
       private Button map;
       private WebView view;
       private MapView mapView;
       private TextView logtext;
       private ImageView image;
       MyHandler myHandler;
       String Ip;//Ip
       String port;//端口号
       String fID ;//车场ID
       String sId ;//车载机ID
       int   lan   ;//纬度
       int lon ;//经度
       boolean i = false;
       int hui = 0;
       int ce = 10;//10为没有GPS信号,11为有信号
       public void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               setContentView(R.layout.gps);
               //获取传过来的值
               Intent it1 = getIntent();
              fID = it1.getStringExtra("FactoryId");
               sId = it1.getStringExtra("SimId");
             
               //通过id获得控件对象
               shezhi = (Button) findViewById(R.id.shezhi);
               xianshi = (Button) findViewById(R.id.xianshi);
               openGPS = (Button) findViewById(R.id.openGPS);
               close = (Button) findViewById(R.id.close);
               map = (Button) findViewById(R.id.map);
               view = (WebView) findViewById(R.id.View);
               image = (ImageView) findViewById(R.id.image);
               mapView = (MapView) findViewById(R.id.mapview);//获得MapView对象 
               logtext = (TextView) findViewById(R.id.logtext);
               logtext.setMovementMethod(ScrollingMovementMethod.getInstance());//给textView添加滚动条
               mapView.setBuiltInZoomControls(true);//设置mapview用于缩放的工具条
             
               //将时间和BUtton控件绑定
               xianshi.setOnClickListener(new xianListener());
               shezhi.setOnClickListener(new sheListener());
               openGPS.setOnClickListener(new openGPSListener());
               map.setOnClickListener(new mapListener());
               close.setOnClickListener(new closeListener());
             
               xianshi.setClickable(false);//按钮不可用
               openGPS.setClickable(false);
               close.setClickable(false);
               map.setClickable(false);
             

             if(fID!=null){
                   xianshi.setClickable(true);
                     openGPS.setClickable(true);
             }
         
       }
       //关闭按钮事件处理
       class closeListener implements OnClickListener{
              @Override
              public void onClick(View arg0) {
                     i = true;
                     map.setClickable(false);
                     close.setClickable(false);
                     image.setVisibility(image.VISIBLE);
                     view.setVisibility(view.GONE);//改变显示状态为可见/不可见
                     mapView.setVisibility(mapView.GONE);
                     logtext.setText(logtext.getText().toString()+"\n"+"服务已关闭");
              }
       }
       //地图按钮事件
       class mapListener implements OnClickListener{
              @Override
              public void onClick(View arg0) {
                     if(lan > 0 && lon > 0){
                            image.setVisibility(image.GONE);
                            view.setVisibility(view.GONE);//改变显示状态为可见/不可见
                            mapView.setVisibility(mapView.VISIBLE);
                            openMap();
                     }else{
                            logtext.setText(logtext.getText().toString()+"\n"+"地图暂时无法打开");
                            //Toast.makeText(UniteActivity.this, "无法打开", Toast.LENGTH_SHORT).show();
                     }
              }
       }
       //打开地图
       private void openMap(){
              //mapView.setStreetView(true);//获取接到图片
              //得到所有的图层对象
               List<Overlay> mapOverlays = mapView.getOverlays();
               //清楚上一次的标记
               mapOverlays.removeAll(mapOverlays);
               //要显示的标记图片
               Drawable drawable = getResources().getDrawable(R.drawable.car_03);
               //得到第一个标记对象
               FirstOverlay firstOverlay = new FirstOverlay(drawable, UniteActivity.this);
               //通过经纬度指定地图的一个点
               GeoPoint point = new GeoPoint(lan,lon);
               //当点击标记时显示的内容
               OverlayItem overlayItem = new OverlayItem(point, "当前坐标", "经度:"+lon+"纬度:"+lan);
               //添加到标记中
               firstOverlay.addOverlay(overlayItem);
             
               mapOverlays.add(firstOverlay);
               mapView.getController().setCenter(point);//设置地图中心 
               mapView.getController().setZoom(10);
       }
       //打开GPS按钮事件处理
       class openGPSListener implements OnClickListener{
              @Override
              public void onClick(View arg0) {
                            //获取IP和端口号
                               String Iport =   XieYi.getCongXieYi();
                                  Ip = Iport.substring(0, 13);
                                  port = Iport.substring(13);
                                
                                  close.setClickable(true);
                                
                                  System.out.println("dddd:"+Iport);
                                  if(Iport !=null){
                                         logtext.setText(logtext.getText().toString()+"\n"+"主服务已连接");
                                         //Toast.makeText(UniteActivity.this, "主服务已连接", Toast.LENGTH_SHORT).show();
                                  }
                                  openGPSSettings();
                                
                                  //生成HandlerThread对象
                                  HandlerThread handlerThread = new HandlerThread("handler_thread");
                               //启动,必须要有
                               handlerThread.start();
                           
                               logtext.setText(logtext.getText().toString()+"\n"+"从服务已链接");
                               myHandler = new MyHandler(handlerThread.getLooper());
                               myHandler.post(firstThread);
              }
       }
       //显示按钮事件处理
       class xianListener implements OnClickListener{
              @Override
              public void onClick(View v) {
                     if(fID != "" && sId != ""){
                        image.setVisibility(image.GONE);
                        view.setVisibility(view.VISIBLE);
                        mapView.setVisibility(mapView.GONE);
                        String url = getIntent().getStringExtra("url");
                        // view.setInitialScale(1);//这个方法直接缩到最小
                        view.loadUrl(url);
                        view.setWebViewClient(new WebViewClientDemo());
                        logtext.setText(logtext.getText().toString()+"\n"+"远程车机已链接");
                     }else{
                              logtext.setText(logtext.getText().toString()+"\n"+"远程车机无法链接");
                     }
              }
       }
       //将webview 作为客户端,可以嵌套其他控件
       private class WebViewClientDemo extends WebViewClient {
               @Override
               // 在WebView中而不是默认浏览器中显示页面
               public boolean shouldOverrideUrlLoading (WebView view, String url) {
                       view.loadUrl(url);
                       return true;
               }
       }
   
       //设置按钮事件处理
       class sheListener implements OnClickListener{
              @Override
              public void onClick(View v) {
                     Intent it = new Intent();
                   
                     it.putExtra("FactoryId",fID);
                     it.putExtra("SimId", sId);
                    
                     it.setClass(UniteActivity.this, SheZhiActivity.class);
                   
                     UniteActivity.this.startActivity(it);
              }
       }
       //重写handler对象
       class MyHandler extends Handler{
              public MyHandler(){
              }
              public MyHandler(Looper looper){
                     //继承自父类的looper
                     super(looper);
              }
              public void handleMessage(Message msg){
                     try{
                       System.out.println("Thread ID:"+Thread.currentThread().getId());
                     
                       LocationManager locationManager= (LocationManager) UniteActivity.this.getSystemService(Context.LOCATION_SERVICE);
                      //选择LocatonProvider 为GPS定为方式,绑定监听器
                      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,new LocationListner() );
                      //获取最近一次得到的经纬度
                      Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // 通过GPS获取位置
                       if(ce == 11){
                     
                      if (location != null) {
                                double latitude = location.getLatitude();
                                double longitude= location.getLongitude();
                                lan = (int) (latitude*1E6);
                                lon = (int) (longitude*1E6);
                                //调用链接从服务
                                int d = CongXieYi.sendDingWei(Ip,port,longitude,latitude,sId,fID);
                            
                                if(d == 2){
                                       map.setClickable(true);//将map按钮状态改成可用
                                   
                                       //logtext.setText(logtext.getText().toString()+"\n"+"定位数据已发送");
                                }else{
                                     // logtext.setText(logtext.getText().toString()+"\n"+"从服务链接失败,请重试");
                                }
                                openMap();//打开地图
                                myHandler.post(firstThread);
                            
                          } else {
                                //logtext.setText(logtext.getText().toString()+"\n"+"无法获取经纬度,请重试");
                                myHandler.post(firstThread);
                          }     
                       }
                       if(ce == 10){
                                myHandler.post(firstThread);
                       }
                      }catch(Exception e){
                            e.printStackTrace();
                     }
              }
       }
   
       //实现线程
       Runnable firstThread = new Runnable() {
              @Override
              public void run() {
                            if(i == true){
                                   i = false;
                                   return;
                            }else{
                               System.out.println("Runnable Thread :" + Thread.currentThread().getId());
                               //通过Message对象传递参数 
                                  Message msg = new Message(); 
                              
                                  myHandler.sendMessage(msg);
                                  try {
                                   Thread.sleep(3000);
                            } catch (InterruptedException e) {
                                   // TODO Auto-generated catch block
                                   e.printStackTrace();
                            }
                            }
              }
       };
       //判断用户是否开启GPS,如果没有提示让其开启
       private void openGPSSettings() {
          LocationManager alm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
           if (alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
                   //Toast.makeText(this, "GPS模块正常", Toast.LENGTH_SHORT).show();
                   logtext.setText(logtext.getText().toString()+"\n"+"GPS模块正常");
                   return;
           }
         // Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
           Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
           startActivityForResult(intent,0); //此为设置完成后返回到获取界面
     
   }
       //获得经纬度
       private class LocationListner implements LocationListener{
              @Override
              public void onLocationChanged(Location location) {
                     if(location ==null){
                              System.out.println("asdasf");
                              myHandler.post(firstThread);
                              ce = 10;
                     }else{
                            ce=11;
                     //当经纬度改变时调用
                     //Toast.makeText(UniteActivity.this, "经度:"+location.getLongitude()+"纬度:"+location.getLatitude(), Toast.LENGTH_SHORT).show();
                     }
              }

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

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

              @Override
              public void onStatusChanged(String provider, int status, Bundle extras) {
                     // TODO Auto-generated method stub
              }
        
   }
       @Override
          protected boolean isRouteDisplayed() {
       // TODO Auto-generated method stub
       return false;
}
}
第三部分,xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       >

     
<LinearLayout android:id="@+id/layout2"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content">
       <ImageView android:id="@+id/image"
                     android:src="@drawable/unite"
                     android:layout_width="fill_parent"
                     android:layout_height="330dip"/>                   
          <WebView android:id="@+id/View"
                 android:layout_weight="1"
                  android:layout_width="fill_parent"
                  android:layout_height="330dip"
                  android:visibility="gone"
                  />
         <com.google.android.maps.MapView
                            android:id="@+id/mapview"
                                 android:layout_width="fill_parent"
                                 android:layout_weight="1"
                                 android:layout_height="330dip"
                                 android:enabled="true"
                                 android:clickable="true"
                                 android:visibility="gone"
                                 android:apiKey="0uMk_6S4Pafz3Ez57nyxl2-0WWl_SGgwNOaVQKQ"
                                 />
       
     
       </LinearLayout>
<LinearLayout android:id="@+id/layou3"
       android:orientation="horizontal"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_marginBottom="0dip"
       >
       <Button android:id="@+id/xianshi"
              android:layout_weight="1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:clickable="false"
              android:textSize="10dip"
              android:layout_margin="0dip"
              android:text="显示"/>
       <Button android:id="@+id/openGPS"
              android:layout_weight="1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="10dip"
              android:layout_margin="0dip"
              android:text="打开服务"/>
       <Button android:id="@+id/close"
              android:layout_weight="1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="10dip"
              android:layout_margin="0dip"
              android:text="关闭服务"/>
       <Button android:id="@+id/map"
              android:textSize="10dip"
              android:layout_weight="1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_margin="0dip"
              android:text="地图"/>
       <Button android:id="@+id/shezhi"
              android:layout_weight="1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:textSize="10dip"
              android:layout_margin="0dip"
              android:text="设置"/>
       </LinearLayout>
<LinearLayout android:id="@+id/layou3"
       android:orientation="horizontal"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_marginBottom="0dip"
       >

       <TextView android:id="@+id/logtext"
              android:layout_width="fill_parent"
              android:layout_height="50dip"
              android:textSize="10dip"
              android:scrollbars="vertical"
              android:singleLine="false"
              android:maxLines="100"
              android:text="跟踪日志"/>

       </LinearLayout>
</LinearLayout>

第四部分:显示效果
android获取当前经纬度,并用地图显示跟踪


具体的流程:点击“设置”会跳转到一个页面(此时只有设置按钮可用),得到车场ID和车载机ID后返回该页面(此时"显示"和"打开服务"和"设置"按钮可用),点击"显示"按钮可以连接到远程车机网页,点击"打开服务"按钮可以开启线程通过socket向服务器发送定位信息了(此时"关闭服务"和"地图"也变成可用的),点击"地图"就可以打开google地图了,因为线程在执行所以当你的经纬度改变时在地图上也可以跟踪了,"关闭服务"关闭线程
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值