I am working on task in which I want to set Ringer Mode to vibrate for X time and bring back ringer mode to normal after X time. Alarm Manager works fine but after reboot it doesn't start alarm on time its start before time and also the alarm to bring phone back to normal doesn't even trigger. I tried the following way but its not working.
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.edu.pk.gulehri.dummyapp">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.DummyApp">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name="com.edu.pk.gulehri.dummyapp.Receiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
MainActivity.java
public class MainActivity extends AppCompatActivity implements
TimePickerDialog.OnTimeSetListener {
private SharedPreferences sp;
private SharedPreferences.Editor editor;
private TextView textView;
private Button button;
private int hA, mA;
private TimePickerFragment picker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.fajar);
button = findViewById(R.id.button_cancel);
textView.setOnClickListener(v -> {
picker = new TimePickerFragment();
picker.show(getSupportFragmentManager(), "time picker");
});
button.setOnClickListener(v -> {
AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, Receiver.class);
PendingIntent pendingIntentA = PendingIntent.getBroadcast(this, 321, intent, 0);
PendingIntent pendingIntentB = PendingIntent.getBroadcast(this, 322, intent, 0);
alarmManager.cancel(pendingIntentA);
alarmManager.cancel(pendingIntentB);
sp = getSharedPreferences("Shared", MODE_PRIVATE);
textView.setText("Set Time");
Toast.makeText(this, "Alarm Cancel", Toast.LENGTH_SHORT).show();
});
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
hA = hourOfDay;
mA = minute;
sp = getSharedPreferences("Shared", MODE_PRIVATE);
editor = sp.edit();
editor.putInt("Hour", hA);
editor.putInt("Minute", mA);
editor.commit();
startAlarmToSilent();
}
private void startAlarmToSilent() {
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hA);
c.set(Calendar.MINUTE, mA);
c.set(Calendar.SECOND, 0);
textView.setText(DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime()));
sp = getSharedPreferences("Shared", MODE_PRIVATE);
editor = sp.edit();
editor.putString("Time", textView.getText().toString());
editor.apply();
editor.commit();
AlarmManager mgrAlarmA = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, Receiver.class);
PendingIntent pendingIntentA = PendingIntent.getBroadcast(this, 321, intent, 0);
PendingIntent pendingIntentB = PendingIntent.getBroadcast(this, 322, intent, 0);
if (c.before(Calendar.getInstance())) {
c.add(Calendar.DAY_OF_MONTH, 1);
}
long delay = 24 * 60 * 60 * 1000;
mgrAlarmA.setRepeating(RTC_WAKEUP, c.getTimeInMillis(), delay, pendingIntentA);
mgrAlarmA.setRepeating(RTC_WAKEUP, c.getTimeInMillis() + 180000, delay, pendingIntentB);
}
@Override
protected void onResume() {
super.onResume();
sp = getSharedPreferences("Shared", MODE_PRIVATE);
textView.setText("Time:" + sp.getString("Time", null));
}
Receiver.java
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
getPrefs(context);
}
setRinger(context);
}
private void setRinger(Context context) {
AudioManager audio = (AudioManager) context.getSystemService(AUDIO_SERVICE);
if (audio.getRingerMode() == RINGER_MODE_NORMAL) {
audio.setRingerMode(RINGER_MODE_VIBRATE);
} else if (audio.getRingerMode() == RINGER_MODE_VIBRATE) {
audio.setRingerMode(RINGER_MODE_NORMAL);
}
}
private void setAlarm(Context context, int hour, int minute) {
long delay = 24 * 60 * 60 * 1000;
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
AlarmManager manager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
Intent intentAlarm = new Intent(context, BroadcastReceiver.class);
PendingIntent piA = PendingIntent.getBroadcast(context, 1034, intentAlarm, 0);
PendingIntent piB = PendingIntent.getBroadcast(context, 1035, intentAlarm, 0);
if (c.before(Calendar.getInstance())) {
c.add(Calendar.DAY_OF_MONTH, 1);
}
manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), delay, piA);
manager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), delay, piB);
}
private void getPrefs(Context context) {
SharedPreferences sp = context.getSharedPreferences("Shared", MODE_PRIVATE);
int hour = sp.getInt("Hour", 0);
int minute = sp.getInt("Minute", 0);
setAlarm(context, hour, minute);
}
}