私の目標は、特定の間隔 (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();