3

テスターの電話の 1 つでユーザーの位置情報を取得する際に問題が発生しています。私にとってはいつもうまくいくので、違いが何であるかわかりません。

シーケンスは次のとおりです。

1: 電話を再起動します。2. 位置情報サービスが有効になっていることを確認します (GPS とネットワークの両方)。3. アプリを起動します。

OS が有効な場所を提供することはありません。getLastKnownLocation() は GPS_PROVIDER と NETWORK_PROVIDER の両方に対して常に null を返し、LocationListener は LocatioUpdates を要求した後に呼び出されることはありません。

  1. 次に、彼は Google マップ アプリを実行します (これは彼の位置を特定しているようです)。
  2. 次に、彼が私のアプリを再度実行すると、場所が正しく取得されます。

私のコードの基本は次のとおりです。

    LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE );
    LocationListener locationListener = new LocationListener()
    {

        public void onLocationChanged( Location location )
        {
            useLocation( location );
        }

        public void onStatusChanged( String provider, int status, Bundle extras )
        {
        }

        public void onProviderEnabled( String provider )
        {
        }

        public void onProviderDisabled( String provider )
        {
        }
    };

    // Register the listener with the Location Manager to receive location updates
    // Checks a minimum of every 120 seconds.  Location must change by 10000 meters 
    String provider = locationManager.getBestProvider( new Criteria(), true );
    if ( provider != null )
    {
        System.out.println( "Using provider: " + provider );
        locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );
    }

    // Get the last know location for immediate use
    Location lastLocation = locationManager.getLastKnownLocation( LocationManager.GPS_PROVIDER );
    if ( lastLocation != null )
        useLocation( lastLocation );
    else
        useLocation( locationManager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER ) );

失敗すると、コードは最良のプロバイダーが「ネットワーク」であることを示しているので、それを使用します。しかし、onLocationChanged が呼び出されることはありません。また、getLastKnowLocation() から null 以外の値を取得することもありません。

再起動後にこれを一貫して機能させるために必要な魔法はありますか?

4

5 に答える 5

1

より良い解決策は、最適なプロバイダーを一度取得しようとするのではなく (GPS またはネットワークであると確信できない場合)、GPS プロバイダーとネットワーク プロバイダーの両方に耳を傾け、精度とプロバイダーから判断して使用する場所を決定することです。

locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, PERIOD_UPDATE_GPS*1000, DISTANCE_UPDATE_GPS, this);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, PERIOD_UPDATE_NETWORK*1000, DISTANCE_UPDATE_NETWORK, this);

onLocationChange

@Override
public void onLocationChanged(Location locationNew) {
    // for example, check if location was provided by GPS
    if (locationNew.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                // do your work here
    }
}
于 2014-03-25T17:54:13.603 に答える
1

これはサービスで作成したと思います。その場合は、Boot イベントをリッスンする BroadCastReciever を使用してみてください。たとえば

<receiver android:name="com.singulera.familysiren.receiver.BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED">
        </action>
        <category android:name="android.intent.category.HOME">
        </category>
    </intent-filter>
</receiver>

次に、BootReceiver ファイルでサービスを呼び出します。

于 2011-11-24T15:10:58.523 に答える
0

GPS と Ntwork の両方の使用を開始すると、GPS_PROVIDER を使用する Samsung Galaxy 3 と Nexus デバイスで同じ問題が発生しました。最初に返された場所を取得し、ユーザーに表示します。1つ、指定された距離は300メートル、時間間隔は10秒です

于 2012-12-18T22:26:41.520 に答える
0

このコードを変更してみてください

locationManager.requestLocationUpdates( provider, 120 * 1000, 10000, locationListener );

 locationManager.requestLocationUpdates( provider, 120 * 1000, 0, locationListener ); 

それはあなたが1000メートル以内にいるからかもしれません

于 2011-03-21T14:58:28.150 に答える
0

私自身もまったく同じ問題を抱えていました。マニフェストにアクセス許可ACCESS_COARSE_LOCATIONと場所/許可を追加するのを忘れていました。ACCESS_FINE_LOCATION

それらを追加して再構築した後、期待どおりに機能し始めました。

于 2014-03-26T10:52:01.970 に答える