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; } }
相关文章推荐
- Android手机GPS卫星定位与通过WLAN与移动网络定位的区别?
- Android无网络状态下使用GPS定位到省市县的一种简单实现方式
- android 基于GPS或网络定位学习(LocationManager)
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- android中基于网络和GPS的不同精度定位
- android 实现非GPS 手机定位
- 昨天学习的linux下adb fastboot命令来使用android手机
- Android手机应用开发之手机GPS定位
- 关于TelephonyManager的使用与手机电池电量小知识(Android学习随笔五)
- android网络-GoogleMap之GPS定位
- Android使用Google Map服务 - 根据GPS信息在地图上定位
- 教程:实现Android的不同精度的定位(基于网络和GPS)
- Android入门:使用Android GPS实现简单的定位
- android学习——ConnectivityManager 简单的使用 判断网络状态
- Android使用Google Map服务 - 根据GPS信息在地图上定位
- android使用GPS定位及在googlemap添加标记
- 实现Android的不同精度的定位(基于网络和GPS)
- Android手机虚拟CD-ROM流程 && 使用网络同步时间(NITZ和NTP)&& Android VOLD
- 22、Android之 使用手机的 GPS 功能
- Android学习指南之三十:使用URLConnection和HttpClient访问网络的方法