2017-09-08 25 views
2

android.location.LocationListenerのロケーションリスナーのonLocationChanged()関数で発生します。Androidでは、GPS位置を連続的に受信する方法は?

LocationManagerのrequestLocationUpdatesを要求した後、onLocationChangedが不均等な間隔で呼び出されます。つまり、1秒に1時間を設定しましたが、1秒ごとに位置の変更を受け取りません。

+0

continiusly位置を取得する位置情報サービスを作成します –

答えて

0
public class CustomLocationService extends Service implements LocationListener { 


private static final Location TODO = null; 
boolean isGPSEnabled = false; 
boolean isNetworkEnabled = false; 
public boolean canGetLocation = false; 

Location location; 

double latitude; 
double longitude; 

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; 
private static final long MIN_TIME_BW_UPDATES = 10000 * 60 * 1; 
private CommonSharedPreference commonSharedPreference = new CommonSharedPreference(); 

protected LocationManager locationManager; 
private long time; 
Context context; 


@Override 
public void onCreate() { 
    super.onCreate(); 
    context = this; 

    time = MIN_TIME_BW_UPDATES; 
    getLocation(); 

} 

@Override 
public void onStart(Intent intent, int startId) { 
    getLocation(); 
} 

@Override 
public void onDestroy() { 
    // handler.removeCallbacks(sendUpdatesToUI); 
    super.onDestroy(); 
    Log.v("STOP_SERVICE", "DONE"); 
    locationManager.removeUpdates(GPSTracker.this); 
} 

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE); 

     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

     isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) { 
      // no network provider is enabled 

     } else { 
      this.canGetLocation = true; 
      // First get location from Network Provider 
      if (isNetworkEnabled) { 
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        return TODO; 
       } 
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       if (locationManager != null) { 
        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
      // if GPS Enabled get lat/long using GPS Services 
      if (isGPSEnabled) { 
       if (location == null) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return location; 
} 


public void stopUsingGPS() { 
    if(locationManager != null) { 
     locationManager.removeUpdates(GPSTracker.this); 
    } 
} 

public double getLatitude() { 
    if(location != null) { 
     latitude = location.getLatitude(); 
    } 
    return latitude; 
} 

public double getLongitude() { 
    if(location != null) { 
     longitude = location.getLongitude(); 
    } 

    return longitude; 
} 

public boolean canGetLocation() { 
    return this.canGetLocation; 
} 


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

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

} 

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

} 

@Override 
public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
    // TODO Auto-generated method stub 

} 

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

}、使用しているperiod引数は、位置更新の間の最小間隔です。ロケーションシステムの更新と同じくらい速くロケーションを取得する場合は、periodをゼロに設定します。

+0

こんにちは、まず、あなたのコードをありがとうございますが、私の問題は、場所を受け取っていないが、それらを常に得ることではありません!最後に知られているlocationManagerのLocationを使用していますが、使用しないように要求されています.30秒間隔で現在の場所が必要です –

+0

サービスが一度星になったらonLocationChangedは指定された間隔で現在地を返します –

0

According to the documentation

import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.util.Log; 

@SuppressWarnings("MissingPermission") 
public class SimplePositionProvider extends PositionProvider implements LocationListener { 

public SimplePositionProvider(Context context, PositionListener listener) { 
super(context, listener); 

Log.i("SimplePositionProvider", "start"); 
if (!type.equals(LocationManager.NETWORK_PROVIDER)) { 
type = LocationManager.GPS_PROVIDER; 
} 

} 

public void startUpdates() { 
Log.i("startUpdates", "start"); 
try { 
Log.i("requestLocationUpdates", "start"); 
Log.i("TYPE", type); 
locationManager.requestLocationUpdates(type, period, 0, this); 
} catch (Exception e) { 
e.printStackTrace(); 
Log.e(TAG, "error"); 
} 
} 

public void stopUpdates() { 
Log.i("stopUpdates", "start"); 
locationManager.removeUpdates(this); 
} 

@Override 
public void onLocationChanged(Location location) { 
Log.i("onLocationChanged", "start"); 
updateLocation(location); 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
Log.i("onStatusChanged", "start"); 
} 

@Override 
public void onProviderEnabled(String provider) { 
Log.i("onProviderEnabled", "start"); 
} 

@Override 
public void onProviderDisabled(String provider) { 
Log.i("onProviderDisabled", "start"); 
} 

} 
+0

ありがとうございます。位置受信が安定していない場合、時間間隔の後に切断されます。エミュレータでは、連続的に受信場所に問題はありません。 –

+0

@BonnySebastianあなたはあなたの質問に言い返すべきです。それはそれが求めているようではありません。 – Haem

0

このクラスを使用し..

public class MyLocationService extends Service { 
    private static final String TAG = "MyLocationService"; 
    private LocationManager mLocationManager = null; 
    private static final int LOCATION_INTERVAL = 1000 * 30;; 
    private static final float LOCATION_DISTANCE = 0f; 


    private final IBinder serviceBinder = new MyLocationService.RunServiceBinder(); 

    public MyLocationService() { 
    } 

    LocationListener[] mLocationListeners = new LocationListener[]{ 
      new LocationListener(LocationManager.GPS_PROVIDER), 

    }; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e(TAG, "onStartCommand"); 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 

    @Override 
    public void onCreate() { 

     Log.e(TAG, "onCreate"); 

     initializeLocationManager(); 

    /* try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[1]); 
     } catch (java.lang.SecurityException ex) { 
      Log.i(TAG, "fail to request location update, ignore", ex); 
     } catch (IllegalArgumentException ex) { 
      Log.d(TAG, "network provider does not exist, " + ex.getMessage()); 
     }*/ 



     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[0]); 
     } catch (java.lang.SecurityException ex) { 
      Log.i(TAG, "fail to request location update, ignore", ex); 
     } catch (IllegalArgumentException ex) { 
      Log.d(TAG, "gps provider does not exist " + ex.getMessage()); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     Log.e(TAG, "onDestroy"); 
     super.onDestroy(); 
     if (mLocationManager != null) { 
      for (int i = 0; i < mLocationListeners.length; i++) { 
       try { 
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         return; 
        } 
        mLocationManager.removeUpdates(mLocationListeners[i]); 
       } catch (Exception ex) { 
        Log.i(TAG, "fail to remove location listener, ignore", ex); 
       } 
      } 
     } 
    } 

    private void removeUpdate(){ 
     if (mLocationManager != null) { 
      for (int i = 0; i < mLocationListeners.length; i++) { 
       try { 
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
         return; 
        } 
        mLocationManager.removeUpdates(mLocationListeners[i]); 
       } catch (Exception ex) { 
        Log.i(TAG, "fail to remove location listener, ignore", ex); 
       } 
      } 
     } 
    } 

    private void initializeLocationManager() { 
     Log.e(TAG, "initializeLocationManager - LOCATION_INTERVAL: " + LOCATION_INTERVAL + " LOCATION_DISTANCE: " + LOCATION_DISTANCE); 
     if (mLocationManager == null) { 
      mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     // throw new UnsupportedOperationException("Not yet implemented"); 
     return null; 
    } 

    public class RunServiceBinder extends Binder { 
     public MyLocationService getService() { 
      return MyLocationService.this; 
     } 
    } 


    private class LocationListener implements android.location.LocationListener { 
     Location mLastLocation; 

     public LocationListener(String provider) { 
      Log.e(TAG, "LocationListener " + provider); 
      // Toast.makeText(MyLocationService.this, ""+provider, Toast.LENGTH_SHORT).show(); 
      mLastLocation = new Location(provider); 
     } 

     @Override 
     public void onLocationChanged(Location location) { 
      Log.e(TAG, "onLocationChanged: " + location); 
      // Toast.makeText(MyLocationService.this, ""+"checked", Toast.LENGTH_SHORT).show(); 
      mLastLocation.set(location); 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Log.e(TAG, "onProviderDisabled: " + provider); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      Log.e(TAG, "onProviderEnabled: " + provider); 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      Log.e(TAG, "onStatusChanged: " + provider); 
     } 
    } 


} 
+0

私のガラステーブルに置いている間に開始して停止する時間がかかる(上記のコードと同じ) –

0

tutorialによると、あなたは、位置情報の更新を要求するためにFusedLocationProviderClientを使用する必要があります。メモリが使用されている場合、そのソリューションは指定された間隔で更新を送信します。電話番号LocationServices.getFusedLocationProviderClient(Context context)FusedLocationProviderClientを得ることができます。

あなたはsetExpirationDurationLocationRequestでリクエストの有効期限の時間を設定し、次にあなたが各期間満了後に再スタートへの更新を起動したときに、このコードのようなものを使用することができます。

Handler handler = new Handler(Looper.myLooper()); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     if (expectingLocationUpdates) { 
     restartLocationUpdates(); 
     } 
    } 
}, EXPIRATION_DURATION); 
関連する問題