私は、ユーザーの現在の場所を必要とし(lastknownlocationはあまり役に立ちません)、データベースから取得したユーザーに最も近いすべての「アイテム」のリストを表示するアプリを作成しています。
最も近いアイテムの検索はうまく機能していますが、当面はハードコードされた緯度と経度の場所のみを使用しますが、実際の場所の検索を実装するときが来ました。
誰かがアプリにバックグラウンドで現在の細かい場所を見つけてアプリを待たせる方法の例を提供できますか?人が移動しても場所が更新されない場合は、場所が1回だけ必要です。私はロケーションリスナーを実装しましたが、GPS修正の取得が遅くなる可能性があることを理解しています。最後の既知の場所を使用したり、実行と更新を継続する場所リスナーを実装したりする他の例を見てきましたが、アクティビティがアプリのクラッシュを表示する前に場所の座標が必要なためです。検索中に進行状況ダイアログを表示する必要があります。
locationlistenerをバックグラウンドで1回実行し、場所が見つかったら場所の更新を削除するにはどうすればよいですか。アプリケーションの残りの部分は、GPSの位置がわかるまで待つか、たとえば20〜30秒後にタイムアウトする必要があります。ProgressDialogを上げて、ユーザーが何かが起こっていることを認識できるようにしたいのですが、それはパーセンテージなどではなく、回転する読み込みアニメーションである必要があります。可能であれば、ユーザーが待つことにうんざりしている場合はダイアログをキャンセルできるようにしたいと思います。その場合は、代わりにsuburbなどと入力して検索できます。
私はスレッドでそれをやろうとしていましたが、それは私が思っているよりもずっと複雑になっていて、それでもとにかく機能していません。iPhoneではこれははるかに簡単ですか?
誰かがこれを行うための良い方法を提供できますか?私はこれで1週間髪を引き裂いていて、アプリの残りの完了日のスケジュールを本当に遅らせています。
要約すると、次のことを行います。
*現在の座標を検索する
*位置情報の取得中に進行状況ダイアログを表示する
*アプリは、位置情報が成功するのを待つか、一定時間後にあきらめることができますか?
*成功した場合:[進行状況]ダイアログを閉じ、座標を使用して、近くのアイテムを見つけるための他のメソッドを実行します。
*場所の取得に失敗した場合:進行状況ダイアログを閉じてエラーメッセージを表示し、メニューを使用して検索アクティビティに移動するようにユーザーに促します。
*ユーザーがメニューからマップビューを選択した場合は、これらの座標を使用して、データベースからの座標を使用して、マップ上の現在の場所と、近くのすべてのアイテムにドロップされたピンを表示します。
みんなありがとう、私は私が自分自身を十分に説明したことを望みます。ご不明な点がございましたら、この部分を完成させたいと思っているので、定期的に確認します。乾杯
要求に応じてコードを編集
locationListアクティビティファイル
protected void onStart()
{
super.onStart();
// ....
new LocationControl().execute(this);
}
private class LocationControl extends AsyncTask<Context, Void, Void>
{
private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);
protected void onPreExecute()
{
this.dialog.setMessage("Determining your location...");
this.dialog.show();
}
protected Void doInBackground(Context... params)
{
LocationHelper location = new LocationHelper();
location.getLocation(params[0], locationResult);
return null;
}
protected void onPostExecute(final Void unused)
{
if(this.dialog.isShowing())
{
this.dialog.dismiss();
}
useLocation(); //does the stuff that requires current location
}
}
public LocationResult locationResult = new LocationResult()
{
@Override
public void gotLocation(final Location location)
{
currentLocation = location;
}
};
LocationHelperクラス
package org.xxx.xxx.utils;
import java.util.Timer;
/*
imports
*/
public class LocationHelper
{
LocationManager locationManager;
private LocationResult locationResult;
boolean gpsEnabled = false;
boolean networkEnabled = false;
public boolean getLocation(Context context, LocationResult result)
{
locationResult = result;
if(locationManager == null)
{
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
}
//exceptions thrown if provider not enabled
try
{
gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
catch (Exception ex) {}
try
{
networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
catch (Exception ex) {}
//dont start listeners if no provider is enabled
if(!gpsEnabled && !networkEnabled)
{
return false;
}
if(gpsEnabled)
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
}
if(networkEnabled)
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
GetLastLocation();
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerNetwork);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location)
{
locationResult.gotLocation(location);
locationManager.removeUpdates(this);
locationManager.removeUpdates(locationListenerGps);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extra) {}
};
private void GetLastLocation()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
Location gpsLocation = null;
Location networkLocation = null;
if(gpsEnabled)
{
gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
if(networkEnabled)
{
networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
//if there are both values use the latest one
if(gpsLocation != null && networkLocation != null)
{
if(gpsLocation.getTime() > networkLocation.getTime())
{
locationResult.gotLocation(gpsLocation);
}
else
{
locationResult.gotLocation(networkLocation);
}
return;
}
if(gpsLocation != null)
{
locationResult.gotLocation(gpsLocation);
return;
}
if(networkLocation != null)
{
locationResult.gotLocation(networkLocation);
return;
}
locationResult.gotLocation(null);
}
public static abstract class LocationResult
{
public abstract void gotLocation(Location location);
}
}
これは、現在の場所を一度取得するだけの大きな努力のように思えますか?更新などは必要ありませんか?アプリケーションに結果を待たせる簡単な方法はありませんか?私はこれに長い間立ち往生しています。