2012-03-30 150 views
1

即使GPS已打開且網絡已滿,有時我無法獲取當前位置的經度和緯度值,但有時我能夠獲取有時顯示緯度的值和經度爲0 ....有人可以幫助我。無法獲取經度和緯度android

這裏是我使用的代碼:

package com.fitness24.my24; 
import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 
    LocationResult locationResult; 
    boolean gps_enabled=false; 
    boolean network_enabled=false; 

    public boolean getLocation(Context context, LocationResult result) 
    { 
     //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); 

     //exceptions will be thrown if provider is not permitted. 
     try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
     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) 
      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.scheduleAtFixedRate(new GetLastLocation(), 0, 5000); 
     return true; 
    } 

    public void removeGPS() 
    { 

     try { 
      if(lm != null) 
      { 
       timer1.cancel(); 

       if(lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
       { 
       lm.removeUpdates(locationListenerGps); 
       locationListenerGps = null; 
       } 

       if(lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
       { 
       lm.removeUpdates(locationListenerNetwork); 
       locationListenerNetwork = null; 
       } 


      lm = null; 
      } 
     } catch (Exception e) { 

     } 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
     public void onLocationChanged(Location location) { 

      locationResult.gotLocation(location); 

     } 
     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) { 

      locationResult.gotLocation(location); 

     } 
     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() { 

      Location net_loc=null, 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); 
    } 
} 

/////////////////getting current location/////////////////////////// 



private void getCurrentLocation(){ 


     try { 

      Log.e("", "showmap location triggered" + Singleton.getSingletonForXml().sLat + "" 
        + Singleton.getSingletonForXml().sLng); 
      LocationResult locationResult = new LocationResult() { 

       @Override 
       public void gotLocation(Location location) { 
        // TODO Auto-generated method stub 
        if (location != null) { 


         Singleton.sLat = location.getLatitude(); 
         Singleton.sLng= location.getLongitude(); 
         Log.e("", "showmap location triggered" + Singleton.getSingletonForXml().sLat + "" 
           + Singleton.getSingletonForXml().sLng); 

         if(myLocation != null) 
         { 
          myLocation.removeGPS(); 
          Log.i("location", "location acheived and remove gps - inside"); 
         } 

        } 
       } 

      }; 

      myLocation = new MyLocation(); 
      myLocation.getLocation(this, locationResult); 
    } 
+0

太多的代碼只是通過閱讀沒有更多的信息。 「有時不能」是什麼意思?它會返回錯誤的值嗎?崩潰?任何錯誤消息? – 2012-03-30 06:39:04

+0

「有時它工作正常」......其他時間會發生什麼? – 5hssba 2012-03-30 06:40:09

+0

您從未在LocationListener中使用過這些位置。您只是說getLocation()..但是從來沒有使用它... – ngesh 2012-03-30 06:43:43

回答

0

添加以下是您的清單中的權限:

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

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

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

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

很簡單,

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
double longitude = location.getLongitude(); 
double latitude = location.getLatitude(); 

不要忘記使用這個權限

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

我建議嘗試這個代碼,我用這個代碼過了,就像一個魅力:

package com.fitness24.my24; 

import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 
    LocationResult locationResult; 
    boolean gps_enabled=false; 
    boolean network_enabled=false; 

    public boolean getLocation(Context context, LocationResult result) 
    { 
     //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); 

     //exceptions will be thrown if provider is not permitted. 
     try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
     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){ 
      System.out.println("gps and/or network disabled"); 

      return false; 
     } 
     if(gps_enabled){ 
      System.out.println("gps enabled"); 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
     } 
     if(network_enabled) 
      System.out.println("network enabled"); 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
     timer1=new Timer(); 
     timer1.schedule(new GetLastLocation(), 25000); 

     return true; 
    } 



    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, 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); 
    } 
} 

然後在你的主類:

import com.fitness24.my24.MyLocation.LocationResult; 
import android.location.Location; 

也會顯示在您的主要添加此,調用/收到的GPS:

private void locationClick() { 
     myLocation.getLocation(this, locationResult); 
    } 

    public LocationResult locationResult = new LocationResult() { 
     public void gotLocation(final Location location) { 
      try { 
      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 
       if (lat != 0.0 && lng != 0.0) { 

        String sLat; 
        String sLng; 
        sLat = Double.toString(lat); 
        sLng = Double.toString(lng); 
        gps_location = sLat+" "+sLng; 
        Toast.makeText(getBaseContext(), "We got gps location!", Toast.LENGTH_LONG) 
        .show(); 

       } 
      }catch (Exception e) { 

      } 
     } 
    }; 

locationClick()是我的按鈕的onClick事件(即可呼叫/收到的GPS信息)

另外,不要」 t忘記將其添加到清單中:

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

這是使用GPS獲取當前經度和緯度值的最佳方式。 我已經嘗試過這一點,並獲得了良好的效果..

Link

注:請在Android手機進行測試。在Android手機中,您必須打開GPS狀態。