首页 » 技术分享 » Android 基于4G模块 GPS定位

Android 基于4G模块 GPS定位

 

获取定位信息,测试前先确定打开,位置信息

package com.example.testactivity.service;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import com.cosofteck.Can;
import com.cosofteck.CanFrame;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;

/*
 * GPS 经纬�? 海拔 星数等信息的获取
 * @author Ting9
 * @Date 20180609
 */

public class GpsService extends Service {

    public static Location   mLocation    = null; // new Location("");
    /* GPS相关的数据的全局变量 */
    private String           longitude    = " "; // 经度
    private String           latitude     = " "; // 纬度
    private String           bearing      = " "; // 方位
    private String           altitude     = " "; // 海拔
    private String           satelliteNum = " "; // 卫星数目
    private String           gpsSpeed     = " "; // 速度
    private String           gpsTime      = " "; // GPS时间

    private LocationManager  locationManager;
    private String           provider;

    public static GpsService gpsService   = null;

   
    
    class GpsDataAcquire extends Binder {

        public GpsService getServiceInstance() {
            // 返回实例
            return GpsService.this;
        }

        public String getLongitude() {
            return longitude;
        }

        public String getLatitude() {
            return latitude;
        }

        public String getBearing() {
            return bearing;
        }

        public String getAltitude() {
            return altitude;
        }

        public String getSatelliteNum() {
            return satelliteNum;
        }

        public String getGpsSpeed() {
            return gpsSpeed;
        }

        public String getGpsTime() {
            return gpsTime;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // 此处如果不返回一个Binder实例,onServiceConnected不会调用
        return new GpsDataAcquire();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        gpsService = this;

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 获取有效的provider,并显示出来
        List<String> providerList = locationManager.getProviders(true);
        if (providerList.contains(LocationManager.GPS_PROVIDER)) {
            provider = LocationManager.GPS_PROVIDER;
        } else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
            provider = LocationManager.NETWORK_PROVIDER;
        } else {
            Toast.makeText(this, "没有可用的位置提供器", Toast.LENGTH_SHORT).show();
            return;
        }
        // 获取�?后一次定位信�?
        Location location = locationManager.getLastKnownLocation(provider);
        if (location != null) {
            System.out.println("location 有值-----");
            showLocation(location);    //返回位置信息
        }

        System.out.println("位置信息 ==== " + location);

        // gps位置监听设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0�?
        locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
        // GPS状�?�监控,设置状�?�监听回调函数,statusListener是监听的回调函数
        locationManager.addGpsStatusListener(statusListener);

//        CanStart();
    }

    // CAN 连接
//    public void CanStart() {
        // TODO Auto-generated method stub
        // 设置比特率
//        Can.SetBitrate(250000);
//        Can.Start();
//       System.out.println("CAN 连接---");
        // 接收数据线程
//       Can.ReadInit(29, 3, 1); // 接收初始化
//   }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    
//    --------------------------

    
    
    

    @Override
    public void onDestroy() {

        if (locationManager != null) {
            locationManager.removeUpdates(locationListener);
        }
        super.onDestroy();
    }

    // 卫星信号
    private List<GpsSatellite>       numSatelliteList = new ArrayList<GpsSatellite>();
    // GpsStatus监听器,处理卫星返回的数�?
    private final GpsStatus.Listener statusListener   = new GpsStatus.Listener() {

                                                          // GPS状�?�变化时的回调,如卫星数
                                                          public void onGpsStatusChanged(int event) {
                                                              // GPS状�?�变化时的回调,获取当前的状�?
                                                              GpsStatus status = locationManager.getGpsStatus(null); // 取当前状�?
                                                              // 自己编写的方法,获取卫星状�?�相关数�?
                                                              updateGpsStatus(event, status);


                                                          }
                                                      };

    /*
     * 获取搜索到的卫星 获取搜索到的卫星数目,主要是通过status.getSatellites()实现。
     * 获取到的GpsSatellite对象�? 保存到一个队列里面,用于后面刷新界面。上面是获取GPS状�?�监听器,
     * 除了GPS状�?�外,我们还�?要监听一个服务, 就是:LocationListener,定位监听器,监听位置的变化
     */
    private String updateGpsStatus(int event, GpsStatus status) {

        StringBuilder sb2 = new StringBuilder("");
        if (status == null) {
            sb2.append("搜索到卫星个数:" + 0);
        } else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
            // 获取�?大的卫星�?(预设�?)
            int maxSatellites = status.getMaxSatellites();
            Iterator<GpsSatellite> it = status.getSatellites().iterator();
            numSatelliteList.clear();
            // 记录实际的卫星数
            int count = 0;
            while (it.hasNext() && count <= maxSatellites) {
                // 保存卫星的数据到�?个队列,用于刷新界面
                GpsSatellite s = it.next();
                numSatelliteList.add(s);
                count++;
            }
            sb2.append("搜索到卫星个数:" + numSatelliteList.size());
        }
        satelliteNum = numSatelliteList.size() + ""; // 卫星数目

        return sb2.toString();
    }

    /*
     * LocationListener,定位监听器,监听位置的变化 获取到当前的GPS数据。另外我们可以�?�过回调函数提供的location参数�? 获取GPS的地理位置信息,包括经纬度经度、海拔等信息�?
     */
    LocationListener locationListener = new LocationListener() {

                                          @Override
                                          public void onStatusChanged(String provider, int status, Bundle extras) {
                                              // Provider的状态在可用、暂时不可用和无服务三个状�?�直接切换时触发此函�?
                                          }

                                          @Override
                                          public void onProviderEnabled(String provider) {
                                              // Provider被enable时触发此函数,比如GPS被打�?
                                          }

                                          @Override
                                          public void onProviderDisabled(String provider) {
                                              // Provider被disable时触发此函数,比如GPS被关�?
                                          }

                                          @Override
                                          public void onLocationChanged(Location location) {
                                              // TODO Auto-generated method stub
                                              // 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触�?
                                              showLocation(location);
                                              mLocation = location;

                                          }
                                      };

    /*
     * 通过回调函数提供的location参数,获取GPS的地理位置信息,包括经纬度经度、海拔等信息
     */
    /**
     * @param location
     */
    private void showLocation(Location location) {
        // 时间
        long GpsTime = location.getTime();
        // 利用Date进行时间的转�?
        Date date = new Date(GpsTime);
        location.getExtras().putString("LOCATION_PROVIDER", "GPS_CFG_GPS");
        // 用于格式化十进制数字
        DecimalFormat df = new DecimalFormat();

        df.applyPattern("###.000000");
        // 经度
        longitude = df.format(location.getLongitude());
        // 纬度
        latitude = df.format(location.getLatitude());

        System.out.println("经度 ==  " + longitude + "  纬度 == " + latitude);

        if (location.getSpeed() < 2) {
            df.applyPattern("####0.00");
            // 方向
            bearing = df.format(0) + "";

        } else {
            // 方位
            bearing = location.getBearing() + "";
        }
        // 海拔
        altitude = location.getAltitude() + "";
        df.applyPattern("####0.00");
        // GPS速度
        gpsSpeed = df.format(location.getSpeed()* 3.6) + "";     //m/s ---> km/h

        // GPS时间
        gpsTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);

     
    }
  
}

MainActivity中开启:

package com.explme.Activity;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.util.Log;
 
public class MainActivity extends Activity {
	private static final String TAG = "starttest";
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Intent intent = new Intent(MainActivity.this, GpsService.class);
                startService(intent);
		Log.d(TAG, "onCreate0");
	}
 
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
 

清单文件中;注册GPS

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testactivity"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-permission android:name="android.permission.INTERNET" />          <!-- 互联网 -->

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher_camera"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.testactivity.MainActivity"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <service
            android:name="com.example.testactivity.GpsService"
            android:launchMode="singleTask" >
        </service>
      
    </application>

</manifest>

 

转载自原文链接, 如需删除请联系管理员。

原文链接:Android 基于4G模块 GPS定位,转载请注明来源!

0