Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onLocationChanged()从未调用_Android_Gps_Locationmanager - Fatal编程技术网

Android onLocationChanged()从未调用

Android onLocationChanged()从未调用,android,gps,locationmanager,Android,Gps,Locationmanager,我正在编写一个代码,它带来了当前位置,但它没有给我位置,因为它从未调用onLocationChanged()。是否有办法找到位置 对于这种情况,mobileLocation为0,因此执行转到else块 我的代码是 public class FindLocation { private LocationManager locManager; private LocationListener locListener; private Location mobileLocation; private

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

我想你忘了许可

<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" />

您是否从未获得位置,或者仅当您在评论中写道“有时它会获得位置,但在单击时不会获得位置”时才获得位置

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

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

我在真实设备上运行我的应用程序。 我使用网络而不是GPS,onLocationChanged被称为:

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

直接在
locManager.requestLocationUpdates(LocationManager.GPS\u PROVIDER,1000,1,locListener)
之后添加以下代码:

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener);
编辑:由于@Fabian Streitel的评论,更正了代码

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"/>

在我的情况下,应用程序没有请求权限。虽然我已经在menifest文件中添加了权限。因此,我无法允许我的应用程序访问该位置

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


我假设只有通过Android Studio安装应用程序时才会出现此问题。我希望从Google Play安装应用程序时不会出现这种情况。

LocationManager。网络提供商需要网络,但它是真实的,不精确的;如果您想使用
LocationManager.GPS\U PROVIDER
,情况必须是室外而不是室内,因为GPS定位需要卫星,如果您在任何建筑物中,卫星都找不到您

如果您在我启动Emulator或device时第一次检查Emulator或device?否(也在real machine上),它不会调用onLocationChanged(),因此变量mobileLocation为null。这意味着有时它会得到位置,但不是在单击时。虽然已经很晚了,但我希望此评论可以帮助其他人,请查看此链接:告诉我何时调用了method onLocationChanged()??当位置改变或调用侦听器时,在您的示例中,locManager不是一个函数。我不认为你的代码会compile@FabianStreitel,你是对的,我只是犯了一个愚蠢的错误,错过了。RequestLocationUpdate。我编辑了答案这也对我有用,如果你有机会,请做:)天哪!这就解决了我的问题。因为我在一幢大楼里,所以没有打回电话。当我外出工作时,我的工作很有魅力。
  <service android:name=".services.AndroidLocationServices"/>
 startService(new Intent(this, AndroidLocationServices.class));