This happen randomly, especially in Genymotion Emulator I think the problem is that line:
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi.getCurrentPlace(mGoogleApiClient, null);
Below i let all the code:
**MainActivity**
public class MainActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener {
private GoogleApiClient mGoogleApiClient;
private static final int GOOGLE_API_CLIENT_ID = 0;
private static final int PERMISSION_REQUEST_CODE = 100;
int PLACE_PICKER_REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button currentButton = (Button) findViewById(R.id.currentButton);
mGoogleApiClient = new GoogleApiClient
.Builder(this)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.enableAutoManage(this, this)
.build();
currentButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(mGoogleApiClient.isConnected()){
if(ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,
new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);
}else{
callPlaceDetectionApi();
}
}
}
});
}
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.e(String.valueOf(this.getClass()), "Google Places API connection failed with error code: " +
connectionResult.getErrorCode());
Toast.makeText(this, "Google Places API connection failed with error code: " + connectionResult.getErrorCode()
, Toast.LENGTH_LONG).show();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if(grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
callPlaceDetectionApi();
} break;
}
}
private void callPlaceDetectionApi() throws SecurityException {
PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
.getCurrentPlace(mGoogleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
@Override
public void onResult(@NonNull PlaceLikelihoodBuffer placeLikelihoods) {
for(PlaceLikelihood placeLikelihood : placeLikelihoods){
Log.i(String.valueOf(this.getClass()), String.format("Place '%s' with " +
"likelihood: %g",
placeLikelihood.getPlace().getName(),
placeLikelihood.getLikelihood()));
}
placeLikelihoods.release();
}
});
}
}
Log
Binder call failed
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.location.places.zzo$zzf.zzb(com.google.android.gms.common.api.Result)' on a null object reference
at com.google.android.gms.location.places.zzo.zzbs(Unknown Source)
at com.google.android.gms.location.places.internal.zzl$zza.onTransact(Unknown Source)
at android.os.Binder.execTransact(Binder.java:565)