Search code examples
androidservicegpsandroid-wifismsmanager

getting location with wifi but not with gps


I'm stuck in a problem i'm working on an app that will always run in the background and sends gps coordinates after some time interval via sms and if the phone restarts the app should start automatically without any launcher activity. I suddenly encounter a problem that my app is getting location on android kitkat when gps is enabled, and it is working in jelly bean when gps is diabled. I'm really confused about it what should. kindly tell me where i'm wrong and suggest me how to fix it.

my receiver class

public class AlarmReceiver extends BroadcastReceiver{

long time = 5* 1000; 
long distance = 10; 

@Override
public void onReceive(final Context context, Intent intent) {

    System.out.println("alarm receiver....");
    Intent service = new Intent(context, MyService.class);
    context.startService(service);

    //Start App On Boot Start Up
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
    Intent App = new Intent(context, MainActivity.class);
    App.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(App);
    }

    LocationManager locationManager = (LocationManager)context
            .getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(provider, time, distance, locationListener);

    Location location = locationManager.getLastKnownLocation(provider);
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    String device_id = tm.getDeviceId();  // returns IMEI number 

    String phoneNo = "+923333333";
    String Text = "Latitude = " + location.getLatitude() +" Longitude = " + location.getLongitude() + " Device Id: " + device_id;

    try {
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(phoneNo, null, Text, null, null);
    Log.i("Send SMS", "");

    Toast.makeText(context, "message sent", Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
    Toast.makeText(context, "SMS faild, please try again.",
    Toast.LENGTH_LONG).show();
    e.printStackTrace();
 } 
    this.abortBroadcast();

}

    LocationListener locationListener = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    public void onLocationChanged(Location location) {

    }
};

}

all necessary permissions are added in the manifest file.


Solution

  • Try this way,hope this will help you to solve your problem. use this class where you want want getlocation by wifi and internet,

    call this method, //*** new GetCurLocation(getActivity(), 0, true, null, this, 2000);

    and implement "SetOnLocationFoundListner" , you found location by wifi and internet. thanks

    public class GetCurLocation implements LocationListener,
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener {
    
    public static LocationClient mLocationClient;
    LocationRequest mLocationRequest;
    public static LocationManager locationmanager;
    
    float accuracy = 500;
    Activity context;
    boolean getLocRegularly = false;
    int interval = 1000;
    float Radius;
    GoogleMap gmap;
    
    SetOnLocationFoundListner OLF;
    
    public interface SetOnLocationFoundListner {
        public void onLocationFound(Location location, boolean getLocRegularly,
                GoogleMap gmap);
    }
    
    public void RemoveUpdates() {
        try {
            if (mLocationClient != null)
                mLocationClient.removeLocationUpdates(this);
            if (locationmanager != null)
                locationmanager.removeUpdates(LocUpByLocMgr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    
    /*
     * radius should be in meters
     */
    public GetCurLocation(Activity activity, int interval,
            boolean getLocRegularly, GoogleMap gmap,
            SetOnLocationFoundListner OLF, float Radius) {
        this.OLF = OLF;
        this.gmap = gmap;
        this.context = activity;
        this.getLocRegularly = getLocRegularly;
        this.interval = interval;
        this.Radius = Radius;
        if (servicesConnected()) {
            mLocationClient = new LocationClient(context, this, this);
            mLocationClient.connect();
            mLocationRequest = LocationRequest.create();
            mLocationRequest.setInterval(interval);
            mLocationRequest
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setFastestInterval(interval);
        }
    
        locationmanager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        Criteria cr = new Criteria();
        String provider = locationmanager.getBestProvider(cr, true);
        locationmanager.requestLocationUpdates(provider, interval, 10,
                LocUpByLocMgr);
    }
    
    private boolean servicesConnected() {
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(context);
        if (ConnectionResult.SUCCESS == resultCode) {
            return true;
        } else {
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode,
                    (Activity) context, 0);
            if (dialog != null) {
            }
            return false;
        }
    }
    
    @Override
    public void onConnectionFailed(ConnectionResult result) {
    
    }
    
    @Override
    public void onConnected(Bundle connectionHint) {
        try {
    
            Location location = mLocationClient.getLastLocation();
    
            Log.e("testing",
                    location.getLatitude() + "," + location.getLongitude()
                            + "," + location.getAccuracy());
            if (location.getAccuracy() < Radius) {
                OLF.onLocationFound(location, getLocRegularly, gmap);
                locationmanager.removeUpdates(LocUpByLocMgr);
            } else
                mLocationClient.requestLocationUpdates(mLocationRequest, this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void onDisconnected() {
    }
    
    @Override
    public void onLocationChanged(Location location) {
        try {
            if (location.getAccuracy() > Radius) {
                Log.e("testing LC", location.getAccuracy()
                        + " Its Not Accurate");
            } else {
                Log.e("testing LC", location.getAccuracy() + " Its Accurate");
                try {
                    OLF.onLocationFound(location, getLocRegularly, gmap);
                    if (!getLocRegularly) {
                        mLocationClient.removeLocationUpdates(this);
                        locationmanager.removeUpdates(LocUpByLocMgr);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    }
    
    android.location.LocationListener LocUpByLocMgr = new android.location.LocationListener() {
    
        @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
    
        }
    
        @Override
        public void onLocationChanged(Location location) {
    
            try {
                if (location.getAccuracy() > Radius) {
                    Log.e("testing LM", location.getAccuracy()
                            + " Its Not Accurate");
                } else {
                    Log.e("testing LM", location.getAccuracy()
                            + " Its Accurate");
    
                    try {
                        OLF.onLocationFound(location, getLocRegularly, gmap);
                        if (!getLocRegularly) {
                            mLocationClient
                                    .removeLocationUpdates(GetCurLocation.this);
                            locationmanager.removeUpdates(LocUpByLocMgr);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
    

    }