2017-04-06 7 views
2

알람을 설정 했으므로 활동을 열지 않고 알림 작업 버튼을 사용하여 알람을 비활성화하고 싶습니다.알림 작업 버튼 알람 벨소리를 중지하지 않습니다.

아래에 전체 코드를 첨부했습니다.

사용자가 알람을 설정할 때 브로드 캐스트 리시버를 호출하면 벨소리 서비스를 호출하여 벨소리를 시작합니다. 알림을 발령합니다. 해당 알림에는 비활성화 버튼이 있습니다. 나는 인터넷에서 찾은 모든 자원을 다했다. 그러나

비활성화 버튼을 켜면 알림이 작동하지 않습니다. 내 잘못이다

onToggled 버튼을 주요 활동에서 알람을 시작합니다

public void OnToggleClicked(View view) { 
    long time; 
    if (((ToggleButton) view).isChecked()) { 
     Toast.makeText(MainActivity.this, "ALARM ON", Toast.LENGTH_SHORT).show(); 
     Calendar calendar = Calendar.getInstance(); 


     if (Build.VERSION.SDK_INT >= 23) { 
      calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getHour()); 
      calendar.set(Calendar.MINUTE, alarmTimePicker.getMinute()); 
     } else { 
      calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getCurrentHour()); 
      calendar.set(Calendar.MINUTE, alarmTimePicker.getCurrentMinute()); 
     } 

     intent = new Intent(this, AlarmReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
     alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     // setRepeating() lets you specify a precise custom interval--in this case, 
     // 1 minutes. 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60, pendingIntent); 


    } else { 
     alarmManager.cancel(pendingIntent); 
     Toast.makeText(MainActivity.this, "ALARM OFF", Toast.LENGTH_SHORT).show(); 
    } 
} 

내 방송 수신기 클래스

public class AlarmReceiver extends BroadcastReceiver { 
public static Ringtone ringtone; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Toast.makeText(context, "Alarm! Wake up! Wake up!", Toast.LENGTH_LONG).show(); 


    // using service class 
    Intent i = new Intent(context, RingtonePlayingService.class); 
    context.startService(i); 

    createNotification(context); 
} 

public void createNotification(Context context) { 


    NotificationCompat.Builder builder = new NotificationCompat.Builder(context) 
      .setSmallIcon(android.R.drawable.ic_dialog_alert) 
      .setContentTitle("It is prayer time") 
      .setContentText("Prayer") 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setSubText("Tab to cancel the ringtone") 
      .setPriority(NotificationCompat.PRIORITY_HIGH); 


    //To add a dismiss button 
    Intent dismissIntent = new Intent(context, RingtonePlayingService.class); 
    dismissIntent.setAction(RingtonePlayingService.ACTION_DISMISS); 

    PendingIntent pendingIntent = PendingIntent.getService(context, 
      123, dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    NotificationCompat.Action action = new NotificationCompat.Action 
      (android.R.drawable.ic_lock_idle_alarm, "DISMISS", pendingIntent); 
    builder.addAction(action); 
    // end of setting action button to notification 


    Intent intent1 = new Intent(context, MainActivity.class); 
    PendingIntent pIntent = PendingIntent.getActivity(context, 123, intent1, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(pIntent); 


    NotificationManager notificationManager = (NotificationManager) 
      context.getSystemService(NOTIFICATION_SERVICE); 
    Notification notification = builder.build(); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notificationManager.notify(123, notification); 


} 

내 ringtoneplaying 서비스 클래스

public class RingtonePlayingService extends Service{ 
private static final String TAG = RingtonePlayingService.class.getSimpleName(); 
private static final String URI_BASE = RingtonePlayingService.class.getName() + "."; 
public static final String ACTION_DISMISS = URI_BASE + "ACTION_DISMISS"; 

private Ringtone ringtone; 

@Override 
public IBinder onBind(Intent intent) 
{ 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    Log.d(TAG, "onStartCommand"); 

    if(intent == null) { 
     Log.d(TAG, "The intent is null."); 
     return START_REDELIVER_INTENT; 
    } 

    Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
    if (alarmUri == null) { 
     alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    } 
    ringtone = RingtoneManager.getRingtone(this, alarmUri); 
    ringtone.play(); 


    String action = intent.getAction(); 

    if(ACTION_DISMISS.equals(action)) 
     dismissRingtone(); 


    return START_NOT_STICKY; 
} 

public void dismissRingtone() { 
    Intent i = new Intent(this, RingtonePlayingService.class); 
    stopService(i); 
} 

@Override 
public void onDestroy() { 
    ringtone.stop(); 
} 

답변

1

그건 내 잘못 이었어

알림을 사용 안함으로 설정하면 다시 수신자 클래스가 호출되므로 벨소리가 계속 재생됩니다. 그래서 나는 약간의 수정을 유지하고 잘 작동합니다.

public class RingtonePlayingService extends Service { 
private static final String TAG = RingtonePlayingService.class.getSimpleName(); 
private static final String URI_BASE = RingtonePlayingService.class.getName() + "."; 
public static final String ACTION_DISMISS = URI_BASE + "ACTION_DISMISS"; 


private Ringtone ringtone; 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.d(TAG, "onStartCommand"); 

    if (intent == null) { 
     Log.d(TAG, "The intent is null."); 
     return START_REDELIVER_INTENT; 
    } 

    String action = intent.getAction(); 

    if (ACTION_DISMISS.equals(action)) 
     dismissRingtone(); 
    else { 
     Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
     if (alarmUri == null) { 
      alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
     } 
     ringtone = RingtoneManager.getRingtone(this, alarmUri); 
     ringtone.play(); 
    } 

    return START_NOT_STICKY; 
} 

public void dismissRingtone() { 
    // stop the alarm rigntone 
    Intent i = new Intent(this, RingtonePlayingService.class); 
    stopService(i); 

    // also dismiss the alarm to ring again or trigger again 
    AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
    aManager.cancel(pendingIntent); 

    // Canceling the current notification 
    NotificationManager notificationManager = 
      (NotificationManager)getSystemService(getApplicationContext().NOTIFICATION_SERVICE); 
    notificationManager.cancel(321); 
} 

@Override 
public void onDestroy() { 
    ringtone.stop(); 
}}