2016-12-21 8 views
0

私は場所googleプレイサービス機能の初期化をすべて持っているヘルパークラスを作成しました。 onLocationChangedが呼び出されると、私はインターフェイスonLocationChangedFunctionを呼び出します。しかし、それはnullポインタの例外のためにそれを呼び出すことはありません。ここでAndroidの場所が変更されました

は私のコードです:

public class LocationHelperClass implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

private Context mContext; 
private TaxiplonApp mApp; 
private GoogleApiClient mGoogleApiClient; 
private Location mLastLocation; 
/** 
* The desired interval for location updates. Inexact. Updates may be more or less frequent. 
*/ 
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000; 

/** 
* The fastest rate for active location updates. Exact. Updates will never be more frequent 
* than this value. 
*/ 
private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 
     UPDATE_INTERVAL_IN_MILLISECONDS/2; 


/** 
* Stores parameters for requests to the FusedLocationProviderApi. 
*/ 
private LocationRequest mLocationRequest; 

public static LocationChangeListener locationListener; 

public LocationHelperClass(Context context, TaxiplonApp app) { 
    super(); 
    this.mContext = context; 
    this.mApp = app; 
    createInstanceGoogleAPIClient(); 
} 

private void createInstanceGoogleAPIClient() { 
    if (mGoogleApiClient == null) { 
     mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
     createLocationRequest(); 
    } 
} 

/** 
* Sets up the location request. Android has two location request settings: 
* {@code ACCESS_COARSE_LOCATION} and {@code ACCESS_FINE_LOCATION}. These settings control 
* the accuracy of the current location. This sample uses ACCESS_FINE_LOCATION, as defined in 
* the AndroidManifest.xml. 
* <p/> 
* When the ACCESS_FINE_LOCATION setting is specified, combined with a fast update 
* interval (5 seconds), the Fused Location Provider API returns location updates that are 
* accurate to within a few feet. 
* <p/> 
* These settings are appropriate for mapping applications that show real-time location 
* updates. 
*/ 
protected void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 

    // Sets the desired interval for active location updates. This interval is 
    // inexact. You may not receive updates at all if no location sources are available, or 
    // you may receive them slower than requested. You may also receive updates faster than 
    // requested if other applications are requesting location at a faster interval. 
    mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 

    // Sets the fastest rate for active location updates. This interval is exact, and your 
    // application will never receive updates faster than this value. 
    mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 

    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
} 

/** 
* Requests location updates from the FusedLocationApi. 
*/ 
protected void startLocationUpdates() { 
    // The final argument to {@code requestLocationUpdates()} is a LocationListener 
    // (http://developer.android.com/reference/com/google/android/gms/location/LocationListener.html). 
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
      && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
} 

/** 
* Removes location updates from the FusedLocationApi. 
*/ 
protected void stopLocationUpdates() { 
    // It is a good practice to remove location requests when the activity is in a paused or 
    // stopped state. Doing so helps battery performance and is especially 
    // recommended in applications that request frequent location updates. 

    // The final argument to {@code requestLocationUpdates()} is a LocationListener 
    // (http://developer.android.com/reference/com/google/android/gms/location/LocationListener.html). 
    LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
} 


public void clientConnect(){ 
    mGoogleApiClient.connect(); 
} 

public void clientDisconnect(){ 
    mGoogleApiClient.disconnect(); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
      && ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 

    Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (mLastLocation != null) { 
     Toast.makeText(mContext, "Latitude: "+String.valueOf(mLastLocation.getLatitude())+" - Longtitude: "+String.valueOf(mLastLocation.getLongitude()), Toast.LENGTH_SHORT).show(); 
     mApp.setLastKnownLocation(mLastLocation); 
    } 
    startLocationUpdates(); 
} 

@Override 
public void onConnectionSuspended(int i) { 
} 

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


@Override 
public void onLocationChanged(Location location) { 
    DebugLogger.debug("Location Changed called in Helper Class"); 

    if(locationListener!=null){ 
     locationListener.onLocationChangedFunction(location); 
    } 
} 

public interface LocationChangeListener { 
    void onLocationChangedFunction(Location location); 
} 

}

私は私の活動にこのリスナーを実装し、このようなonCreate でそれを初期化します。

location = new LocationHelperClass(this, (TaxiplonApp) getApplication()); 

しかし、私はonLocationChangedFunctionを言ったように私の活動で決して呼び出されません。

12-21 17:48:28.100 4634-4634/? E/AndroidRuntime: FATAL EXCEPTION: main 
              Process: com.taxiplon.taxi.driver.lit.taxiplondriver, PID: 4634 
              java.lang.NullPointerException: Attempt to invoke interface method 'void com.taxiplon.taxi.driver.lit.taxiplondriver.HelperClasses.LocationHelperClass$LocationChangeListener.onLocationChangedFunction(android.location.Location)' on a null object reference 
               at com.taxiplon.taxi.driver.lit.taxiplondriver.HelperClasses.LocationHelperClass.onLocationChanged(LocationHelperClass.java:166) 
               at com.google.android.gms.internal.zzart$zzb$1.zza(Unknown Source) 
               at com.google.android.gms.internal.zzart$zzb$1.zzs(Unknown Source) 
               at com.google.android.gms.internal.zzaaz.zzb(Unknown Source) 
               at com.google.android.gms.internal.zzaaz$zza.handleMessage(Unknown Source) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:135) 
               at android.app.ActivityThread.main(ActivityThread.java:5294) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:372) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
+0

スタックトレースを投稿できますか? – eduyayo

+0

これは私の質問に追加されました – appLogic

+0

最近、 'if(locationListener!= null)'を追加しましたか?...それは、古いコードを実行しているようです... – eduyayo

答えて

0

リスナーには決して値が割り当てられないため、nullです。

関連する問題