2012-08-13 80 views
17

我正在寫一個代碼,帶來當前的位置,但它沒有給我的位置,因爲它從來沒有調用onLocationChanged()。是否有任何方法來找到位置。onLocationChanged()從來沒有叫

mobileLocation在這種情況下是0,所以執行到else塊。

我的代碼是

public class FindLocation { 
private LocationManager locManager; 
private LocationListener locListener; 
private Location mobileLocation; 
private String provider; 

public FindLocation(Context ctx){ 
    locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE); 
    locListener = 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) { 
      System.out.println("mobile location is in listener="+location); 
      mobileLocation = location; 
     } 
    }; 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener);    
    if (mobileLocation != null) { 
     locManager.removeUpdates(locListener); 
     String londitude = "Londitude: " + mobileLocation.getLongitude(); 
     String latitude = "Latitude: " + mobileLocation.getLatitude(); 
     String altitiude = "Altitiude: " + mobileLocation.getAltitude(); 
     String accuracy = "Accuracy: " + mobileLocation.getAccuracy(); 
     String time = "Time: " + mobileLocation.getTime(); 
     Toast.makeText(ctx, "Latitude is = "+latitude +"Longitude is ="+londitude, Toast.LENGTH_LONG).show(); 
    } else { 
     System.out.println("in find location 4"); 
     Toast.makeText(ctx, "Sorry location is not determined", Toast.LENGTH_LONG).show(); 
    } 
} 
    } 
+1

如果你檢查模擬器或設備? – rajeshwaran 2012-08-13 12:06:39

+0

當我啓動它時,第一次沒有(真機),它不會調用onLocationChanged(),所以變量mobileLocation爲null。意思是有時它會得到位置,但不是在點擊時。 – 2012-08-13 13:23:10

+0

儘管已經很晚了,但我希望這個評論可以幫助別人,請看這個鏈接:http://www.lengrand.fr/2013/10/onlocationchanged-is-never-called-on-android – SMHJamali 2017-03-07 20:39:10

回答

5

你永遠不會得到一個位置,或者只如喲你在你的評論中寫道「有時它會得到位置,但不是在點擊時」。

可能是因爲你的代碼比LocationManager更快,它可能還沒有調用onLocationChanged()。更改您的代碼以獲取最後一個已知位置,或者等到您的locListener被調用:

locManager.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 1000, 1, locListener); 
mobileLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
if (mobileLocation != null) { 
4

我的事情你忘了許可

<uses-permission android:name="android.permission.ACCESS_GPS" /> 
     <uses-permission android:name="android.permission.ACCESS_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
     <uses-permission android:name="android.permission.INTERNET" /> 

OR

聲明合適的一個像

public class MyLocationListener implements LocationListener { 
@Override 
    public void onLocationChanged(Location arg0) { 
    latitude = arg0.getLatitude(); 
    longitude = arg0.getLongitude(); 
    } 

} 
+0

我已經完成這些所有的東西。 – 2012-08-13 13:42:53

+0

告訴我什麼時候onLocationChanged()方法調用?當位置改變或者我們每次調用監聽器時? – 2012-08-13 13:44:05

8

我在真實設備上運行我的應用程序。 我使用網絡,而不是GPS和onLocationChanged被稱爲:

locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null); 
+0

NETWORK_PROVIDER解決了我的問題。謝謝:) – Mehmood 2016-11-10 09:41:58

+0

這也適用於我,如果你有機會請電話:) – jobbert 2017-10-18 07:47:21

0

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener)之後直接添加以下代碼:

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener); 

編輯:代碼感謝校正到@Fabian Streitel評論。

+0

在你的例子中,locManager不是一個函數。我認爲你的代碼甚至不會編譯 – 2016-11-23 14:01:20

+0

@FabianStreitel,你是對的,我只是因爲缺少.requestLocationUpdates而犯了一個愚蠢的錯誤。我編輯了答案 – 2016-11-23 21:22:02

0
import android.app.ActivityManager; 
import android.app.Service; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.media.AudioManager; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.os.PowerManager; 
import android.util.Log; 

import org.json.JSONObject; 

import java.util.List; 


public class AndroidLocationServices extends Service { 

    PowerManager.WakeLock wakeLock; 
    String MODULE="AndroidLocationServices",TAG=""; 
    private LocationManager locationManager; 
    double getLattitude=0,getLogitude=0; 
    private static final long MIN_TIME_BW_UPDATES = 1; // 1 minute 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; 


    public AndroidLocationServices() { 
     // TODO Auto-generated constructor stub 
    } 

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

    @Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     preferences=getSharedPreferences(GlobalConfig.PREF_NAME, MODE_PRIVATE); 
     PowerManager pm = (PowerManager) getSystemService(this.POWER_SERVICE); 

     wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep"); 

     // Toast.makeText(getApplicationContext(), "Service Created", 
     // Toast.LENGTH_SHORT).show(); 

     Log.e("Google", "Service Created"); 

    } 

    @Override 
    @Deprecated 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 
     super.onStart(intent, startId); 

     Log.e("Google", "Service Started"); 

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

     //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2500, 0, listener); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, listener); 


    } 



    public LocationListener listener = new LocationListener() { 

     @Override 
     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 

      Log.e("Google", "Location Changed"); 
      location.setAccuracy(100); 

      if (location == null) 
       return; 
        getLattitude=location.getLatitude(); 
        getLogitude=location.getLongitude(); 

        Log.e("latitude", getLattitude + ""); 
        Log.e("longitude", getLogitude + ""); 


     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 

     } 
    }; 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 

//  wakeLock.release(); 

    } 


} 

清單:

<service android:name=".services.AndroidLocationServices"/> 

使用前啓動服務:

startService(new Intent(this, AndroidLocationServices.class)); 
0

在我的情況下,應用程序是沒有要求的權限。雖然我已在menifest文件中添加權限。所以我無法讓我的應用程序訪問該位置。

作爲修復,我手動去了:Settings->Permissions->Your location,併爲我的開發中應用程序啓用了位置權限。這解決了我的問題。

我認爲只有在通過Android Studio安裝應用程序時纔會出現此問題。我希望在從Google Play安裝應用程序時不會發生這種情況。