我想从网络提供商以及gps提供商处获取最后一个已知位置。所以我在我的java应用程序中编写了以下代码。
import com.google.android.gms.location.LocationClient;
import android.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.maps.GoogleMap;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.google.android.gms.maps.MapFragment;
public class Map extends Activity implements LocationListener{
private GoogleMap googleMap;
// Update frequency in seconds
public static final int UPDATE_INTERVAL_IN_SECONDS = 5;
// Define an object that holds accuracy and frequency parameters
LocationRequest mLocationRequest;
LocationClient mLocationClient;
boolean mUpdatesRequested;
double clat,clong,gpslat,gpslong,netlat,netlong;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
try {
// Loading map
initilizeMap();
} catch (Exception e) {
e.printStackTrace();
}
Location gps,network;
LocationManager locationmanager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationlistener=new LocationListener() {
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
};
locationmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener);
gps=locationmanager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
network=locationmanager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Double gpslat,gpslong,netlat,netlong;
gpslat=gps.getLatitude();
gpslong=gps.getLongitude();
netlat=network.getLatitude();
netlong=network.getLongitude();
/*MarkerOptions marker = new MarkerOptions().position(new LatLng(gpslat, gpslong)).title("Gps location ");
MarkerOptions marker1=new MarkerOptions().position(new LatLng(netlat, netlong)).title("Network Location");
googleMap.addMarker(marker);
googleMap.addMarker(marker1);*/
// create marker
//MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("Hello Maps ");
// adding marker
//googleMap.addMarker(marker);
//CameraPosition cameraPosition = new CameraPosition.Builder().target(
// new LatLng(latitude, longitude)).zoom(15).build();
//googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
// check if map is created successfully or not
if (googleMap == null) {
Toast.makeText(getApplicationContext(),
"Sorry! unable to create maps", Toast.LENGTH_SHORT)
.show();
}
}
}
@Override
protected void onResume() {
super.onResume();
initilizeMap();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.map, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
但是应用程序强制关闭并在logcat中显示如下错误:
09-20 12:05:14.350: I/Google Maps Android API(12062): Google Play services client version: 5089000
09-20 12:05:14.350: I/dalvikvm(12062): Could not find method gui.a, referenced from method gqh.a
09-20 12:05:14.350: W/dalvikvm(12062): VFY: unable to resolve static method 24934: Lgui;.a (Landroid/content/Context;)Lgrh;
09-20 12:05:14.350: D/dalvikvm(12062): VFY: replacing opcode 0x71 at 0x0003
09-20 12:05:14.360: E/dalvikvm(12062): Could not find class 'gpq', referenced from method gpr.a
09-20 12:05:14.360: W/dalvikvm(12062): VFY: unable to resolve new-instance 4090 (Lgpq;) in Lgpr;
09-20 12:05:14.360: D/dalvikvm(12062): VFY: replacing opcode 0x22 at 0x0000
09-20 12:05:14.360: E/dalvikvm(12062): Could not find class 'gpq', referenced from method gpr.a
09-20 12:05:14.360: W/dalvikvm(12062): VFY: unable to resolve new-instance 4090 (Lgpq;) in Lgpr;
09-20 12:05:14.360: D/dalvikvm(12062): VFY: replacing opcode 0x22 at 0x0000
09-20 12:05:14.360: E/dalvikvm(12062): Could not find class 'gpq', referenced from method gpr.a
09-20 12:05:14.360: W/dalvikvm(12062): VFY: unable to resolve new-instance 4090 (Lgpq;) in Lgpr;
09-20 12:05:14.360: D/dalvikvm(12062): VFY: replacing opcode 0x22 at 0x0000
09-20 12:05:14.360: D/dalvikvm(12062): DexOpt: unable to opt direct call 0x5ea1 at 0x0a in Lgpr;.a
09-20 12:05:14.360: D/dalvikvm(12062): DexOpt: unable to opt direct call 0x5ea1 at 0x0c in Lgpr;.a
09-20 12:05:14.360: D/dalvikvm(12062): DexOpt: unable to opt direct call 0x5ea1 at 0x0a in Lgpr;.a
09-20 12:05:14.370: I/Google Maps Android API(12062): Google Play services package version: 5089070
09-20 12:05:14.380: W/dalvikvm(12062): VFY: unable to resolve static field 20875 (t) in Lyo;
09-20 12:05:14.380: D/dalvikvm(12062): VFY: replacing opcode 0x62 at 0x000e
09-20 12:05:14.390: W/dalvikvm(12062): VFY: unable to resolve static field 20875 (t) in Lyo;
09-20 12:05:14.390: D/dalvikvm(12062): VFY: replacing opcode 0x62 at 0x000d
09-20 12:05:14.550: I/dalvikvm(12062): JIT_INFO: Unresolved fieldPtr at sget_sput_common
09-20 12:05:14.550: I/dalvikvm(12062): Could not compile trace for Lohs;<clinit>, offset 9
09-20 12:05:14.550: D/dalvikvm(12062): ++++++++++++++++++++++++++++++++++++++++++++
09-20 12:05:14.550: D/dalvikvm(12062): JIT_INFO: Issues while compiling trace Lohs;<clinit>, offset 9
09-20 12:05:14.550: D/dalvikvm(12062): Trace contains SGET / SPUT bytecode with unresolved field.
09-20 12:05:14.550: D/dalvikvm(12062): JIT_INFO: Terminating trace due to unresolved issues
09-20 12:05:14.550: D/dalvikvm(12062): ++++++++++++++++++++++++++++++++++++++++++++
09-20 12:05:14.560: W/ActivityThread(12062): ClassLoader.loadClass: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());
09-20 12:05:14.590: I/dalvikvm(12062): Failed resolving Lcom/google/android/gms/location/internal/ParcelableGeofence; interface 4023 'Lglm;'
09-20 12:05:14.590: W/dalvikvm(12062): Link of class 'Lcom/google/android/gms/location/internal/ParcelableGeofence;' failed
09-20 12:05:14.590: E/dalvikvm(12062): Could not find class 'com.google.android.gms.location.internal.ParcelableGeofence', referenced from method gls.a
09-20 12:05:14.590: W/dalvikvm(12062): VFY: unable to resolve check-cast 2086 (Lcom/google/android/gms/location/internal/ParcelableGeofence;) in Lgls;
09-20 12:05:14.590: D/dalvikvm(12062): VFY: replacing opcode 0x1f at 0x0019
09-20 12:05:14.700: D/dalvikvm(12062): GC_FOR_ALLOC freed 5073K, 37% free 9468K/14820K, paused 9ms, total 9ms
09-20 12:05:14.720: D/AndroidRuntime(12062): Shutting down VM
09-20 12:05:14.720: W/dalvikvm(12062): threadid=1: thread exiting with uncaught exception (group=0x42ede500)
09-20 12:05:14.720: E/AndroidRuntime(12062): FATAL EXCEPTION: main
09-20 12:05:14.720: E/AndroidRuntime(12062): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.barcodescanner/com.example.barcodescanner.Map}: java.lang.NullPointerException
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2250)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2300)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread.access$600(ActivityThread.java:144)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1295)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.os.Looper.loop(Looper.java:150)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread.main(ActivityThread.java:5162)
09-20 12:05:14.720: E/AndroidRuntime(12062): at java.lang.reflect.Method.invokeNative(Native Method)
09-20 12:05:14.720: E/AndroidRuntime(12062): at java.lang.reflect.Method.invoke(Method.java:525)
09-20 12:05:14.720: E/AndroidRuntime(12062): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:744)
09-20 12:05:14.720: E/AndroidRuntime(12062): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-20 12:05:14.720: E/AndroidRuntime(12062): at dalvik.system.NativeStart.main(Native Method)
09-20 12:05:14.720: E/AndroidRuntime(12062): Caused by: java.lang.NullPointerException
09-20 12:05:14.720: E/AndroidRuntime(12062): at com.example.barcodescanner.Map.onCreate(Map.java:77)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.Activity.performCreate(Activity.java:5288)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-20 12:05:14.720: E/AndroidRuntime(12062): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2214)
09-20 12:05:14.720: E/AndroidRuntime(12062): ... 11 more
有人可以帮助我解决错误,如果我错了,请纠正我。所有想要的是使用来自gps提供商和网络提供商的getlastknown位置来获取纬度和经度,并将其显示在谷歌地图中并使用标记进行标记。
这是我的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
答案 0 :(得分:1)
首先检查gps位置值是否为null。就像这样,如果它为null,则表示无法获取null值,无法获取nullpointer异常,
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
protected LocationManager locationManager;
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
try
{
LocationManager locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
{
Log.e(Tag,"Both services not available");
}
else
{
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setBearingAccuracy(Criteria.ACCURACY_FINE);
this.canGetLocation = true;
if (isNetworkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
if (locationManager != null)
{
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
Log.e("latitude:","Network lat:"+latitude+" lng:"+longitude);
}
else
{
Log.e(Tag,"network based location is null");
}
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
if (locationManager != null)
{
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
//Appconstants.gps_turnon=true;
Log.e("latitude:","gprs lat:"+latitude+" lng:"+longitude);
}
else
{
Log.e(Tag,"Location can't find by gps");
}
}
}}
catch(Exception e){e.printStackTrace();}