8

次のシナリオで Android で現在の場所を取得する最良の方法は何ですか?

  1. GPS が利用できない場合は、ネットワーク プロバイダーから位置情報を取得します

  2. GPS が利用可能で、現在の位置を取得できる場合は、GPS プロバイダーから位置を取得します

  3. GPS が利用可能であるが、現在の位置を取得できない場合 (つまり、継続的に位置を検索している場合)、ネットワーク プロバイダーから位置を取得します。

    GPS が利用できない場合でも、ネットワークから場所を取得できるようになりました。上記のシナリオを満たすための最良の回答は高く評価されています。前もって感謝します。

4

3 に答える 3

3

さて、TimerクラスとTimerTaskクラスを使用できます。

LocationManager manager;
TimerTask mTimertask;
GPSLocationListener mGPSLocationListener;
int i = 0; //Here i works as counter;
private static final int MAX_ATTEMPTS = 250;

public void getCurrentLocation() {
    manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    mGPSLocationListener = new GPSLocationListener();

    manager.addGpsStatusListener(mGPSStatusListener);
    mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER);

    if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        Log.v(TAG, "GPS ENABLED");
        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,
                50.0f, mGPSLocationListener);
    } else {
        turnGPSOn();
        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L,
                50.0f, mGPSLocationListener);
    }
    
    if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L,
                50.0f, mNetworkLocationListener);
    }

    if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
        Log.v(TAG, "GPS ENABLED");
        manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                1000L, 50.0f, mGPSLocationListener);
    }

    myLocTimer = new Timer("LocationRunner", true);
    myLocTimer.schedule(mTimerTask, 0, 500);
}

GPSStatusListener

private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() {

    @Override
    public synchronized void onGpsStatusChanged(int event) {
        switch (event) {
        case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
            Log.v(TAG, "GPS SAtellitestatus");
            GpsStatus status = manager.getGpsStatus(null);
            mSattelites = 0;
            Iterable<GpsSatellite> list = status.getSatellites();
            for (GpsSatellite satellite : list) {
                if (satellite.usedInFix()) {
                    mSattelites++;
                }
            }
            break;

        case GpsStatus.GPS_EVENT_FIRST_FIX:
            /*
             * Toast.makeText(getApplicationContext(), "Got First Fix",
             * Toast.LENGTH_LONG).show();
             */
            break;

        case GpsStatus.GPS_EVENT_STARTED:
            /*
             * Toast.makeText(getApplicationContext(), "GPS Event Started",
             * Toast.LENGTH_LONG).show();
             */
            break;

        case GpsStatus.GPS_EVENT_STOPPED:
            /*
             * Toast.makeText(getApplicationContext(), "GPS Event Stopped",
             * Toast.LENGTH_LONG).show();
             */
            break;
        default:
            break;
        }
    }
};

ロケーションリスナー

public class GPSLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location argLocation) {
        location = argLocation;
    }

    public void onProviderDisabled(String provider) {

    }

    public void onProviderEnabled(String provider) {

    }

    public void onStatusChanged(String provider, int status, Bundle extras) {

    }
}

TimerTask クラス

class LocTimerTask extends TimerTask {
    String provider;

    public LocTimerTask(String provider) {
        this.provider = provider;
    }

    final Handler mHandler = new Handler(Looper.getMainLooper());

    Runnable r = new Runnable() {
        @Override
        public void run() {
            i++;
            Log.v(TAG, "Timer Task run" + i);
            location = manager.getLastKnownLocation(provider);

            if (location != null) {
                Log.v(TAG, "in timer task run in if location not null");
                isGPS = true;
                onLocationReceived(location);
                myLocTimer.cancel();
                myLocTimer.purge();
                mTimerTask.cancel();
                return;
            } else {
                Log.v(TAG, "in timer task run in else location null");
                isGPS = false;
                if (location == null && i == MAX_ATTEMPTS) {
                    Log.v(TAG, "if 1 max attempts done");
                    turnGPSOff();
                    location = manager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        Log.v(TAG,
                                "if 1 max attempts done Location from network not null");
                        Log.v(TAG,
                                "if 1 max attempts done Location from network not null coordinates not null");
                        onLocationReceived(location);
                        myLocTimer.cancel();
                        myLocTimer.purge();
                        mTimerTask.cancel();
                        return;
                    }
                } else {
                    return;
                }
            }
            i = 0;
        }
    };

    public void run() {
        mHandler.post(r);
    }
}

ここでは、タイマーが 500 ミリ秒ごとに実行されるようにスケジュールされています。つまり、500 ミリ秒ごとにタイマー タスクrun methodが実行されます。実行方法では、特定の番号の GPS プロバイダーから位置を取得してみてください。試行回数 (ここでは MAX_ATTEMPTS ) は 5 または 10 と言います。そうでなければ、カウンター (ここでは i ) の値が MAX_ATTEMPTS を超えた場合は、その場所を使用し、ネットワーク プロバイダーから場所を取得します。場所を取得するときに、その場所をコールバック メソッドonLocationReceived(Location mLoc)に渡しました。このメソッドで、場所データをさらに処理できます。コールバック メソッドの使用方法は次のとおりです。

リスナー

public interface OnLocationReceivedListener {
public void onLocationReceived(Location mLoc); //callback method which will be defined in your class.

}

クラスは、上記で定義されたリスナーを実装する必要があります。あなたのクラスで:

@Override
public void onLocationReceived(Location mLoc) {
    //Do your stuff
}

それが役に立てば幸い。誰かがより良いアプローチを持っている場合は、私に知らせてください。

于 2013-03-27T07:56:00.047 に答える
0
If GPS is available and can get current location, 

上記の質問については、次のように試すことができます..

これを使用して、現在の場所の緯度と経度を取得し、値を渡して地図を取得できます。

public class MyLocationListener implements LocationListener

{

@Override

public void onLocationChanged(Location loc)

{

loc.getLatitude();

loc.getLongitude();

String Text = “My current location is: “ +

“Latitud = “ + loc.getLatitude() +

“Longitud = “ + loc.getLongitude();

Toast.makeText( getApplicationContext(),

Text,

Toast.LENGTH_SHORT).show();

}

@Override

public void onProviderDisabled(String provider)

{

Toast.makeText( getApplicationContext(),

“Gps Disabled”,

Toast.LENGTH_SHORT ).show();

}

@Override

public void onProviderEnabled(String provider)

{

Toast.makeText( getApplicationContext(),

“Gps Enabled”,

Toast.LENGTH_SHORT).show();

}

@Override

public void onStatusChanged(String provider, int status, Bundle extras)

{

}

}

}
于 2013-03-27T06:31:23.847 に答える
0

クラスメンバーboolean mIsGpsFix;

GPS 位置情報の更新をリクエストし、カウントダウン タイマーを設定する

mCountDown.start();

private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right)
{

    @Override
    public void onTick(long millisUntilFinished)
    {

    }

    @Override
    public void onFinish()
    {
        // No fix after the desire amount of time collapse
        if (!mIsGpsFix)
        // Register for Network
    }
};
于 2013-03-27T06:44:13.223 に答える