我正在尝试跟踪我的应用程序中使用的gps位置,
这是我的代码,
public class GetGpsCoordinates extends Service implements LocationListener {
boolean isGPSEnabled ;
boolean isNetworkEnabled ;
boolean canGetLocation ;
Location location;
double latitude;
double longitude;
// The minimum distance to change Updates in meters
public static final float MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10
// meters
// The minimum time between updates in milliseconds
public static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
private final Context Context = GetGpsCoordinates.this;
public final android.content.Context mContext = GetGpsCoordinates.this;
LocationManager locationManager;
public Location getLocation() {
try {
int chkGooglePlayServices = GooglePlayServicesUtil
.isGooglePlayServicesAvailable(Context);
if (chkGooglePlayServices != ConnectionResult.SUCCESS) {
GooglePlayServicesUtil.getErrorDialog(chkGooglePlayServices,
(Activity) mContext, 1122).show();
} else {
locationManager = (LocationManager) getSystemService(mContext.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
我不知道我缺少什么,变量“locationManager”显示为null。
这是我的清单文件,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bu"
android:versionCode="2"
android:versionName="2.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.bu.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:theme="@style/NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".HomeScreen"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light">
</activity>
<activity
android:name=".PropertySearchTypes.CameraSearch"
android:label="@string/camera_search"
android:screenOrientation="unspecified"/>
<activity
android:name=".PropertySearchTypes.MapSearch"
android:label="@string/map_search" />
<service
android:name=".PropertySearchTypes.PropertyRequestService" >
</service>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="API_KEY" />
</application>
</manifest>
这是我的logcat,
06-04 19:21:08.960: D/BatteryService(1499): update start
06-04 19:21:10.101: D/dalvikvm(16760): GC_EXPLICIT freed 17K, 49% free 2778K/5379K, external 688K/1036K, paused 54ms
06-04 19:21:10.210: E/StatusBarPolicy(1552): ecio: 255
06-04 19:21:10.210: E/StatusBarPolicy(1552): iconLevel: 4
06-04 19:21:12.109: D/dalvikvm(18597): JDWP invocation returning with exceptObj=0x40614540 (Ljava/lang/NullPointerException;)
06-04 19:21:12.906: D/dalvikvm(18597): JDWP invocation returning with exceptObj=0x406146a0 (Ljava/lang/NullPointerException;)
06-04 19:21:15.265: D/dalvikvm(15818): GC_EXPLICIT freed 481K, 49% free 3529K/6791K, external 688K/1036K, paused 53ms
06-04 19:21:18.992: D/BatteryService(1499): update start
06-04 19:21:20.265: D/dalvikvm(14873): GC_EXPLICIT freed 199K, 47% free 3590K/6727K, external 688K/1036K, paused 50ms
调用另一项活动,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_fragment);
progressDialog = new ProgressDialog(MapSearch.this);
/* getting latitude and longitude*/
GetGpsCoordinates getgpslatlng = new GetGpsCoordinates();
getgpslatlng.getLocation();
Latitude = getgpslatlng.getLatitude();
Longitude = getgpslatlng.getLongitude();
SupportMapFragment sfm = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
map = sfm.getMap();
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
map.setMyLocationEnabled(true);
}
我添加了所有的操作。我在设备中启用了gps。即使引发异常,说“locationManager”null以及“chkGooglePlayServices”为空。我在我的设备上安装了Google Play服务。
我的代码有什么问题?请纠正我.. 在此先感谢!!
答案 0 :(得分:2)
这是初始化LocationManager的错误方法,
locationManager = (LocationManager) getSystemService(mContext.LOCATION_SERVICE);
您需要使用直接的Context类,而不是mContext,
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
答案 1 :(得分:2)
您正在从活动初始化服务。这不是初始化服务的正确方法。服务需要由Frameworks初始化。 因此,您的Service类没有初始化的Context。因此,对Context方法的任何调用都将失败。 所以试试这个
GetGpsCoordinates getgpslatlng = new GetGpsCoordinates();
getgpslatlng.getLocation(this);
public Location getLocation(Context mContext) {
//use passed Context instead of field mContext
}
答案 2 :(得分:0)
您尚未初始化位置管理员,请使用
locationManager =(LocationManager)context.getSystemService(LOCATION_SERVICE);
使用locationManager之前