0

私の目標は、特定の間隔 (x 秒) の間に requestlocationupdate() メソッドを使用してネットワーク プロバイダーから定期的に位置情報の更新を取得し、次に LocationManager.removeUpdates() メソッドを実行して更新を削除し、消費電力を最小限に抑えることです。

私が直面した問題は、requestlocationupdate() メソッドが呼び出され、45 秒ごとに onlocationchanged メソッドを呼び出すことです。その「mintime」(このメソッドの 2 番目のパラメーター) が 45 未満であっても、なぜこれが起こるのですか?

また、2 番目の問題は各間隔の間にあります。requestlocationupdates メソッドを呼び出して、ユーザーの現在の緯度と経度を記録し、最後の場所で記録された緯度と経度と比較する必要があります。 )、「あなたの最後の場所は...」と表示し、場所に変更があった場合は「あなたの更新された場所は....」と表示します。
どうすればできますか?

私はこの問題を解決しようとしましたが、handler.post(myRunnable) を使用し、timertask クラスで実行可能なオブジェクトを呼び出して、timertask 入力パラメーターで決定された (x 秒) ごとに requestlocationupdates() メソッドを実行しました。

このコードをテストしたところ、x 秒ごとに緯度と経度が取得されましたが、同じ場所にいても記録された値が変化していました。

また、onlocationchanged()オーバーライドメソッドにコードを書くことは、省エネの面から良いアプローチを表していますか?

また、ネットワーク プロバイダー (wifi/3G) の精度を取得する方法を教えてください。

どんな助けでも大歓迎です!

コードは次のようになります。

初期化:

Timer t1;
Timer t2;
TimerTask mTimerTask1;
TimerTask  mTimerTask2;
Handler hand;
Handler hand1;
public LocationManager locationManager;
// flag for GPS status
boolean isGPSEnabled = false;

// flag for network status
boolean isNetworkEnabled = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
double Altitude; // longitude
double accuracy; // accuracy


// The minimum distance to change notifications Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 0 meters

// The minimum time between notifications updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 10; // 10 sec 

ハンドラー部分:

 Runnable run1 = new Runnable() {
    public void run() {

        mTimerTask1 = new TimerTask() {
            public void run() {
                hand.post(new Runnable() {
                    public void run() {
                        if(check_conectivity()){
                            //flag1=false;
                            get_location();
                            time++;
                        }

                    }
                });

            }
        };
t1.scheduleAtFixedRate(mTimerTask1, 0, 10000);

    }
};

check_connectivity メソッド:

public boolean check_conectivity(){


    // put the reference LocationManger
    locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
    // getting network status
    // isProviderEnabled ==> Returns the current enabled/disabled status of the NETWORK_PROVIDERr.
    //  If the user has enabled this provider in the Settings menu, true is returned otherwise false is returned
    isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    if ( !isNetworkEnabled) {
        // no network provider is enabled
        showSettingsAlert();
        return false;

    } 
    else{

        return true;
    }

}

get_location メソッド:

public void get_location(){

                    if (isNetworkEnabled) {

    locationManager.requestLocationUpdates(
            LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
    Log.d("Network", "Network");

onlocationchanged() オーバーライド メソッド:

if (locationManager!= null){

    location = locationManager
            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

    if (location != null) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();

        tv2.setText("Your last Location is - \nLat: " + latitude + "\nLong: " + longitude );
        tv3.setText("Last estimeted location number : " + time1);
        time1++;
        stopUpdating();
4

1 に答える 1

0

任意のネットワーク プロバイダー (wifi/3G) の精度を取得する方法を教えてください。

私が知っているように、あなたはできません。ただし、応答をフィルタリングして、精度が ..... の場合にのみ通知するようにデバイスに指示できます。

postDelayed代わりに使用できる最初のオフpost

private int mSampleDurationTime = 10000; // 10 sec for example 
...    
mHandler.postDelayed(mRunnable, mSampleDurationTime);`

2番目に、私の回答の1つで説明されている「最適な場所」を取得しようとすることができます。こちらのリンクを参照してください

それがあなたを助けることを願って、

于 2013-09-13T22:12:18.913 に答える