Geofencingのチュートリアルを完了しましたが、疑問があります。
ジオフェンシングでは、ユーザーの位置を継続的に監視する必要がありますか?
または、ジオフェンスを追加したLocationClientは、遷移が発生したときに自動的にトリガーされますか?
これは当然の質問のように思えるかもしれませんが、このチュートリアルでは、ロケーション マネージャーにロケーションの更新を要求することについては何も言及していません。
Geofencingのチュートリアルを完了しましたが、疑問があります。
ジオフェンシングでは、ユーザーの位置を継続的に監視する必要がありますか?
または、ジオフェンスを追加したLocationClientは、遷移が発生したときに自動的にトリガーされますか?
これは当然の質問のように思えるかもしれませんが、このチュートリアルでは、ロケーション マネージャーにロケーションの更新を要求することについては何も言及していません。
こんにちは、要件によって異なります。アプリケーションでの位置追跡は、特定の要件に応じて次の方法で実装できます。 1. 必要に応じてデバイスのワンショット位置を 要求する アプリが画面上のデバイスの現在位置を要求する場合、一部の API は入力として緯度経度を必要とするか、緯度経度をネイティブに使用して画面の現在位置、マップ画面などに関する情報を表示する必要があると言います。 、アプリは同じアクティビティ クラスでデバイスの現在の場所を取得するために場所マネージャーを要求できます。このアプローチは、継続的な追跡を使用しないことで、アプリが使用するバッテリーを節約します。特定の画面または少数の画面で位置情報が必要な場合に最適ですが、正確な位置情報が得られない場合があります
2. 継続的な位置追跡のためのタイマー/サービス ベースのアプローチ アプリがバックグラウンドだけでなくフォアグラウンドでも継続的な位置追跡を要求する場合、タイムリーな間隔で位置を追跡する独自のサービスを作成できます。このような実装では、サービスはある間隔で位置情報の更新をリッスンし始め、しばらくの間すべての更新をオフにします。
位置追跡に独自のサービスを使用すると、バックグラウンドでも位置を追跡できます。タイマー間隔が適切に決定されれば、所望の精度を満たすことができる。継続的な位置追跡のためのジオフェンスベースのアプローチ
3. 継続的な位置追跡のためのジオ フェンス ベースのアプローチ Google Play Services では、ジオ フェンスと呼ばれる特定の半径の地理位置エリアを簡単に監視できるようになりました。継続的な位置追跡のために独自のサービスを作成する必要はありません。タイマー/サービスベースのアプローチと比較して、バッテリーの最適化が向上します。このアプローチは、アプリが最新の位置情報の追跡を要求する場合には適していません
詳細については、 http://mobisoftinfotech.com/3-ways-to-implement-effective-location-tracking-in-android-applications/をご覧ください。
ジオフェンシングでは、ユーザーの位置を継続的に監視する必要がありますか? -いいえ、場所を監視する必要はありません。
要件だけは
または、ジオフェンスを追加した LocationClient は、遷移が発生したときに自動的にトリガーされますか? -はい自動的にトリガー されます。正しい有効期限タイムスタンプを設定し、ロケーション アダプタがオンになっていることを確認してください。アプリは現在地を知る必要はありません
[オプション]
また、正しいジオフェンスエラーをキャッチして、ジオフェンスがトリガーされなかった理由を知ることができます。
GEOFENCE_NOT_AVAILABLE ジオフェンス サービスは現在利用できません。通常、これは、ユーザーが [設定] > [位置情報へのアクセス] で位置情報へのアクセスをオフにしたことが原因です。
定数値:1000
GEOFENCE_TOO_MANY_GEOFENCES アプリは 100 を超えるジオフェンスを登録しています。新しいジオフェンスを追加する前に、未使用のものを削除してください。
定数値:1001
GEOFENCE_TOO_MANY_PENDING_INTENTS addGeofences(GoogleApiClient, GeofencingRequest, PendingIntent) 呼び出しに 5 つ以上の異なる PendingIntent を指定しました。
定数値:1002
public class MainActivity extends FragmentActivity implements
OnMarkerDragListener {
private GoogleMap googleMap;
private int distance;
private SupportMapFragment mapFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map));
googleMap = mapFragment.getMap();
googleMap.setOnMarkerDragListener(this);
distance = 100;
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(
26.788707, 75.828108), 15));
createGeofence(26.788707, 75.828108, distance, "CIRCLE", "GEOFENCE");
}
private void createGeofence(double latitude, double longitude, int radius,
String geofenceType, String title) {
Marker stopMarker = googleMap.addMarker(new MarkerOptions()
.draggable(true)
.position(new LatLng(latitude, longitude))
.title(title)
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.stop_marker)));
googleMap.addCircle(new CircleOptions()
.center(new LatLng(latitude, longitude)).radius(radius)
.fillColor(Color.parseColor("#B2A9F6")));
}
@Override
public void onMarkerDrag(Marker marker) {
}
@Override
public void onMarkerDragEnd(Marker marker) {
LatLng dragPosition = marker.getPosition();
double dragLat = dragPosition.latitude;
double dragLong = dragPosition.longitude;
googleMap.clear();
createGeofence(dragLat, dragLong, distance, "CIRCLE", "GEOFENCE");
Toast.makeText(
MainActivity.this,
"onMarkerDragEnd dragLat :" + dragLat + " dragLong :"
+ dragLong, Toast.LENGTH_SHORT).show();
Log.i("info", "on drag end :" + dragLat + " dragLong :" + dragLong);
}
@Override
public void onMarkerDragStart(Marker marker) {
}
main .xml
< ?xml version="1.0" encoding="utf-8"?>
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
< fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
< /RelativeLayout>