2017-10-23 6 views
0

나는 Call Manager의 개발자이며 내 앱에 알림 알리미 기능을 구현하려고합니다. 사용자는 목록의 특정 사람에게 전화 할 수있는 알림을 설정할 수 있습니다. 처음에는이 기능을 구현할 때 알림이 예약없이 즉시 표시됩니다. 이는 밀리 초 단위의 부정확 한 값 설정 때문이었습니다. 그러나 이제는이를 수정 했으므로 AlarmManager에 알맞은 밀리 초 값이 있더라도 알림이 전혀 예약되지 않습니다.특정 날짜와 시간에 대한 알림 일정 설정

통지는 다음과 같습니다 일정에있어서

public void scheduleReminder(Notification notification, String date, String time){ 
     String[] dateArray = date.split("/"); 
     String[] timeArray = time.split(":|\\s+"); 
     Date currentDate = new Date(); 
     int notHour; 

     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(System.currentTimeMillis()); 
     cal.clear(); 
     if(timeArray[2].equals("PM")){ 
      notHour = Integer.parseInt(timeArray[0]); 
      notHour = notHour + 12; 
      cal.set(Calendar.YEAR, Integer.parseInt(dateArray[2])); 
      cal.set(Calendar.MONTH, Integer.parseInt(dateArray[0]) - 1); 
      cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[1])); 
      cal.set(Calendar.HOUR_OF_DAY, notHour); 
      cal.set(Calendar.MINUTE, Integer.parseInt(timeArray[1])); 
     } 
     else{ 
      cal.set(Calendar.YEAR, Integer.parseInt(dateArray[2])); 
      cal.set(Calendar.MONTH, Integer.parseInt(dateArray[0]) - 1); 
      cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dateArray[1])); 
      cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeArray[0])); 
      cal.set(Calendar.MINUTE, Integer.parseInt(timeArray[1])); 
     } 

     Date reminderDate = cal.getTime(); 
     long diffInMillis = reminderDate.getTime() - currentDate.getTime(); 

     Intent notificationIntent = new Intent(this, NotificationPublisher.class); 
     notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1); 
     notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + diffInMillis, pendingIntent); 
    } 
다음과 같이

내 방송 수신기 클래스는 다음과 같습니다

package groovinchip.com.callmanager; 

import android.app.Notification; 
import android.app.NotificationManager; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NotificationPublisher extends BroadcastReceiver { 

    public static String NOTIFICATION_ID = "notification-id"; 
    public static String NOTIFICATION = "notification"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 

     Notification notification = intent.getParcelableExtra(NOTIFICATION); 
     int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
     notificationManager.notify(id, notification); 
    } 
} 

을 다음과 같이 관련 안드로이드 매니페스트 선언은 다음과 같습니다

<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

<receiver android:name="groovinchip.com.callmanager.NotificationPublisher" 
    android:enabled="true"> 
</receiver> 

이것이 작동하지 않는 이유에 관해서 나는 혼란 스럽다. 결과는 그것을 알아 내려고 노력했다. 이 모든

에서 일하는 것이 있는지 확인하기 위해 대신 diffInMillis의 단 몇 초를 나타내는 정수 값을 전달 만 diffInMillis (4)를 통과 SystemClock.elapsedRealTime() + diffInMillies 3 전달 System.ELAPSED_REALTIME_WAKEUP 2)))와 AlarmManager 설정 1) : 나는 사이에 전환했습니다

누구든지이 문제를 해결할 수 있습니까? 정말 고맙습니다!

+0

신호로 살펴보기 – DroiDev

답변

0

알림을 만들 때 채널 ID를 설정하고 있습니까? API 26에서 테스트하는 경우 브로드 캐스트 수신기에 채널이 하나뿐 아니라 한 개가 없으면 경보가 꺼지지 않습니다.

나는 사용자가 선택한 시간 지정기와 알람에서 미리 알림을 만들고 설정하는 두 가지 방법이 있습니다. 여기에 대한 소스 코드는

내가 알림 알림을하고 난 당신과 비슷한 내 브로드 캐스트 리시버에 대한 별도의 클래스가이 광산은

public class NotificationPublisher extends BroadcastReceiver { 

private static final String TAG = "NotificationPublisher"; 
public static String NOTIFICATION_ID = "notification-id"; 
public static String NOTIFICATION = "notification"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    if (Build.VERSION.SDK_INT >= 26) { 
     NotificationChannel channel = new NotificationChannel("Reminders", "Reminders", NotificationManager.IMPORTANCE_DEFAULT); 
     notificationManager.createNotificationChannel(channel); 
    } 
    Notification notification = intent.getParcelableExtra(NOTIFICATION); 
    int id = intent.getIntExtra(NOTIFICATION_ID, 0); 
    Log.i(TAG, "notification sent"); 
    notificationManager.notify(id, notification); 
} 

}

을 보는 방법 내 응용 프로그램에서
private void createReminder(Notification notification) { 
    Intent notificationIntent = new Intent(this, NotificationPublisher.class); 
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, 1); 
    notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    long delay = alarmCalendar.getTimeInMillis() - Calendar.getInstance().getTimeInMillis(); 
    long futureInMillis = SystemClock.elapsedRealtime() + delay; 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, futureInMillis, pendingIntent); 
} 

private Notification getNotification() { 
    String channelId = "Reminders"; 
    PendingIntent newEntryActivityPendingIntent = PendingIntent.getActivity(this, 1, new Intent(this, NewEntryActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); 
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId) 
      .setContentTitle(getString(R.string.app_name)) 
      .setContentText(getString(R.string.reminder_content)) 
      .setTicker(getString(R.string.app_name)) 
      .setSmallIcon(R.drawable.notebook_notification_white) 
      .setDefaults(Notification.DEFAULT_SOUND) 
      .setAutoCancel(true) 
      .setContentIntent(newEntryActivityPendingIntent); 
    Log.i(TAG, "notification built"); 
    return builder.build(); 
} 

당신의 모습과 거의 비슷합니다.

이것은 잘 작동합니다. 다른 방법으로도 도와 줄 수 있으면 알려주세요.

+0

이것은 실제로 문제가되었습니다. 현재 내 Oreo 디바이스에서 작동하고 있지만, 내 디바이스 GroovinChip