您的位置:首页 > 理论基础 > 计算机网络

Android学习之使用手机网络和GPS定位

2016-08-22 10:04 459 查看
package com.example.android;

import java.util.Iterator;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

/**
*
* @author linzhiyong
* @time Aug 12, 2016 10:31:40 AM
* @email wflinzhiyong@163.com
*/
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {

private static final String TAG = MainActivity.class.getSimpleName();
private double latitude = 0.0;
private double longitude = 0.0;
private double latitude1 = 0.0;
private double longitude1 = 0.0;
private TextView info, networkInfo;
private LocationManager locationManager;
private	int count = 0;

private Handler handler = new Handler();
private Runnable runnable = new Runnable() {

@Override
public void run() {
final Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if(location != null) {
latitude1 = location.getLatitude();
longitude1 = location.getLongitude();
}
MainActivity.this.runOnUiThread(new Runnable() {

@Override
public void run() {
networkInfo.setText("网络定位:" + "\n" + "纬度:" + latitude1 + "\n" + "经度:" + longitude1);
}
});
handler.postDelayed(runnable, 1000);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
info = (TextView) findViewById(R.id.tv);
networkInfo = (TextView) findViewById(R.id.tv_1);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.addGpsStatusListener(listener);

// gps未打开
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Toast.makeText(this, "未开启GPS!", Toast.LENGTH_SHORT).show();
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
info.setText("纬度:" + latitude + "\n" + "经度:" + longitude);
handler.postDelayed(runnable, 1000);
}

/**
* 位置监听器
*/
LocationListener locationListener = new LocationListener() {
// Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println();
}

// Provider被enable时触发此函数,比如GPS被打开
@Override
public void onProviderEnabled(String provider) {
Log.e(TAG, provider);
}

// Provider被disable时触发此函数,比如GPS被关闭
@Override
public void onProviderDisabled(String provider) {
Log.e(TAG, provider);
}

// 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
@Override
public void onLocationChanged(Location location) {
if (location != null) {
Log.e("Map", "Location changed : Lat: " + location.getLatitude() + " Lng: " + location.getLongitude());
latitude = location.getLatitude(); // 经度
longitude = location.getLongitude(); // 纬度
}
MainActivity.this.runOnUiThread(new Runnable() {

@Override
public void run() {
info.setText("纬度:" + latitude + "\n" + "经度:" + longitude + "\n" + "搜索到:" + count + "颗卫星");
}
});
}
};

StringBuffer buffer = new StringBuffer();
/**
* 状态监听
*/
GpsStatus.Listener listener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
switch (event) {
// 第一次定位
case GpsStatus.GPS_EVENT_FIRST_FIX:
Log.i(TAG, "第一次定位");
break;
// 卫星状态改变
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
Log.i(TAG, "卫星状态改变");
// 获取当前状态
GpsStatus gpsStatus = locationManager.getGpsStatus(null);
// 获取卫星颗数的默认最大值
int maxSatellites = gpsStatus.getMaxSatellites();
// 创建一个迭代器保存所有卫星
Iterator<GpsSatellite> iters = gpsStatus.getSatellites()
.iterator();
count= 0;
buffer = null;
buffer = new StringBuffer();
while (iters.hasNext() && count <= maxSatellites) {
GpsSatellite s = iters.next();
// //卫星的方位角,浮点型数据
// System.out.println("卫星的方位角,浮点型数据"+s.getAzimuth());
// //卫星的高度,浮点型数据
// System.out.println(""+s.getElevation());
// 卫星的伪随机噪声码,整形数据
System.out.println("----卫星的伪随机噪声码,整形数据  :" + s.getPrn());
// 卫星的信噪比,浮点型数据, > 实测20 可以定位(35)
System.out.println("----卫星的信噪比,浮点型数据 : " + s.getSnr());
// //卫星是否有年历表,布尔型数据
// System.out.println(s.hasAlmanac());
// //卫星是否有星历表,布尔型数据
// System.out.println(s.hasEphemeris());
// //卫星是否被用于近期的GPS修正计算
// System.out.println(s.hasAlmanac());
count++;
buffer.append("\n");
buffer.append("卫星的伪随机噪声码,整形数据  :" + s.getPrn());
buffer.append("\n");
buffer.append("卫星的信噪比,浮点型数据 : " + s.getSnr());
}
System.out.println("搜索到:" + count + "颗卫星");
MainActivity.this.runOnUiThread(new Runnable() {

@Override
public void run() {
info.setText("纬度:" + latitude + "\n" + "经度:" + longitude + "\n" + "搜索到:" + count + "颗卫星" + buffer.toString());
}
});
break;
// 定位启动
case GpsStatus.GPS_EVENT_STARTED:
Log.i(TAG, "定位启动");
break;
// 定位结束
case GpsStatus.GPS_EVENT_STOPPED:
Log.i(TAG, "定位结束");
break;
}
};
};

protected Criteria getCriteria() {
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); // 设置定位精度
criteria.setSpeedRequired(false); // 设置是否要求速度
criteria.setCostAllowed(false); // 设置是否允许收费
criteria.setBearingRequired(true); // 方位
criteria.setAltitudeRequired(true); // 海拔
criteria.setPowerRequirement(Criteria.POWER_LOW); // 电源设置
return criteria;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息