没有获得位置

时间:2017-10-12 07:19:45

标签: android location

我正在尝试获取当前位置,但它没有使用真实设备但是在模拟器上工作

这是我的错误--->

  

处理:in.co.getonlinerecharge.cab.bw_driver,PID:28061                                                                                          java.lang.NullPointerException:尝试调用虚方法' boolean java.lang.String.isEmpty()'在null对象引用上                                                                                              在in.co.getonlinerecharge.cab.bw_driver.activity.HomeActivity.Send_Data_Fragment(HomeActivity.java:143)                                                                                              在in.co.getonlinerecharge.cab.bw_driver.activity.HomeActivity.onNavigationItemSelected(HomeActivity.java:215);

package in.co.getonlinerecharge.cab.bw_driver.activity;

import android.Manifest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import in.co.getonlinerecharge.cab.bw_driver.AppController;
import in.co.getonlinerecharge.cab.bw_driver.R;
import in.co.getonlinerecharge.cab.bw_driver.fragment.EarningFragment;
import in.co.getonlinerecharge.cab.bw_driver.fragment.HomeFragment;
import in.co.getonlinerecharge.cab.bw_driver.fragment.ProfileFragment;
import in.co.getonlinerecharge.cab.bw_driver.fragment.RatingFragment;
import in.co.getonlinerecharge.cab.bw_driver.helper.ToastHelper;
import in.co.getonlinerecharge.cab.bw_driver.utils.Constans;
import in.co.getonlinerecharge.cab.bw_driver.utils.Utils;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class HomeActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
    private BottomNavigationView bottomNavigation;
    private Switch switch1;
    private TextView txt_on_off;
    private Toolbar toolbar;
    GoogleApiClient mGoogleApiClient;
    Location mLastLocation;
    LocationRequest mLocationRequest;
    double slat, slong;
    String add;
    Geocoder geocoder;
    List<Address> addresses = null;
    String address = "", city = "", state = "", country = "", postalCode = "", knownName = "";
    //double clat,clang;
    String pincode, location, calt, clong;

protected LocationManager locationManager;
protected LocationListener locationListener;
protected Context context;
View.OnClickListener mOnClickListener;
private FragmentManager fragmentManager = getSupportFragmentManager();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    bottomNavigation = (BottomNavigationView) findViewById(R.id.bottom_navigation);
    bottomNavigation.inflateMenu(R.menu.bottom_menu);
    bottomNavigation.setOnNavigationItemSelectedListener(this);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    switch1 = (Switch) toolbar.findViewById(R.id.switch1);
    txt_on_off = (TextView) toolbar.findViewById(R.id.txt_on_off);
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();
    if (mGoogleApiClient != null) {
        mGoogleApiClient.connect();
    } else {
        Toast.makeText(this, "Not Connected!", Toast.LENGTH_SHORT).show();
    }

    switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean ischacked) {
            if (!ischacked) {
                txt_on_off.setText("OFF");
                Snackbar.make(findViewById(android.R.id.content), "You need to turn on first", Snackbar.LENGTH_LONG)
                        .setAction("Undo", mOnClickListener)
                        .setActionTextColor(Color.RED)
                        .show();

            } else {


                txt_on_off.setText("ON");
                Send_Data_Fragment();
                Send_Location();
                Timer timer = new Timer();
                TimerTask hourlyTask = new TimerTask() {
                    @Override
                    public void run() {
                        Send_Location();
                    }
                };
                timer.schedule (hourlyTask, 0l, 1000*5*60);
            }

        }
    });

}

private void Send_Data_Fragment() {
    if (!calt.isEmpty() && !clong.isEmpty())

    {

//            HomeFragment fragment = new HomeFragment();
//            Bundle bundle = new Bundle();
//            bundle.putDouble("clat", Double.parseDouble(calt));
//            bundle.putDouble("clong", Double.parseDouble(clong));
//            fragment.setArguments(bundle);
           // ToastHelper.make(getApplicationContext(), true, "data has been transferd");
            Fragment fragment = new HomeFragment();//Get Fragment Instance
            Bundle data = new Bundle();//Use bundle to pass data
            data.putDouble("clat",Double.parseDouble(calt));
            data.putDouble("clong",Double.parseDouble(clong));
            //put string, int, etc in bundle with a key value
            fragment.setArguments(data);
            fragmentManager.beginTransaction().replace(R.id.main_container, fragment).commit();
        }
        else
            {
                ToastHelper.make(getApplicationContext(), true, "Please reconnect");
            }
}

private void Send_Location() {

    if (!pincode.isEmpty() && !location.isEmpty() && !calt.isEmpty() && 

!clong.isEmpty()) {
//            final ProgressDialog progressDialog = new ProgressDialog(getApplicationContext());
//            progressDialog.show();
//            progressDialog.setMessage(getString(R.string.please_wait));
            Call<ResponseBody> call = AppController.getInstance().getApiInterface().postLocation(Utils.getSharedPreference(getApplicationContext()).getString(Constans.PREFERENCE_DRIVER_UID, ""),
                    location, pincode, calt, clong);
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                   // progressDialog.dismiss();
                   // ToastHelper.make(getApplicationContext(), true, pincode + " " + location + " " + calt + " " + clong);
                    String responseString = null;
                    try {
                        responseString = response.body().string();
                        JSONObject jsonObject = new JSONObject(responseString);
                        //ToastHelper.make(getApplicationContext(), true, jsonObject.getString("data"));
//                        if (jsonObject.getBoolean("status")) {
//                            ToastHelper.make(getApplicationContext(), true, jsonObject.getString("data"));
//                        }
                        Utils.getSharedPreference(getApplicationContext()).edit().putString(Constans.PREFERENCE_DRIVER_CLAT,calt);
                        Utils.getSharedPreference(getApplicationContext()).edit().putString(Constans.PREFERENCE_DRIVER_CLONG,clong);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                ToastHelper.make(getApplicationContext(), true, "Please reconnect");
            }
        });

    } else {
        ToastHelper.make(getApplicationContext(), true, "Please reconnect");
    }
}


@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.btm_action_home:
            //Utils.replaceFragment(new HomeFragment(), HomeFragment.class.getName(), false, true, getSupportFragmentManager(), R.id.main_container);
            Send_Data_Fragment();
            break;
        case R.id.btm_action_earning:
            Utils.replaceFragment(new EarningFragment(), EarningFragment.class.getName(), false, true, getSupportFragmentManager(), R.id.main_container);
            break;
        case R.id.btm_action_ratings:
            Utils.replaceFragment(new RatingFragment(), RatingFragment.class.getName(), false, true, getSupportFragmentManager(), R.id.main_container);
            break;
        case R.id.btm_action_account:
            Utils.replaceFragment(new ProfileFragment(), ProfileFragment.class.getName(), false, true, getSupportFragmentManager(), R.id.main_container);
            break;
    }
    return true;
}

@Override
protected void onStart() {
    mGoogleApiClient.connect();
    super.onStart();

}



@Override
protected void onStop() {
    mGoogleApiClient.disconnect();
    super.onStop();
}


@Override
public void onConnected(@Nullable Bundle bundle) {
    settingRequest();



}



@Override
public void onConnectionSuspended(int i) {
    Toast.makeText(this, "Connection Suspended!", Toast.LENGTH_SHORT).show();
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Toast.makeText(this, "Connection Failed!", Toast.LENGTH_SHORT).show();
    if (connectionResult.hasResolution()) {
        try {
            // Start an Activity that tries to resolve the error
            connectionResult.startResolutionForResult(this, 90000);
        } catch (IntentSender.SendIntentException e) {
            e.printStackTrace();
        }
    } else {
        Log.i("Current Location", "Location services connection failed with code " + connectionResult.getErrorCode());
    }
}

private void settingRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);    // 10 seconds, in milliseconds
    mLocationRequest.setFastestInterval(1000);   // 1 second, in milliseconds
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient,
                    builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {

        @Override
        public void onResult(@NonNull LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can
                    // initialize location requests here.
                    getLocation();
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied, but this can be fixed
                    // by showing the user a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(HomeActivity.this, 1000);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way
                    // to fix the settings so we won't show the dialog.
                    break;
            }
        }

    });
}

private void getLocation() {
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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;
    } else {
        /*Getting the location after aquiring location service*/
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);

        if (mLastLocation != null) {
// 



       _progressBar.setVisibility(View.INVISIBLE);
//                _latitude.setText("Latitude: " + String.valueOf(mLastLocation.getLatitude()));
//                _longitude.setText("Longitude: " + String.valueOf(mLastLocation.getLongitude()));
                //ToastHelper.make(this,true,mLastLocation.getLatitude()+"  "+mLastLocation.getLongitude());
                Geocoder geocoder = new Geocoder(getApplicationContext());
                String Addr=null;

            try
            {
                List<Address> addresses = geocoder.getFromLocation(mLastLocation.getLatitude(), mLastLocation.getLongitude(), 1);
                Address obj = addresses.get(0);
                 add = obj.getAddressLine(0);
                String currentAddress = obj.getSubAdminArea() + ","
                        + obj.getAdminArea();
                double latitude = obj.getLatitude();
                double longitude = obj.getLongitude();
                String currentCity= obj.getSubAdminArea();
                String currentState= obj.getAdminArea();
                add = add + "\n" + obj.getCountryName();
                add = add + "\n" + obj.getCountryCode();
                add = add + "\n" + obj.getAdminArea();
                add = add + "\n" + obj.getPostalCode();
                add = add + "\n" + obj.getSubAdminArea();
                add = add + "\n" + obj.getLocality();
                add = add + "\n" + obj.getSubThoroughfare();
                pincode = obj.getPostalCode();
                location = obj.getAdminArea()+" "+obj.getSubAdminArea()+" "+obj.getLocality();
                calt = String.valueOf(mLastLocation.getLatitude());
                clong = String.valueOf(mLastLocation.getLongitude());
               // ToastHelper.make(getApplicationContext(),true,obj.getSubAdminArea() + ","
                 //       + obj.getAdminArea());

            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            /*if there is no last known location. Which means the device has no data for the loction currently.
            * So we will get the current location.
            * For this we'll implement Location Listener and override onLocationChanged*/
            Log.i("Current Location", "No data for location found");

            if (!mGoogleApiClient.isConnected())
                mGoogleApiClient.connect();

            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (LocationListener) HomeActivity.this);
        }
    }
}

@Override
public void onLocationChanged(Location location) {
    if (location != null)
    {
        double slatg =location.getLatitude();
            double slong  = location.getLongitude();
//            clat = slatg;
//            clang = slong;
            try {

            addresses = geocoder.getFromLocation(slatg,slong, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
        } catch (IOException e) {
            e.printStackTrace();
        }
        address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
        city = addresses.get(0).getLocality();
        state = addresses.get(0).getAdminArea();
        country = addresses.get(0).getCountryName();
        postalCode = addresses.get(0).getPostalCode();
        knownName = addresses.get(0).getFeatureName();
        //ToastHelper.make(getApplicationContext(),true,""+city);

    }

    try {
        if (location != null)



        LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (LocationListener) this);

    } catch (Exception e) {
        e.printStackTrace();
    }
}


 }
  

我在清单文件中使用了以下权限

<uses-permission android:name="in.co.getonlinerecharge.cab.bw_cab.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

0 个答案:

没有答案