2016-04-05 95 views
0

我需要使用不在活动中的单独类获取当前位置。这是我的代码,它不起作用。任何人有想法解决这个问题。当我尝试获取位置详细信息时,此应用程序总是崩溃。如何在Android中使用独立类获取当前位置

package com.example.ishanfx.departmentapp.network; 

import android.content.Context; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 


public class LocationHandler implements LocationListener,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 
    private LocationManager locationManager; 
    Location mLastLocation; 
    LocationRequest mLocationRequest; 
    private String latitude; 
    private String longitude; 
    Context context; 
    private static GoogleApiClient mGoogleApiClient; 

    public LocationHandler(Context context) { 
     this.context = context; 
     locationManager = (LocationManager) context 
       .getSystemService(Context.LOCATION_SERVICE); 
     buildGoogleApiClient(); 


    } 
    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(context) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 

    } 
    private void setMostRecentLocation(Location lastKnownLocation) { 

    } 

    public String getLatitude() { 
     return latitude; 
    } 

    public String getLongitude() { 
     return longitude; 
    } 


    @Override 
    public void onLocationChanged(Location location) { 
     double lon = (double) (location.getLongitude()); 
     double lat = (double) (location.getLatitude()); 

     latitude = lat + ""; 
     longitude = lon + ""; 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.location.LocationListener#onProviderDisabled(java.lang.String) 
    */ 
    @Override 
    public void onProviderDisabled(String arg0) { 
     // TODO Auto-generated method stub 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * android.location.LocationListener#onProviderEnabled(java.lang.String) 
    */ 
    @Override 
    public void onProviderEnabled(String arg0) { 
     // TODO Auto-generated method stub 

    } 


    @Override 
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
     if (mLastLocation != null) { 
      latitude =String.valueOf(mLastLocation.getLatitude()); 
      longitude = String.valueOf(mLastLocation.getLongitude()); 
     } 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

    } 
} 

这是mainActivity.When我称这个应用程序会崩溃。

LocationHandler appLocationManager = new LocationHandler(HomeActivity.this); 

       Toast.makeText(getApplicationContext(), appLocationManager.getLatitude().toString(), Toast.LENGTH_SHORT).show(); 
       Toast.makeText(getApplicationContext(), appLocationManager.getLongitude().toString(), Toast.LENGTH_SHORT).show(); 

这是日志

FATAL EXCEPTION: main 
                       java.lang.NullPointerException 
                        at com.example.ishanfx.departmentapp.HomeActivity.onOptionsItemSelected(HomeActivity.java:172) 
                        at android.app.Activity.onMenuItemSelected(Activity.java:2502) 
                        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:361) 
                        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147) 
                        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100) 
                        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100) 
                        at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:68) 
                        at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:172) 
                        at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:760) 
                        at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) 
                        at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
                        at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) 
                        at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948) 
                        at android.support.v7.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:191) 
                        at android.widget.AdapterView.performItemClick(AdapterView.java:292) 
                        at android.widget.AbsListView.performItemClick(AbsListView.java:1065) 
                        at android.widget.AbsListView$PerformClick.run(AbsListView.java:2522) 
                        at android.widget.AbsListView$1.run(AbsListView.java:3183) 
                        at android.os.Handler.handleCallback(Handler.java:605) 
                        at android.os.Handler.dispatchMessage(Handler.java:92) 
                        at android.os.Looper.loop(Looper.java:137) 
                        at android.app.ActivityThread.main(ActivityThread.java:4441) 
                        at java.lang.reflect.Method.invokeNative(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:511) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
                        at dalvik.system.NativeStart.main(Native Method) 
+0

什么是logcat的输出? – chRyNaN

+0

空指针异常@chRyNaN –

+0

将整个日志放在您的问题中。这里是一个链接回答什么是NullPointerException,http://stackoverflow.com/q/218384/1478764 – chRyNaN

回答

1

这需要一点时间onConnected事件触发。 在做敬酒之前,你需要一点时间。 我的isConnected属性添加到您的LocationHandler类,像这样:

private boolean isconnected = false; 

public boolean isConnected() { 
    return isconnected; 
} 

@Override 
public void onConnected(Bundle bundle) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
      mGoogleApiClient); 
    if (mLastLocation != null) { 
     latitude =String.valueOf(mLastLocation.getLatitude()); 
     longitude = String.valueOf(mLastLocation.getLongitude()); 
    } 
    this.isconnected = true; 
} 

然后在MainActivity

LocationHandler appLocationManager = new LocationHandler(HomeActivity.this); 

while(!appLocationManager.isConnected()) { 
// wait for a bit 
} 

if (appLocationManager.isConnected()) { 
    Toast.makeText(getApplicationContext(), appLocationManager.getLatitude().toString(), Toast.LENGTH_SHORT).show(); 
    Toast.makeText(getApplicationContext(), appLocationManager.getLongitude().toString(), Toast.LENGTH_SHORT).show(); 
} 
+0

它冻结了应用程序。 –

+0

任何想法在后台线程中运行它? –

+0

创建一个接口(回调),并在连接时返回。 appLocationManager .setOnConnectedListener(new OnConnected(){}) – Nepster

1

我上面类的清洁方式更新。

public class LocationHandler implements LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 
    private Context mContext; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 
    private OnLocationUpdateListener onLocationUpdateListener; 

    public LocationHandler(Context mContext) { 
     this.mContext = mContext; 
     buildGoogleApiClient(); 
     createLocationRequest(); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     mGoogleApiClient.connect(); 
    } 

    public void startLocationUpdates(Context mContext) { 
     if (ActivityCompat.checkSelfPermission(mContext, 
       Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
       && ActivityCompat.checkSelfPermission(mContext, 
       Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(
       mGoogleApiClient, mLocationRequest, this); 
    } 

    private void stopLocationUpdate(Context mContext) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       mGoogleApiClient, this); 
    } 

    //other new Methods but not using right now.. 
    protected void createLocationRequest() { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(10000);//set the interval in which you want to get locations 
     mLocationRequest.setFastestInterval(5000);//if a location is available sooner you can get it (i.e. another app is using the location services) 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     startLocationUpdates(mContext); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     if(mGoogleApiClient.isConnected() && onLocationUpdateListener != null){ 
      onLocationUpdateListener.onLocationChange(location); 
     } 
    } 

    public void setOnLocationUpdateListener(OnLocationUpdateListener onLocationUpdateListener) { 
     this.onLocationUpdateListener = onLocationUpdateListener; 
    } 
} 

其中OnLocationUpdateListener

public interface OnLocationUpdateListener { 
    void onLocationChange(Location location); 
    void onError(EnumUtil.ErrorType errorType); 
} 
相关问题