2012-08-13 77 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安装应用程序时不会发生这种情况。