多くの既存の例が正しく機能しないため、この領域のメソッドに対するいくつかの更新があったようです...
gps なしでネットワークから都市の名前を取得し、画面にトーストする方法を教えてもらえますか?
それは大歓迎です。
前もって感謝します。
多くの既存の例が正しく機能しないため、この領域のメソッドに対するいくつかの更新があったようです...
gps なしでネットワークから都市の名前を取得し、画面にトーストする方法を教えてもらえますか?
それは大歓迎です。
前もって感謝します。
これを行うには、ユーザーの IP アドレスを取得し、次のような無料の GeoLocation API サービスを使用します: http://freegeoip.net/static/index.html
これらのサービスはほとんどの場合 Wi-Fi で動作しますが、完全に信頼できるわけではありません。ユーザーがプロキシを使用している場合など、状況によっては、これらのサービスが誤った (または不正確な) 場所を提供することがあります。
3G では、これらのサービスは非常に不正確になる可能性があります。これはおそらく、電話に割り当てられた IP アドレスが、ネットワーク プロバイダーの中央ネットワークの場所に根ざしているためです。3G を使用している場合、都市について推測することには十分に注意してください。
NETWORK_PROVIDER
GPS を使用しない を使用して緯度と経度を取得します。Locator
これは、私が目的のために書いたユーティリティ クラスです。自由に使用して変更してください。7のアプリで動作し、テストされていminSdk
ます。
package com.emil;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
/**
* For determining location of user using various methods
*
* @author Emil http://stackoverflow.com/users/220710/emil
*
*/
public class Locator implements LocationListener {
static private final int TIME_INTERVAL = 100; // minimum time betweeen updates in milliseconds
static private final int DISTANCE_INTERVAL = 1; // minimum distance between updates in meters
static public enum Method {
NETWORK,
GPS,
NETWORK_THEN_GPS
}
private Context context;
private LocationManager locationManager;
private Locator.Method method;
private Locator.Listener callback;
public Locator(Context context) {
super();
this.context = context;
this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
public void getLocation(Locator.Method method, Locator.Listener callback){
this.method = method;
this.callback = callback;
switch(this.method){
case NETWORK:
case NETWORK_THEN_GPS:
Location networkLocation = this.locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if(networkLocation != null){
this.callback.onLocationFound(networkLocation);
}else{
System.out.println("REQUEST UPDATES to NETWORK PROVIDER");
this.requestUpdates(LocationManager.NETWORK_PROVIDER);
}
break;
case GPS:
Location gpsLocation = this.locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(gpsLocation != null){
this.callback.onLocationFound(gpsLocation);
}else{
System.out.println("REQUEST UPDATES to GPS PROVIDER");
this.requestUpdates(LocationManager.GPS_PROVIDER);
}
break;
}
}
private void requestUpdates(String provider){
if(this.locationManager.isProviderEnabled(provider)){
if(provider.contentEquals(LocationManager.NETWORK_PROVIDER)
&& Connectivity.isConnected(this.context)){
System.out.println("NETWORK CONNECTED, START LISTENING: "+provider);
this.locationManager.requestLocationUpdates(provider, TIME_INTERVAL, DISTANCE_INTERVAL, this);
}else if(provider.contentEquals(LocationManager.GPS_PROVIDER)
&& Connectivity.isConnectedMobile(this.context)){
System.out.println("MOBILE NETWORK CONNECTED, START LISTENING: "+provider);
this.locationManager.requestLocationUpdates(provider, TIME_INTERVAL, DISTANCE_INTERVAL, this);
}else{
System.out.println("PROPER NETWORK NOT CONNECTED : "+provider);
this.onProviderDisabled(provider);
}
}else{
this.onProviderDisabled(provider);
}
}
public void cancel(){
this.locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
System.out.println("LOCATION FOUND : "+location.getLatitude()+", "+location.getLongitude()+(location.hasAccuracy() ? " : +- "+location.getAccuracy()+" meters" : ""));
this.locationManager.removeUpdates(this);
this.callback.onLocationFound(location);
}
@Override
public void onProviderDisabled(String provider) {
System.out.println("PROVIDER DISABLED : "+provider);
if( this.method == Locator.Method.NETWORK_THEN_GPS
&& provider.contentEquals(LocationManager.NETWORK_PROVIDER) ){
// Network provider disabled, try GPS
System.out.println("REQUEST UPDATES to GSP PROVIDER, NETWORK PROVIDER DISABLED");
this.requestUpdates(LocationManager.GPS_PROVIDER);
}else{
this.locationManager.removeUpdates(this);
this.callback.onLocationNotFound();
}
}
@Override
public void onProviderEnabled(String provider) {
// empty
System.out.println("PROVIDER ENABLED : "+provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// empty
System.out.println("PROVIDER STATUS CHANGED : "+provider+" : STATUS : "+status);
}
public interface Listener {
void onLocationFound(Location location);
void onLocationNotFound();
}
}
位置情報プロバイダーを使用するには、適切なアクセス許可を追加してください。AndroidManifest.xml
次に、 GoogleマップなどのAPIを使用して都市名に変換します。