web-dev-qa-db-ja.com

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();
    }
}
   }
21
abhishek ameta

場所を取得することはありませんか、それとも「時々場所を取得しますが、クリック時に取得しない」というコメントを書き込んでいるだけですか?

コードがLocationManagerよりも高速である可能性があります。これは、まだonLocationChanged()を呼び出していない可能性があります。最後の既知の場所を取得するためにコードを変更するか、locListenerが呼び出されるまで待ちます。

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

実際のデバイスでアプリを実行します。 GPSの代わりにネットワークを使用し、onLocationChangedが呼び出されます。

locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null);
12
Gal Rom

あなたが許可を忘れたこと

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

}
4
ckpatel

LocationManager.NETWORK_PROVIDERにはネットワークが必要ですが、実際のものであり、正確ではありません。 LocationManager.GPS_PROVIDERを使用する場合、GPSの位置情報に衛星が必要なため、状況は屋内ではなく屋外である必要があります。建物内にいる場合、衛星はあなたを見つけることができません。

2
Tom
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
ViramP

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener)の直後に、次のコードを追加します。

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

編集:@Fabian Streitelによるコメントのおかげでコードを修正しました。

0
Ayaz Alifov

私の場合、アプリは権限を要求していませんでした。メニフェストファイルにアクセス許可を追加しましたが。そのため、アプリに位置情報へのアクセスを許可することができませんでした。

修正として、手動でSettings->Permissions->Your locationにアクセスし、開発中のアプリの位置情報のアクセス許可を有効にしました。そして、それは私の問題を修正しました。

この問題は、Android Studioを介してアプリをインストールした場合にのみ発生すると考えています。GooglePlayからアプリをインストールした場合は、問題が発生しないことを願っています。

0
Adil Malik