3

ロケーション リスナーは正常に動作し、問題なくデータを収集します。ただし、データが収集されない場合もあります。この時点で、位置情報プロバイダーをオフにして再起動する必要があります。再起動すると問題は解決しますが、ユーザーが期待する最善の方法ではない可能性があります。

GPS をプロバイダーとして使用する場合は問題ありません。

ロケーションリスナーは Service で動作します。問題がわかりません。それはAndroidまたは私のコードに関するものですか?

前もって感謝します。

4

4 に答える 4

1

*GPS_PROVIDER* と *NETWORK_PROVIDER* の両方を使用しないのはなぜですか? 私はこれを試してみましたが、うまくいきました。

このエラーは、他のデバイスでもテストしているときに発生しますか、それともあなたのデバイスだけですか?

于 2013-06-18T13:53:43.103 に答える
1

20 秒後に GPS を検出できない場合は、GPS_PROVIDER と NETWORK_PROVIDER の両方を使用しました。NETWORK プロバイダーを使用しようとします。

///最初に MYlocation クラスを作成します

    public class MyLocation {
                Timer timer1;
                LocationManager lm;
                LocationResult locationResult;
                boolean gps_enabled=false;
                boolean network_enabled=false;

                public boolean getLocation(Context context, LocationResult result)
                {
                    //I use LocationResult callback class to pass location value from MyLocation to user code.
                    locationResult=result;
                    if(lm==null)
                        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

                    //exceptions will be thrown if provider is not permitted.
                    try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
                    try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}

                    //don't start listeners if no provider is enabled
                    if(!gps_enabled && !network_enabled)
                        return false;

                    if(gps_enabled)
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
                    if(network_enabled)
                        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
                    timer1=new Timer();
                    timer1.schedule(new GetLastLocation(), 20000);
                    return true;
                }

                LocationListener locationListenerGps = new LocationListener() {
                    public void onLocationChanged(Location location) {
                        timer1.cancel();
                        locationResult.gotLocation(location);
                        lm.removeUpdates(this);
                        lm.removeUpdates(locationListenerNetwork);
                    }
                    public void onProviderDisabled(String provider) {}
                    public void onProviderEnabled(String provider) {}
                    public void onStatusChanged(String provider, int status, Bundle extras) {}
                };

                LocationListener locationListenerNetwork = new LocationListener() {
                    public void onLocationChanged(Location location) {
                        timer1.cancel();
                        locationResult.gotLocation(location);
                        lm.removeUpdates(this);
                        lm.removeUpdates(locationListenerGps);
                    }
                    public void onProviderDisabled(String provider) {}
                    public void onProviderEnabled(String provider) {}
                    public void onStatusChanged(String provider, int status, Bundle extras) {}
                };

                class GetLastLocation extends TimerTask {
                    @Override
                    public void run() {
                         lm.removeUpdates(locationListenerGps);
                         lm.removeUpdates(locationListenerNetwork);

                         Location net_loc=null, gps_loc=null;
                         if(gps_enabled)
                             gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                         if(network_enabled)
                             net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                         //if there are both values use the latest one
                         if(gps_loc!=null && net_loc!=null){
                             if(gps_loc.getTime()>net_loc.getTime())
                                 locationResult.gotLocation(gps_loc);
                             else
                                 locationResult.gotLocation(net_loc);
                             return;
                         }

                         if(gps_loc!=null){
                             locationResult.gotLocation(gps_loc);
                             return;
                         }
                         if(net_loc!=null){
                             locationResult.gotLocation(net_loc);
                             return;
                         }
                         locationResult.gotLocation(null);
                    }
                }
                public void cancelTimer()
                { timer1.cancel(); 
                  lm.removeUpdates(locationListenerGps);
                  lm.removeUpdates(locationListenerNetwork);
                }
                public static abstract class LocationResult{
                    public abstract void gotLocation(Location location);
                }

        }

/メインクラスでは、このように使用できます。これは、webview に暗示されます

   public class Main extends Activity {

     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        mWebView=(WebView)findViewById(R.id.webview);


                final String string_loc = getIntent().getExtras().getString("nearest");
                LocationResult locationResult = new LocationResult(){

                    @Override
                    public void gotLocation(Location location) {

                        passLat=Double.toString(location.getLatitude());
                        passLong=Double.toString(location.getLongitude());
                        maps="http://maps.google.com/maps?q="+string_loc+"+loc:"+passLat+","+passLong+"&hq=hospital&t=m&z=12";
                        mWebView.loadUrl(maps);
                    }
                };
                  myLocation.getLocation(this, locationResult);  
        }

  }
}

//これがお役に立てば幸いです

于 2013-07-31T01:39:57.023 に答える
0

ネットワーク プロバイダーを使用するには、インターネット接続が必要です。セルと Wi-Fi ホットスポットからいくつかの情報を収集します。次に、データベースを検索しておおよその場所を提供するバックエンド サーバーにクエリを実行します。デバイスは位置情報をプリフェッチできるため、常時インターネットに接続する必要はありませんが、デバイスがプリフェッチ場所から移動すると、再度インターネット接続が必要になります。

これは、インターネット接続が失われ (wifi がスリープ状態になる)、プロバイダーを再起動するとインターネットに再接続されるという問題である可能性があります。繰り返しますが、これはせいぜい私の側の推測です:)

于 2013-07-31T10:20:23.697 に答える