3

ここに投稿されているように、Geofence ガイドで提供されているサンプル コードを明確にする必要があります。

https://developer.android.com/training/location/geofencing.html

コードを実行したところ、ジオフェンスが正しく作成されていることがわかりましたが、本当に必要なのは、ジオフェンスされた場所に車で行ったときにアラートを受け取る方法です。現在、これらのジオフェンスされたスポットを通り過ぎると、何も起こりません (ReceiveTransitionsIntentService は呼び出されません)、通知も何もありません。

また、定期的な位置情報の更新をリッスンし、緯度/経度を上記のコードに手動で渡して現在の位置を示す必要がありますか? LocationClient にジオフェンスを追加すると、これは自動的に行われるはずだと思いましたが、他にもあると思います。

LocationRequest を LocationClient インスタンスに登録しようとしましたが、まだアラートはありません:

mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);

mLocationClient.requestLocationUpdates(mLocationRequest, (LocationListener)mActivity);

Geofence api を位置追跡とどのように統合しますか?

4

7 に答える 7

1

@andrewmolo試したときに同じ問題が発生しました。プロジェクトの適切なビルド パスとライブラリを設定する必要があります。次のようにセットアップするとうまくいきました。

  1. プロジェクトの [プロパティ] > [Android] > [Google API] を選択します。
  2. プロパティ > Java ビルド パス > ライブラリ。

あなたが持っていることを確認してください

     1. android-support-v4.jar
     2. Google APIs
     3. google-play-services_lib.jar
     4. google-play-services.jar

また、順番にエクスポートするには、Google API を最下部に配置し、他のすべてを選択する必要があります。

于 2013-09-05T04:44:00.163 に答える
1

簡単な注意事項: 適切なトランジションが選択されていることを確認してください。入口遷移と出口遷移の両方を設定したい場合があります。

ジオフェンシングのコード スニペットは通知を表示しません。それは意図的なものです。通知は、遷移に対する最適な応答であるとは限りません。サンプルアプリケーションは通知を表示します。これは、サンプルをダウンロードすると表示されます。

位置情報サービスは、ユーザーの位置を特定するために最善を尽くします。

また、ACCESS_FINE_LOCATION をリクエストする必要があることにも注意してください。

バックグラウンドの「プロセス」では、ジオフェンス追跡 (または場所に関連するその他のもの) に関する特定のものは見つかりません。すべて Google Play サービス内にあります。

于 2013-05-28T23:32:31.357 に答える
1

サンプルコードにも問題がありました。これが私のために働いたものです。

            latitude = sharedPreferences.getFloat("storeAddress_lat", -1);
            longitude = sharedPreferences.getFloat("storeAddress_lng", -1);

            final ArrayList<Geofence> list = new ArrayList<Geofence>();

            Builder builder = new Geofence.Builder();
            builder.setRequestId("near_store_geofence");
            builder.setCircularRegion(latitude, longitude, 50);
            builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER);
            builder.setExpirationDuration(Geofence.NEVER_EXPIRE);
            list.add(builder.build());

            builder = new Geofence.Builder();
            builder.setRequestId("leave_store_geofence");
            builder.setCircularRegion(latitude, longitude, 50);
            builder.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_EXIT);
            builder.setExpirationDuration(Geofence.NEVER_EXPIRE);
            list.add(builder.build());


            final GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks = new GooglePlayServicesClient.ConnectionCallbacks(){

                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.i("GEOFENCE","onConnected");


                    // Create an explicit Intent
                    Intent intent = new Intent(getBaseContext(),  ReceiveTransitionsIntentService.class);
                    /*
                     * Return the PendingIntent
                     */
                    PendingIntent pendingIntent =  PendingIntent.getService(
                            getBaseContext(),
                            0,
                            intent,
                            PendingIntent.FLAG_UPDATE_CURRENT);

                    locationClient.addGeofences(list,pendingIntent, new OnAddGeofencesResultListener(){public void onAddGeofencesResult(int statusCode, String[] geofenceRequestIds) {
                        Log.i("GEOFENCE","onAddGeofencesResult");
                    }});

                    LocationRequest locationrequest = LocationRequest.create();
                    locationrequest.setPriority(locationrequest.PRIORITY_HIGH_ACCURACY);
                    locationrequest.setInterval(5000);

                    locationClient.requestLocationUpdates(locationrequest, new LocationListener(){

                        @Override
                        public void onLocationChanged(Location location) {
                            // TODO Auto-generated method stub

                        }});


                }

                @Override
                public void onDisconnected() {
                    Log.i("GEOFENCE","onDisconnected");                     
                }
            };
            GooglePlayServicesClient.OnConnectionFailedListener onConnectionFailedListener = new GooglePlayServicesClient.OnConnectionFailedListener(){

                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.i("GEOFENCE","onConnectionFailed");

                }
            };
            locationClient = new LocationClient(getBaseContext(), connectionCallbacks, onConnectionFailedListener);

            locationClient.connect();
于 2013-10-17T18:39:09.890 に答える
1

GPS はジオフェンシング API によって有効になることはありません (これはひどいことです。応答性の高いジオフェンスが必要であり、電力消費は気にしません)。これは、ドキュメントのどこにも記載されていません。また、GPS がなければ、wifi/セルの精度が不足するため、ジオフェンスを小さくすることは期待できません。

null ハンドラーに提供された価値のある場所がジオフェンシング API にも提供され、ジオフェンスを確実にトリガーできるように、null ハンドラーを使用して GPS を個別にポーリングする必要があります。

于 2014-03-19T18:00:03.897 に答える
0

この例には、意図した 12 時間ではなく 12 分後にフェンスが期限切れになるエラーが含まれていることに注意してください... 変更を修正するには

private static final long SECONDS_PER_HOUR = 60;

private static final long SECONDS_PER_HOUR = 60*60;

MainActivity で

于 2013-06-27T08:48:00.097 に答える