当前位置: 动力学知识库 > 问答 > 编程问答 >

android - Unable to get location from GPS?

问题描述:

I am trying to get the location from the GPS but not able to get it. this is because the location is accessed by the Network provider.

If I am commenting all the code of network provider then the GPS location returns null.

I have tried so much, but unable to resolve this.

If anybody can help then it will be great help for me.

I am using this link for the reference..

http://stackoverflow.com/a/3145655/1395259

Here is my code:

MainActivity.java

package com.example.locationsimple;

import com.example.locationsimple.MyLocation.LocationResult;

import android.location.Location;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {

TextView textView;

LocationResult locationResult;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView) findViewById(R.id.textViewLocation);

Button button = (Button) findViewById(R.id.button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

locationResult = new LocationResult(){

@Override

public void gotLocation(Location location) {

while(true)

{

Log.i("Log", "Inside while loop ");

if(location != null)

{

Log.i("Log", "Here the location is not null");

if(location.getLatitude() !=0.0 || location.getLongitude() != 0.0)

{

if(location.getAccuracy() < 100)

{

Log.i("Log", "Inside while loop BREAKS");

try

{

String loc = "Lattitude: "+location.getLatitude()+" longi "+location.getLongitude()+" Accur "+location.getAccuracy()+" Time "+location.getTime();

Log.i("Log",loc);

Toast.makeText(MainActivity.this, ""+loc, Toast.LENGTH_LONG).show();

textView.setText(loc);

}

catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

break;

}

else

{

Log.i("Log", "no Accuracy");

Log.i("Log", "latti"+location.getLatitude()+" Longi "+location.getLongitude()+" Accur "+location.getAccuracy()+location.getProvider());

break;

}

}

}

else

{

Log.i("Log", "Here got the location is null");

break;

}

}

//textView.setText(location.getLatitude()+"::"+location.getLongitude()+"::"+location.getAccuracy()+" Provider "+location.getProvider());

}

};

MyLocation myLocation = new MyLocation();

myLocation.getLocation(MainActivity.this, locationResult);

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

MyLocation.java

package com.example.locationsimple;

import java.util.Timer;

import java.util.TimerTask;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.content.Intent;

import android.location.Criteria;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.os.Bundle;

import android.provider.Settings;

public class MyLocation {

Timer timer1;

LocationManager lm;

LocationResult locationResult;

boolean gps_enabled=false;

boolean network_enabled=false;

Context mContext;

public boolean getLocation(Context context, LocationResult result)

{

mContext = context;

//I use LocationResult callback class to pass location value from MyLocation to user code.

locationResult=result;

if(lm==null)

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

/*Criteria criteria = new Criteria();

criteria.setAccuracy(Criteria.ACCURACY_HIGH);

lm.getBestProvider(criteria, true);*/

//exceptions will be thrown if provider is not permitted.

try

{

gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

}

catch(Exception ex)

{

ex.printStackTrace();

}

try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

//don't start listeners if no provider is enabled

if(!gps_enabled || !network_enabled)

{

showSettingsAlert();

return false;

}

if(gps_enabled)

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);

if(network_enabled)

lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);

timer1=new Timer();

timer1.schedule(new GetLastLocation(), 30000);

return true;

}

public void showSettingsAlert(){

AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

alertDialog.setCancelable(false);

// Setting Dialog Title

alertDialog.setTitle("GPS Is Not Enabled");

// Setting Dialog Message

alertDialog.setMessage("Please Enabled Wireless Network And GPS");

// On pressing Settings button

alertDialog.setNeutralButton("OK", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,int which) {

dialog.cancel();

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

mContext.startActivity(intent);

}

});

// Showing Alert Message

alertDialog.show();

}

LocationListener locationListenerGps = new LocationListener() {

public void onLocationChanged(Location location) {

timer1.cancel();

locationResult.gotLocation(location);

lm.removeUpdates(this);

lm.removeUpdates(locationListenerNetwork);

}

public void onProviderDisabled(String provider) {}

public void onProviderEnabled(String provider) {}

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

};

LocationListener locationListenerNetwork = new LocationListener() {

public void onLocationChanged(Location location) {

timer1.cancel();

locationResult.gotLocation(location);

lm.removeUpdates(this);

lm.removeUpdates(locationListenerGps);

}

public void onProviderDisabled(String provider) {}

public void onProviderEnabled(String provider) {}

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

};

class GetLastLocation extends TimerTask {

@Override

public void run() {

lm.removeUpdates(locationListenerGps);

// lm.removeUpdates(locationListenerNetwork);

Location net_loc=null;

Location gps_loc=null;

if(gps_enabled)

gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if(network_enabled)

net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

//if there are both values use the latest one

if(gps_loc!=null && net_loc!=null){

if(gps_loc.getTime() > net_loc.getTime())

locationResult.gotLocation(gps_loc);

else

locationResult.gotLocation(net_loc);

return;

}

if(gps_loc!=null){

locationResult.gotLocation(gps_loc);

return;

}

if(net_loc!=null){

locationResult.gotLocation(net_loc);

return;

}

locationResult.gotLocation(null);

}

}

public static abstract class LocationResult{

public abstract void gotLocation(Location location);

}

}

Thanks..

网友答案:

You can use the below service for getting gps.just invoke this service at the begining.

public class MyService extends Service {

LocationManager locationManager;
@Override
public void onCreate() {

    //

        // TODO Auto-generated method stub

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

        /** Criteria for selecting best provider */

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        /** Passing criteria and select only enabled provider */
        String provider = locationManager.getBestProvider(criteria, true);
        Location location = locationManager.getLastKnownLocation(provider);
        /** calls the Location Listner */
        locationManager.requestLocationUpdates(provider, 500, 0,locationListener);
    }

    private final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            updateWithNewLocation(location);
        }

        public void onProviderDisabled(String provider) {
            updateWithNewLocation(null);
        }

        public void onProviderEnabled(String provider) {
        }

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

    private void updateWithNewLocation(Location location) 
    {

        System.out.println("+++++++++++++++++++SASI+++++++++++++++++++++++++++++++++++++++++");
        String latLongString, addressString = null;
        double lat = 0, lng = 0;
        if (location != null) {
            lat = location.getLatitude();
            lng = location.getLongitude();
            //latLongString = "Lat:" + lat + "\nLong: " + lng;

            /** Getting Address */


        } else {
            latLongString = "No location found";
            addressString = "No location found";
        }
        //System.out.println("@@@@@@@@@@@" + addressString + lat + lng);
        SearchDeals.latPoint=location.getLatitude();
        SearchDeals.lngPoint=location.getLongitude();




        Deals_route.sourcelati=location.getLatitude();
        Deals_route.sourcelong=location.getLongitude();

    }




@Override
public void onDestroy() {

    super.onDestroy();

    //

    //Toast.makeText(this, "GPS Service Destroyed", Toast.LENGTH_LONG).show();

    locationManager.removeUpdates(locationListener);

    System.out.println("@@@@@@@@@@@ inside ONDESTROY GPS listener removed");

}

@Override
public int onStartCommand(Intent intent, int flags, int startId)

{

    //

    Log.v("StartServiceAtBoot", "StartAtBootService -- onStartCommand()");

    //Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();

    // We want this service to continue running until it is explicitly

    // stopped, so return sticky.

    return START_STICKY;

}  




@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

}

网友答案:

I've just tested the above code on my device and everything is working smoothly, not sure what is the problem at your end.

Important notes:

  • Please make sure you have the permission to access GPS location in your manifest file

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

  • The code may not work properly on the emulator , better test on actual device. if you don't have access to one , please checkout the DMMS Emulator Control to generate location data

Edit:

you need to commit out the Location data related to Network Provider.

and Also remove the textView.setText from your LocationResult object because textView is null. so the fixes:

getLocation(Location location) {
.........
String loc = "Lattitude: "+location.getLatitude()+"  longi  "+location.getLongitude()+"  Accur "+location.getAccuracy()+"  Time "+location.getTime() +" "+location.getProvider();

Log.i("Log",loc);
Toast.makeText(MainActivity.this, loc, Toast.LENGTH_LONG).show();
}

and comment out the network code from your MyLocation class

 // if(network_enabled)

// lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);

分享给朋友:
您可能感兴趣的文章:
随机阅读: