Android保证首次获取到的location对象不为空的解决方案
2016-02-11 15:17
477 查看
在阅读《第一行代码》和《疯狂android讲义》后,得到的启发式解决方案。
如果仅以GPS_PROVIDER获取location对象,那么在onCreate方法中,location一般都会为空,且在室内无法测试。
所以有了如下简单的解决方案:
用到的权限:
如果仅以GPS_PROVIDER获取location对象,那么在onCreate方法中,location一般都会为空,且在室内无法测试。
所以有了如下简单的解决方案:
package com.example.locationtest; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.widget.TextView; public class MainActivity extends ActionBarActivity { LocationManager locationManager; TextView textView; Location location; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textView); locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // 获取location对象 location = getBestLocation(locationManager); updateView(location); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 8, new LocationListener() { @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { updateView(locationManager .getLastKnownLocation(provider)); } @Override public void onProviderDisabled(String provider) { updateView(null); } @Override public void onLocationChanged(Location location) { location = getBestLocation(locationManager);// 每次都去获取GPS_PROVIDER优先的location对象 updateView(location); } }); } private void updateView(Location location) { if (location != null) { StringBuffer sb = new StringBuffer(); sb.append("位置信息:\n"); sb.append("经度:" + location.getLongitude() + ", 纬度:" + location.getLatitude()); textView.setText(sb.toString()); } else { textView.setText(""); } } /** * 获取location对象,优先以GPS_PROVIDER获取location对象,当以GPS_PROVIDER获取到的locaiton为null时 * ,则以NETWORK_PROVIDER获取location对象,这样可保证在室内开启网络连接的状态下获取到的location对象不为空 * * @param locationManager * @return */ private Location getBestLocation(LocationManager locationManager) { Location result = null; if (locationManager != null) { result = locationManager .getLastKnownLocation(LocationManager.GPS_PROVIDER); if (result != null) { return result; } else { result = locationManager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); return result; } } return result; } }布局文件如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.locationtest.MainActivity" > <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
用到的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>
相关文章推荐
- Android之图片加载库Picasso源码分析
- Android之Context详解
- Android应用安全开发之防范无意识的数据泄露
- android——error opening trace file: No such file or directory (2)
- 【Android】7.6 FrameLayout(帧布局)
- 【Android】7.5 RelativeLayout(相对布局)
- Android 的性能 II-性能提升技巧
- 【Android】7.4TableLayout(表格布局)
- Android短信大全案例
- Android Studio—— 关于在Android Studio中使用Assets目录下的资源的问题
- Android——内存调试
- android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
- Android学习笔记二
- android 文件上传
- 说说Android的MVP模式
- ADB问题解决(Android Debug Bridge)
- 解决Android 工程出现 unable to get system library for the project 异常
- android 多线程下载
- Android—启动模式
- android第一屏和一到引导界面