1

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);
        }
    }

0 Answers0