【问题标题】:onLocationChanged() never calledonLocationChanged() 从未调用过
【发布时间】:2012-08-09 15:49:50
【问题描述】:

我正在编写一个代码,它会带来当前位置,但它没有给我位置,因为它从不调用 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();
    }
}
   }

【问题讨论】:

  • 如果你检查模拟器或设备?
  • 当我启动它时第一次在(真机上)没有,它没有调用 onLocationChanged() 所以变量 mobileLocation 是 null 。意味着有时它会获取位置,但不是在点击时。
  • 虽然已经很晚了但是希望这个评论可以帮到别人,看看这个链接:lengrand.fr/2013/10/…

标签: android gps locationmanager


【解决方案1】:

我在真实设备上运行我的应用程序。 我使用网络而不是 GPS,并且调用了 onLocationChanged:

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

【讨论】:

  • 这对我也有用,如果你有机会详细说明请做:)
【解决方案2】:

您是否从未获得位置,或者只是在您的评论中写道“有时它会获得位置,但不是在点击时获得位置。”?

可能是您的代码比 LocationManager 更快,它可能尚未调用 onLocationChanged()。更改您的代码以获取最后一个已知位置,或等到您的 locListener 被调用:

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

【讨论】:

    【解决方案3】:

    LocationManager.NETWORK_PROVIDER需要网络,但真实,不精确;如果要使用LocationManager.GPS_PROVIDER,则必须在室外而不是室内,因为GPS定位需要卫星,如果您在任何建筑物中,卫星都找不到您!

    【讨论】:

    • 天啊!这解决了我的问题。没有调用回调,因为我在建筑物中。当我出去的时候,工作就像一个魅力。
    【解决方案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" />
    

    或

    声明适当的类

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

    【讨论】:

    • 告诉我方法 onLocationChanged() 何时调用??何时更改位置或何时我们调用侦听器??
    【解决方案5】:

    在locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener)之后直接添加如下代码:

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

    编辑:感谢@Fabian Streitel 的评论,更正了代码。

    【讨论】:

    • locManager 在您的示例中不是一个函数。我认为你的代码甚至不会编译
    • @FabianStreitel,你是对的,我只是犯了一个愚蠢的错误,因为我错过了 .requestLocationUpdates。我编辑了答案
    【解决方案6】:
    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));
    

    【讨论】:

      【解决方案7】:

      在我的情况下,应用程序没有请求权限。虽然我已经在清单文件中添加了权限。所以我无法让我的应用访问该位置。

      作为修复,我手动转到:Settings-&gt;Permissions-&gt;Your location 并为我正在开发的应用程序启用了位置权限。这解决了我的问题。

      我认为此问题仅在通过 Android Studio 安装应用程序时出现。我希望从 Google Play 安装应用程序时不会出现这种情况。

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        相关资源
        最近更新 更多