17

これらの 2 つのジオフェンスがある場合、これらのジオフェンスを登録した後、これらの円の円周に出入りするときに通知を受け取る必要があります。ただし、共有エリアを移動している場合、つまりあるサークルから別のサークルに移動している場合、アプリに通知を送信させたくありません。

出来ますか?もしそうなら、どうやって?

2 つの円が交差しているマップのイメージ

4

3 に答える 3

1

これは別の方法かもしれません:

すべてのジオフェンスには ID があります。それらが一意である必要があるかどうかはわかりませんが、この議論では、一意でなければならないとしましょう。2 つのジオフェンスの例では、表示されている ID に "fenceHome-1" と "fenceHome-2" を使用し、表示されていない "someOther-1" と呼ばれる 3 番目の ID を使用します。

ここでできることは、ユーザーがいる現在のジオフェンスを格納する変数を作成することです。この例では、ジオフェンス ID を持つ文字列になります。呼びましょう

String currentGeofence = new String();

ユーザーが新しいジオフェンスに入ると、geofenceIds が同じかどうかを確認できるようになりました。

     /** 
        geofenceEntered  get from the Intent.  Should be "fenceHome-1" or "fenceHome-2" or "someOther=1" 
        */    
    public void enteredGeoFence(String geofenceEntered) {

        // strip off the "-1" or "-2"  
        geofenceEntered = geofenceEntered.stripOff(); 

        if (currentGoofence.equals(geofenceEntered) == false} {
           // user entered a new geofence  Ex: "SomeOther-1" to "fenceHome-1" 
           sendNotification(geofenceEntered, .....); 
           currentGeofence = geofencecEntered;
        } else {
           // user entered a geofence with in the same 'area'.  Ex:  "fenceHome-1" to "fenceHome-2" 
           // do nothing 
        }

    }

それが私がそれをする方法です。そのすべての数学をいじるのは難しすぎます。ジオフェンス ID に巧妙な命名規則を設定するだけです。 重要なのは、ジオフェンスの命名です

現実の世界では、ユーザーが複数のジオフェンスにいる可能性があり、geofenceExit() を currentGeofence から削除する必要があるため、currentGeofence は Collection である必要があります。

Android 通知マネージャーについて覚えておくべきもう 1 つの点は、同じ通知を 2 回送信すると、通知は 1 回だけ送信されることです。これはあなたの利点に使用できます。

于 2014-04-16T18:00:06.917 に答える
0

非常に概略的に:

boolean isTransition1, isTransition2, isTransition, insideCircle1, insideCircle2, insideUnion, insideUnionPrev;

if (isTransition1 | isTransition2) {
    insideCircle1 = (dist(currPosition, centerCircle1) < radius1);
    insideCircle2 = (dist(currPosition, centerCircle2) < radius2);
    insideUnionPrev = insideUnion;
    insideUnion = insideCircle1 | insideCircle;
    isTransition = (insideUnion != insideUnionPrev);
    if (isTransition & insideUnion) println("Moved into region");
    if (isTransition & !insideUnion) println("Moved out of region");
}
于 2014-04-10T21:42:00.703 に答える