到达目的地时如何设置闹钟?

时间:2016-05-26 11:52:55

标签: android alarmmanager android-alarms

我正在实施位置警报演示,当我到达目的地时,我成功收到通知。但是我想使用报警而不是简单的通知,我不知道报警服务,直到现在我还没有实现它。

以下是获取通知的代码:

public class AreWeThereIntentService extends IntentService {
    private final String TAG = AreWeThereIntentService.class.getName();
    private SharedPreferences prefs;
    private Gson gson;
    public AreWeThereIntentService() {
        super("AreWeThereIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        prefs = getApplicationContext().getSharedPreferences(
                Constants.SharedPrefs.Geofences, Context.MODE_PRIVATE);
        gson = new Gson();
        // 1. Get the event
        GeofencingEvent event = GeofencingEvent.fromIntent(intent);
        if (event != null) {
            if (event.hasError()) {
                onError(event.getErrorCode());
            } else {
                // 2. Get the transition type
                int transition = event.getGeofenceTransition();
                if (transition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                        transition == Geofence.GEOFENCE_TRANSITION_DWELL ||
                        transition == Geofence.GEOFENCE_TRANSITION_EXIT) {
                    List<String> geofenceIds = new ArrayList<>();
                    // 3. Accumulate a list of event geofences
                    for (Geofence geofence : event.getTriggeringGeofences()) {
                        geofenceIds.add(geofence.getRequestId());
                    }
                    if (transition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                            transition == Geofence.GEOFENCE_TRANSITION_DWELL) {
                        // 4. Pass the geofence list to the notification method
                        onEnteredGeofences(geofenceIds);
                    }
                }
            }
        }
    }

    private void onEnteredGeofences(List<String> geofenceIds) {

        // 1. Outer loop over all geofenceIds
        for (String geofenceId : geofenceIds) {
            String geofenceName = "";
            // 2, Loop over all geofence keys in prefs and retrieve NamedGeofence from SharedPreferences
            Map<String, ?> keys = prefs.getAll();
            for (Map.Entry<String, ?> entry : keys.entrySet()) {
                String jsonString = prefs.getString(entry.getKey(), null);
                NamedGeofence namedGeofence = gson.fromJson(jsonString, NamedGeofence.class);
                if (namedGeofence.id.equals(geofenceId)) {
                    geofenceName = namedGeofence.name;
                    break;
                }
            }
            // 3. Set the notification text and send the notification
            String contextText =
                    String.format(this.getResources().getString(R.string.Notification_Text), geofenceName);
            // 1. Create a NotificationManager
            NotificationManager notificationManager =
                    (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

            Intent intent = new Intent(this, MapsActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingNotificationIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

            Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            long[] pattern = {0, 100, 200, 300};
            // 3. Create and send a notification
            Notification notification = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.map_marker_icon)
                    .setContentTitle(this.getResources().getString(R.string.Notification_Title))
                    .setContentText(contextText)
                    .setContentIntent(pendingNotificationIntent)
                    .setStyle(new NotificationCompat.BigTextStyle().bigText(contextText))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setAutoCancel(true)
                    .setSound(alarmSound)
                    .setVibrate(pattern)
                    .build();

            notificationManager.notify(0, notification);
        }
    }

    private void onError(int i) {
        Log.e(TAG, "Geofencing Error: " + i);
    }
}

当我输入Geofence时,我想要的是闹铃而不是简单的通知。

2 个答案:

答案 0 :(得分:0)

如果我的问题是正确的...使用警报管理器进行警报并通过广播接收器发送通知......

  Intent myIntent = new Intent(this, AlarmReceiver.class);

                            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                           alarmManager.set(AlarmManager.RTC_WAKEUP, 1, pendingIntent);
                            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, randomValue, 0,pendingIntent);

并在AlarmReceiver中

public class Silent_notification_receiver extends BroadcastReceiver {

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

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

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                context).setSmallIcon(R.drawable.app_icon)
                .setAutoCancel(true).setContentTitle("Alert")
                .setContentText("You are in Silent Area");
        mBuilder.setAutoCancel(true);
        mNotificationManager.notify(0, mBuilder.build());
    }

答案 1 :(得分:0)

如果您想要闹钟或电话等行为,您几乎就在那里,您需要唤醒您的应用程序打开活动/片段/对话框并播放铃声。 https://developer.android.com/reference/android/media/RingtoneManager.html
https://developer.android.com/reference/android/media/Ringtone.html