私のAndroidアプリケーションでは、GPSプロバイダとネットワークプロバイダの両方を5秒間使用して位置情報を更新したいと考えています。まず、GPSプロバイダを使用したいのです(正確な結果が得られるため)。GPSプロバイダが0.0と0.0の緯度と経度を返す場合は、ネットワークプロバイダを使用したいと思いますが、両方のプロバイダ同時に。助言がありますか?GPSとネットワークプロバイダの両方を使用して現在地を取得する方法
4
A
答えて
8
package loca.loca;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class LocationActivity extends Activity {
double x,y;
Timer timer;
LocationManager lm;
boolean gps_enabled = false;
boolean network_enabled = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!gps_enabled && !network_enabled) { Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "nothing is enabled", duration);
toast.show();
}
if (gps_enabled)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
locationListenerGps);
if (network_enabled)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
locationListenerNetwork);
timer=new Timer();
timer.schedule(new GetLastLocation(), 20000);
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
timer.cancel();
x =location.getLatitude();
y = location.getLongitude();
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "gps enabled "+x + "\n" + y, duration);
toast.show();
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
timer.cancel();
x = location.getLatitude();
y = location.getLongitude();
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "network enabled"+x + "\n" + y, duration);
toast.show();
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};
class GetLastLocation extends TimerTask {
@Override
public void run() {
lm.removeUpdates(locationListenerGps);
lm.removeUpdates(locationListenerNetwork);
Location net_loc=null, gps_loc=null;
if(gps_enabled)
gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(network_enabled)
net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//if there are both values use the latest one
if(gps_loc!=null && net_loc!=null){
if(gps_loc.getTime()>net_loc.getTime())
{x = gps_loc.getLatitude();
y = gps_loc.getLongitude();
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "gps lastknown "+x + "\n" + y, duration);
toast.show();
}
else
{x = net_loc.getLatitude();
y = net_loc.getLongitude();
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "network lastknown "+x + "\n" + y, duration);
toast.show();
}
}
if(gps_loc!=null){
{x = gps_loc.getLatitude();
y = gps_loc.getLongitude();
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "gps lastknown "+x + "\n" + y, duration);
toast.show();
}
}
if(net_loc!=null){
{x = net_loc.getLatitude();
y = net_loc.getLongitude();
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "network lastknown "+x + "\n" + y, duration);
toast.show();
}
}
Context context = getApplicationContext();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, "no last know avilable", duration);
toast.show();
}
}}
0
1
public class MyLocation {
Timer timer1;
LocationManager lm;
LocationResult locationResult;
boolean gps_enabled=false;
boolean network_enabled=false;`
public boolean getLocation(Context context, LocationResult result)
{
//I use LocationResult callback class to pass location value from MyLocation to user code.
locationResult=result;
if(lm==null)
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
//exceptions will be thrown if provider is not permitted.
try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}
//don't start listeners if no provider is enabled
if(!gps_enabled && !network_enabled)
return false;
try{
if(gps_enabled)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
if(network_enabled)
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
timer1=new Timer();
timer1.schedule(new GetLastLocation(), 30000);
}catch(Exception x){
return false;
}
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
timer1.cancel();
locationResult.gotLocation(location);
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
class GetLastLocation extends TimerTask {
@Override
public void run() {
lm.removeUpdates(locationListenerGps);
lm.removeUpdates(locationListenerNetwork);
Location net_loc=null, gps_loc=null;
if(gps_enabled)
gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(network_enabled)
net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//if there are both values use the latest one
if(gps_loc!=null && net_loc!=null){
if(gps_loc.getTime()>net_loc.getTime())
locationResult.gotLocation(gps_loc);
else
locationResult.gotLocation(net_loc);
return;
}
if(gps_loc!=null){
locationResult.gotLocation(gps_loc);
return;
}
if(net_loc!=null){
locationResult.gotLocation(net_loc);
return;
}
locationResult.gotLocation(null);
}
}
public static abstract class LocationResult{
public abstract void gotLocation(Location location);
}
}
を最高のロケーション結果を取得するために基準を使用することができます。
final MyLocation myLocation = new MyLocation();
Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.post(new Runnable() {
public void run() {
locationResult = new LocationResult(){
@Override
public void gotLocation(final Location location){
//Got the location!
try{
Methods.savePre(context, ""+location.getLatitude(), "LATITUDE");
Methods.savePre(context, ""+location.getLongitude(), "LONGITUDE");
}catch(Exception x){
x.getMessage();
}
Got_loc= true;
// String geoAddress = "geo:" + location.getLatitude() + ","+ location.getLongitude() + "?z=15";
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoAddress));
// context.startActivity(intent);
}
};
myLocation.getLocation(context, locationResult);
}
});
while(!Got_loc){
Thread.sleep(150);
}
Loc = Methods.getPref(context, "LATITUDE") + "%%" + Methods.getPref
関連する問題
- 1. ネットワークプロバイダを使用して現在のロケーション名を取得
- 2. 現在地を取得する方法
- 3. GPSで現在地を取得
- 4. すぐにWebSocketを使用して現在地を取得する方法
- 5. FusedLocationProviderClientを使用してGoogleMapで現在地を取得する方法
- 6. GPSを使用して現在地を取得できません
- 7. GoogleApiClientでGPSを使用して現在地を取得できません
- 8. GPS現在地
- 9. コトリンで現在の現地日時を取得する方法
- 10. Googleマップの現在地(GPS)を取得するios sdk
- 11. 現在のGPS時刻を取得する方法は?
- 12. SwiftのCLLocationManagerを使用して現在地を取得する
- 13. iPhoneでGPSから現在地を特定する方法
- 14. LocationManagerを使用して現在地を取得する
- 15. google places APIを使用して現在地を取得する
- 16. スウィフト/現在の地図ピンのアドレスを取得する方法
- 17. Androidでユーザーの現在地を取得する方法
- 18. ユーザーの現在地を取得する方法
- 19. 建物内の現在地を取得する方法
- 20. osmdroidのネットワークプロバイダとの現在の場所を取得
- 21. MapsActivity AndroidStudioで現在地を取得する方法
- 22. アンドロイドでフォアグラウンドで現在地を取得する方法は?
- 23. iphoneの地図上で現在地の位置を取得する方法
- 24. PRISMを使用して地域内の現在のアクティブビューを取得する方法は?
- 25. google apiを使用してiOSの現在地から郵便番号を取得する方法
- 26. C#を使用してスタック内の現在のインデックスを取得する方法
- 27. アドインを使用してIEの現在のURLを取得する方法
- 28. コンボボックスエディタを使用してグリッドの現在の行を取得する方法
- 29. swiftを使用してappdelegateの現在の場所を取得する方法
- 30. jQueryを使用して要素の現在のドキュメントを取得する方法
2つの異なるLocationListenerを使用する理由はありますか?私はちょうど1つを使用し、それが使用している 'onLocationChange()'をチェックインできますか? – dee
ロケーションプロバイダごとに異なるLocationListenerオブジェクトを使用する必要があります。それ以外の場合は、最後に割り当てられたプロバイダが使用されます。 – Alex