OK、私はこのウェブサイトだけでなく、検索と読書に多くの時間を費やしました。ほとんどのスレッドはGPSを処理したり、エミュレータで動作させようとします。 developer.android.comのドキュメントでは、ポイントまでしか説明していません。私は仕事が簡単ではありません。この問題を抱えているほとんどの人のように、私はちょうどネットワークプロバイダから最後に知られている場所を取得したいと思います。私はGoogleマップを使用した直後(GPSがオフになったのでネットワークプロバイダを使用しています)わずか1/8~1/4マイル離れたところにあります。それで、 "プロバイダ"(携帯電話のタワー/ Wi-Fiがオンになっている場合)がGoogleマップの修正を取得しています。私は私のアプリを試して、最後の知られている場所を取得することはできません。私はマップでそれを表示しようとしていない、私はそれが位置を取得するためにボタンを押した後に、画面に緯度と経度を印刷することです。ドキュメントでは、同じアクティビティから最後の場所を作成する必要はありません。指定されたプロバイダから最後に知られている場所を返します。私はNETWORK_PROVIDERを指定しています。ドキュメントにはセルタワーとWi-Fiがあります。 (そして、はい、私はマニフェストでそれをカバーしています)電話でNETWORK_PROVIDERからgetLastKnownLocationを入力するとヌルが返されます。
これはどのように動作するのですか?私はまだGoogleのサイトでも良い説明を見ています。あなたが言うことができないなら、私は不満です。それは明らかに私がやっていること(またはそうではない)なので、私の必要性にはあまりにも足りないドキュメンテーションを除いて、私は誰か/誰かを責めることはない。
更新:現在、ロケーションリスナーを使用していて、ロケーションを取得しています。私は最後のロケーションを推測しています。ロケーションリスナーを介してロケーション更新を開始せずに最後のロケーションを取得できることは論理的ですが、私はそうではありませんでしたが、今はロケーションリスナーと一緒にいます。
私の問題は私が場所を変更することができないということです。私のコードは、リスナーを介して位置情報の更新を試みることを除いて、現在何もしていません。また、最後に知られている位置を取得するためにボタンを押すこともできます。 Googleマップで私の現在地が表示されますが、私は自分のコードで20マイル離れた場所を探し続けています。私は実際に新しい場所を取得している可能性があるという気持ちがありますが、最終的な/静的な宣言の誤った使用により、必要なときにその場所を保存して使用することができない場合があります。私のマニフェストはインターネットとfine_locationパーミッションを持ち、アクティビティのxmlはうまくいきます - 場所のライブ検索をオン/オフするボタン、lastknownlocationを手動で取得するボタン、緯度と経度を表示するためのテキストビューを提供します。私は、これが長すぎるのを避けるために、本質的でないものを取り除こうとしました。
public class RMain extends Activity {
public boolean islivesearchon;
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters
private static Location currentlocation;
private LocationManager locationManager;
private LocationListener locationListener;
public static Criteria criteria;
public TextView latview;
public TextView longview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rmain);
latview = (TextView) findViewById(R.id.display_latitude);
longview = (TextView) findViewById(R.id.display_longitude);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// setup bestProvider
criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
String bestprovider = locationManager.getBestProvider(criteria, true);
// get an initial current location
currentlocation = locationManager.getLastKnownLocation(bestprovider);
latview.setText(Double.toString(currentlocation.getLatitude()));
longview.setText(Double.toString(currentlocation.getLongitude()));
// Define locationListener interface
locationListener = new LocListener();
// React to LiveSearch toggle button press
final Button livesearch = (Button) findViewById(R.id.button_livesearch);
livesearch.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
TextView livesearchview = (TextView) findViewById(R.id.button_livesearch);
boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(islivesearchon) {
locationManager.removeUpdates(locationListener);
islivesearchon = false;
livesearchview.setText("Live Search is OFF");
}
else {
// ideally should check for !isProviderEnabled first, then provide option for turning it on
if(isNetEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener);
islivesearchon = true;
livesearchview.setText("Live Search is ON");
}
// ideally should check for !isProviderEnabled first, then provide option for turning it on
if(isGpsEnabled) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener);
islivesearchon = true;
livesearchview.setText("Live Search is ON");
}
}
}
});
// Respond to Get Location button click to get last known location
final Button getlocation = (Button) findViewById(R.id.button_getlocation);
getlocation.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String bestprovider = locationManager.getBestProvider(criteria, true);
Location lastlocation = locationManager.getLastKnownLocation(bestprovider);
latview.setText(Double.toString(lastlocation.getLatitude()));
longview.setText(Double.toString(lastlocation.getLongitude()));
}
});
}
private class LocListener implements LocationListener {
@Override
public void onLocationChanged(Location latestlocation) {
// Called when a new location is found by the network location provider.
currentlocation.set(latestlocation);
latview.setText(Double.toString(currentlocation.getLatitude()));
longview.setText(Double.toString(currentlocation.getLongitude()));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
};
}
あなたの携帯電話の中でシムはありますか? –
アプリケーションを最初に起動した時点で任意の場所を設定してから、getLastKnownLocationを取得してください。 –
ありがとうございます。はい、私は自分の電話の中でシムだけ - Eclipseのエミュレータは、常に私のために適切に実行されていません。 – crispy