0

Захотелось сделать приложение, которое будет в 15:45 включать звук на телефоне, а в 8:45 отключать звук. Захотелось реализовать через AsyncTask. Запуск приложения -> выводит время -> 5 секунд проходит -> вылетает. Почему?

MainActivity.java

package com.pepelac.test_sound_change;

import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Calendar;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        assert am != null;
        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        am.setRingerMode(AudioManager.RINGER_MODE_SILENT); /* mute */
        MyTask longTask;
        longTask = new MyTask();
        longTask.execute();
    }

    @SuppressLint("StaticFieldLeak")
    class MyTask extends AsyncTask<Void, Void, Void> {
        @SuppressLint("ShowToast")
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Toast toast = Toast.makeText(getApplicationContext(),
                    "ok!", Toast.LENGTH_SHORT);
            toast.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            while (true) {

                task();

                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            //а здесь мы прячем диалог и заканчиваем работу всех функций которые были запущены в doInBackground()
        }

        public void task() {
            AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            Calendar calendar = Calendar.getInstance();
            int hour = calendar.get(Calendar.HOUR);
            int minute = calendar.get(Calendar.MINUTE);
            int PM = calendar.get(Calendar.AM_PM);
            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
            TextView textView = (TextView) findViewById(R.id.textView);
            textView.setText(String.valueOf(hour) +':'+String.valueOf(minute));
            if (hour == 8 && minute == 45 && PM == 0)
                am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
            if (PM == 1) {
                switch (dayOfWeek) {
                    case 2:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 3:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 4:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 5:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 6:
                        if (hour == 3 && minute == 45) {
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                        }
                    case 7:
                        if ((hour == 1) && (minute == 0))
                            am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                }
            }
        }

    }
}

1 Answers1

0

чтобы сделать такое приложение используйте не AsyncTask, а AlarmManager. У вас приложение в это время может быть закрыто. Если закрыть приложение и вычистить его из памяти, то все что вы написали работать не будет. Вам надо посмотреть на примеры реализации будильника, но только вместо уведомления, менять режим звука

pavel163
  • 4,468
  • 1
  • 12
  • 22