2017-04-06 88 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(); 
}}