8

複数の近接アラートを作成しようとしていますが、機能しません...

ブロードキャスト レシーバーが上書きされ、最後のブロードキャストのみを処理していると思います。したがって、意図が最後に作成されたものだけに近い2つのポイントがある場合、アラートが生成されます...

リクエストコードを使用する必要があると読みましたが、その方法がわかりません...


保留中のインテントとブロードキャスト レシーバーをセットアップするための私の方法...

private void addProximityAlert(double latitude, double longitude, String poiName, String intentfilter) {

    Bundle extras = new Bundle();
    extras.putString("name", poiName);
    Intent intent = new Intent(PROX_ALERT_INTENT+poiName);  
    intent.putExtras(extras);       
    PendingIntent proximityIntent = PendingIntent.getBroadcast(MainMenu.this, requestCode, intent, 0);
    locationManager.addProximityAlert(
        latitude, // the latitude of the central point of the alert region
        longitude, // the longitude of the central point of the alert region
        POINT_RADIUS, // the radius of the central point of the alert region, in meters
        PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration 
        proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
   );
    requestCode++;
   IntentFilter filter = new IntentFilter(intentfilter); 
   registerReceiver(new ProximityIntentReceiver(), filter);
}

私のブロードキャストレシーバークラス

public class ProximityIntentReceiver extends BroadcastReceiver {

private static final int NOTIFICATION_ID = 1000;

@Override
public void onReceive(Context context, Intent intent) {

    String key = LocationManager.KEY_PROXIMITY_ENTERING;

    Boolean entering = intent.getBooleanExtra(key, false);

    if (entering) {
        Log.d(getClass().getSimpleName(), "entering");
    }
    else {
        Log.d(getClass().getSimpleName(), "exiting");
    }

    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);        

    Notification notification = createNotification();        
    notification.setLatestEventInfo(context, 
        "Proximity Alert!", "You are approaching: " +intent.getExtras().get("name"), pendingIntent);     
                                                                        //here-------------------------------------
    notificationManager.notify(NOTIFICATION_ID, notification);

}

private Notification createNotification() {
    Notification notification = new Notification();

    notification.icon = R.drawable.androidmarker;
    notification.when = System.currentTimeMillis();

    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.flags |= Notification.FLAG_SHOW_LIGHTS;        
    notification.flags |= Notification.FLAG_INSISTENT;

    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notification.defaults |= Notification.DEFAULT_LIGHTS;
    notification.defaults |= Notification.DEFAULT_SOUND;

    notification.ledARGB = Color.WHITE;
    notification.ledOnMS = 300;
    notification.ledOffMS = 1500;

    return notification;
}

}

手伝ってくれませんか???私は本当にこれで立ち往生しています...

どんな助けでも本当に感謝します!!!

4

1 に答える 1

9

私は結局それを働かせました...

まさに私が探していたもの: http://www.gauntface.co.uk/blog/2010/01/04/proximity-alerts-in-android/

私が行った変更


private void addProximityAlert(double latitude, double longitude, String poiName) {

    Bundle extras = new Bundle();
    extras.putString("name", poiName);
    extras.putInt("id", requestCode);
    Intent intent = new Intent(PROX_ALERT_INTENT);
    intent.putExtra(PROX_ALERT_INTENT, extras);
    PendingIntent proximityIntent = PendingIntent.getBroadcast(MainMenu.this, requestCode , intent, PendingIntent.FLAG_CANCEL_CURRENT);
    locationManager.addProximityAlert(
        latitude, // the latitude of the central point of the alert region
        longitude, // the longitude of the central point of the alert region
        POINT_RADIUS, // the radius of the central point of the alert region, in meters
        PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration 
        proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
   );
    requestCode++;       
}

private void initializeReceiver()
{
    IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT); 
    registerReceiver(new ProximityIntentReceiver(), filter);
}

package michaels.pack;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.location.LocationManager;
import android.util.Log;

public class ProximityIntentReceiver extends BroadcastReceiver {

private static final int NOTIFICATION_ID = 1000;

@Override
public void onReceive(Context context, Intent intent) {

    String key = LocationManager.KEY_PROXIMITY_ENTERING;

    Boolean entering = intent.getBooleanExtra(key, false);

    if (entering) {
        Log.d(getClass().getSimpleName(), "entering receiverrrrrrrrrrrrrrrrrr");
    }
    else {
        Log.d(getClass().getSimpleName(), "exiting");
    }

    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);        

    Notification notification = createNotification();        
    notification.setLatestEventInfo(context, 
        "Proximity Alert!", "You are approaching: " +intent.getBundleExtra("michaels.pack.ProximityAlert.").get("name"), pendingIntent);     
                                                                        //here-------------------------------------
    notificationManager.notify( intent.getBundleExtra("michaels.pack.ProximityAlert.").getInt("id"), notification);

}

private Notification createNotification() {
    Notification notification = new Notification();

    notification.icon = R.drawable.androidmarker;
    notification.when = System.currentTimeMillis();

    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.flags |= Notification.FLAG_SHOW_LIGHTS;                

    notification.defaults |= Notification.DEFAULT_VIBRATE;
    notification.defaults |= Notification.DEFAULT_LIGHTS;
    notification.defaults |= Notification.DEFAULT_SOUND;

    notification.ledARGB = Color.WHITE;
    notification.ledOnMS = 300;
    notification.ledOffMS = 1500;

    return notification;
}

}
于 2011-02-10T00:33:58.703 に答える