1

多くの既存の例が正しく機能しないため、この領域のメソッドに対するいくつかの更新があったようです...

gps なしでネットワークから都市の名前を取得し、画面にトーストする方法を教えてもらえますか?

それは大歓迎です。

前もって感謝します。

4

2 に答える 2

0

これを行うには、ユーザーの IP アドレスを取得し、次のような無料の GeoLocation API サービスを使用します: http://freegeoip.net/static/index.html

これらのサービスはほとんどの場合 Wi-Fi で動作しますが、完全に信頼できるわけではありません。ユーザーがプロキシを使用している場合など、状況によっては、これらのサービスが誤った (または不正確な) 場所を提供することがあります。

3G では、これらのサービスは非常に不正確になる可能性があります。これはおそらく、電話に割り当てられた IP アドレスが、ネットワーク プロバイダーの中央ネットワークの場所に根ざしているためです。3G を使用している場合、都市について推測することには十分に注意してください。

于 2012-11-04T00:14:48.637 に答える
0

NETWORK_PROVIDERGPS を使用しない を使用して緯度と経度を取得します。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を使用して都市名に変換します。

于 2012-11-04T00:43:11.283 に答える