2

バックグラウンド サービスから正確な位置情報を取得するために、数週間にわたって Android SDK を試してきました。

いくつかの構成を試した後、現在これをループしています。

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(true);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
bestProvider = locationManager.getBestProvider(criteria, true);
lastKnownLocation = locationManager.getLastKnownLocation(bestProvider);

そして、私は時々lastKnownLocation位置の更新をチェックします。最新情報を聞くことができるのはわかっていますが、現時点ではあまり気にしていません。私が懸念しているのは、(私が思うに) 携帯電話で可能な限り GPS を使用するように求めていることです - 場所を特定する他の方法ではなく - それでもかなり離れた場所から緯度/経度を返しますが、マップ アプリケーションを開くと、数メートル以内に表示されます。

ここで私が間違っている場所を誰かが提案できますか?

4

2 に答える 2

2

基準を設定することは、それらに応じて使用するのに最適なプロバイダーを確立するだけなので、場所の正確さや有効性について実際に発言することはありません. すぐにプロバイダーを GPS に設定しました (GPS が利用できる場合!)。

また、時間と距離に基づいて更新する前に待機する時間に関する要件を与えているようにも見えません。これは、インテントとブロードキャスト レシーバーを使用して行うことの例です。それはあなたを助けるかもしれません。

public void beginMonitoringLocation(int minDistance) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(MainActivity.LOCATION_UPDATE_ACTION);
            this.mContext.registerReceiver(this.locationReceiver, filter);

            LocationManager mLocationManager = (LocationManager) this.mContext.getSystemService(Context.LOCATION_SERVICE);
            mLocationManager.addGpsStatusListener(this);
            boolean enabled =  mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            if (!enabled) {
                Log.e("LocationManager", "GPS not enabled!!!!");
            } 

            LocationProvider provider = mLocationManager.getProvider(LocationManager.GPS_PROVIDER); // GET THE BEST PROVIDER FOR OUR LOCATION
            Log.d("LocationManager:","Location Provider:"+provider);
            if ( provider == null ) {
                Log.e( "LocationManager", "No location provider found!" );
                return;
            }

            final int locationUpdateRC=0;

            int flags = 0;

            Intent intent = new Intent(MainActivity.LOCATION_UPDATE_ACTION); 
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this.mContext, locationUpdateRC, intent, flags); 
            // PENDING INTENT TO BE FIRED WHEN THE LOCATIONMANAGER RECEIVES LOCATION UPDATE.
            // THIS PENDING INTENT IS CAUGHT BY OUR BROADCAST RECEIVER
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,minDistance,pendingIntent);
            this._monitoringLocation = true;
    }

そして、同じクラスで私は自分のbroadcast receiver

public BroadcastReceiver locationReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            Location location = (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
        if (location != null) {
            //Do something with it  
        }
        }
    };

インテント フィルターのアクションは、アクティビティ内の定数セットへの単なる静的参照です。

public static final String LOCATION_UPDATE_ACTION = "com.corecoders.sqlmaptrack.LOCATION_UPDATE_RECEIVED";

これは私の場合、正確な場所を提供するのに役立ちました。必要に応じて距離を 0 に設定すると、4 つ以上の衛星の適切な修正があれば、毎秒 5 の精度で位置修正が得られます。

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

于 2012-10-16T09:16:45.110 に答える
1

以下のコードを使用して正確な位置を取得しました。以下のコードを使用すると、プログラムで GPS の有効化/無効化を処理できます。

private void enableGPSTracking() {

            new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    toggleGPS(true, getApplicationContext());

                    provider = LocationManager.GPS_PROVIDER;
                    Criteria locationCritera = new Criteria();
                    locationCritera.setAccuracy(Criteria.ACCURACY_FINE);
                    locationCritera.setAltitudeRequired(false);
                    locationCritera.setBearingRequired(false);
                    locationCritera.setCostAllowed(true);                   locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT);
                    provider = locationManager.getBestProvider(locationCritera,
                            true);

                    Intent intent = new Intent(
                            "com.example.gps.LOCATION_READY");
                    pendingIntent = PendingIntent.getBroadcast(
                            getApplicationContext(), 0, intent,
                            PendingIntent.FLAG_CANCEL_CURRENT);
                    // Register for broadcast intents
                    locationManager.requestLocationUpdates(provider, 0, 0,
                            pendingIntent);
                } catch (Exception e) {

                }

            }
        }.start();

    }

public static void toggleGPS(boolean flag, Context context) {

        try {
            Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
            intent.putExtra("enabled", flag);
            context.sendBroadcast(intent);
        } catch (Exception e) {

        }
    }

GPS を無効にするには、ToggleGPS() メソッドのフラグ値に false を渡すだけです。これがお役に立てば幸いです。

于 2012-10-16T09:51:20.457 に答える