#java #android #audio #timer #countdown
#java #Android #Аудио #таймер #обратный отсчет
Вопрос:
я хочу воспроизвести звуковой сигнал, когда таймер равен 00:00. Также я хочу отправить уведомление. Уведомление работает должным образом. Но у меня проблема со звуком.
Когда приложение открыто, все работает, но когда телефон находится в режиме ожидания, а экран черный, ничего не происходит. Отображается только уведомление.
Я пытался решить это с помощью MediaPlayer. Это правильный путь? Должен ли я использовать блокировку пробуждения?
Есть ли какой-нибудь способ заставить его работать, чтобы таймер делал то, что он должен?
Как я могу это исправить?
package com.example.countdown;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.media.SoundPool;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.view.inputmethod.InputMethodManager;
import com.google.android.gms.ads.AdView;
import java.util.Locale;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
import com.google.android.gms.ads.AdRequest;
import com.tapadoo.alerter.Alerter;
public class MainActivity extends AppCompatActivity {
private EditText mEditTextInput;
private TextView mTextViewCountDown;
private Button mButtonSet;
private Button mButtonStartPause;
private Button mButtonReset;
private Button mButton8h;
private Button mButton12h;
private Button mButton24h;
private Button mButton3d;
private Button mButton7d;
private Button mButton_showAlerter;
private Button mButtonAlarmSound;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mStartTimeInMillis;
private long mTimeLeftInMillis;
private long mEndTime;
private SoundPool soundPool;
private int alarm;
AdView mAdView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this, new OnInitializationCompleteListener() {
@Override
public void onInitializationComplete(InitializationStatus initializationStatus) {
}
});
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
mEditTextInput = findViewById(R.id.edit_text_input);
mTextViewCountDown = findViewById(R.id.text_view_countdown);
mButtonSet = findViewById(R.id.button_set);
mButtonStartPause = findViewById(R.id.button_start_pause);
mButtonReset = findViewById(R.id.button_reset);
mButton8h = findViewById(R.id.button_8h);
mButton12h = findViewById(R.id.button_12h);
mButton24h = findViewById(R.id.button_24h);
mButton3d = findViewById(R.id.button_3d);
mButton7d = findViewById(R.id.button_7d);
mButton_showAlerter = findViewById(R.id.Button_showAlerter);
mButtonAlarmSound = findViewById(R.id.Button_alarmSound);
mButtonSet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String input = mEditTextInput.getText().toString();
if (input.length() == 0) {
Toast.makeText(MainActivity.this, "Field can´t be empty!", Toast.LENGTH_SHORT).show();
return;
}
long millisInput = Long.parseLong(input) * 60000;
if (millisInput == 0) {
Toast.makeText(MainActivity.this, "Please enter a positive number!", Toast.LENGTH_SHORT).show();
return;
}
setTime(millisInput);
mEditTextInput.setText("");
}
});
mButtonStartPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(mTimerRunning){
pauseTimer();
} else {
startTimer();
}
}
});
mButtonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
resetTimer();
}
});
mButton8h.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEditTextInput.setText("480");
}
});
mButton12h.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEditTextInput.setText("720");
}
});
mButton24h.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEditTextInput.setText("1440");
}
});
mButton3d.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEditTextInput.setText("4320");
}
});
mButton7d.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mEditTextInput.setText("10080");
}
});
}
private void setTime(long milliseconds){
mStartTimeInMillis = milliseconds;
resetTimer();
closeKeyboard();
}
private void startTimer() {
mEndTime = System.currentTimeMillis() mTimeLeftInMillis;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 100) {
@Override
public void onTick(long millisUntillFinished) {
mTimeLeftInMillis = millisUntillFinished;
updateCountDownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
updateWatchInterface();
mButton_showAlerter.performClick();
mButtonAlarmSound.performClick();
}
}.start();
mTimerRunning=true;
updateWatchInterface();
}
private void pauseTimer() {
mCountDownTimer.cancel();
mTimerRunning=false;
updateWatchInterface();
}
private void resetTimer() {
mTimeLeftInMillis = mStartTimeInMillis;
updateCountDownText();
updateWatchInterface();
}
private void updateCountDownText() {
int hours = (int) (mTimeLeftInMillis / 1000) / 3600;
int minutes = (int) ((mTimeLeftInMillis / 1000) %3600) / 60;
int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted;
if (hours > 0){
timeLeftFormatted = String.format(Locale.getDefault(),
"d:d:d", hours, minutes, seconds);
}else {
timeLeftFormatted = String.format(Locale.getDefault(),
"d:d", minutes, seconds);
}
mTextViewCountDown.setText(timeLeftFormatted);
}
private void updateWatchInterface(){
if (mTimerRunning){
mEditTextInput.setVisibility(View.INVISIBLE);
mButtonSet.setVisibility(View.INVISIBLE);
mButtonReset.setVisibility(View.INVISIBLE);
mButtonStartPause.setText("Stop");
}else {
mEditTextInput.setVisibility(View.VISIBLE);
mButtonSet.setVisibility(View.VISIBLE);
mButtonStartPause.setText("Start");
if(mTimeLeftInMillis < 1000) {
mButtonStartPause.setVisibility(View.INVISIBLE);
} else {
mButtonStartPause.setVisibility(View.VISIBLE);
}
if(mTimeLeftInMillis < mStartTimeInMillis) {
mButtonReset.setVisibility(View.VISIBLE);
} else {
mButtonReset.setVisibility(View.INVISIBLE);
}
}
}
private void closeKeyboard() {
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("startTimeInMillis", mStartTimeInMillis);
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
editor.apply();
if (mCountDownTimer != null) {
mCountDownTimer.cancel();
}
}
@Override
protected void onStart() {
super.onStart();
SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);
mStartTimeInMillis = prefs.getLong("startTimeInMillis", 600000);
mTimeLeftInMillis = prefs.getLong("millisLeft", mStartTimeInMillis);
mTimerRunning = prefs.getBoolean("timerRunning", false);
updateCountDownText();
updateWatchInterface();
if (mTimerRunning) {
mEndTime = prefs.getLong("endTime", 0);
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
if(mTimeLeftInMillis < 0){
mTimeLeftInMillis=0;
mTimerRunning = false;
updateCountDownText();
updateWatchInterface();
}else{
startTimer();
}
}
final MediaPlayer mp=MediaPlayer.create(this, R.raw.alarm);
mButtonAlarmSound.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
mp.start();
}
});
}
public void showAlerter(View v) {
Alerter.create(this)
.setTitle("Shield Timer Alarm")
.setText("Captain, your Shield will drop now. Please prepaire for your next fight!")
.setIcon(R.drawable.ic_android_black_24dp)
.setBackgroundColorRes(R.color.colorPrimary)
.setDuration(5000)
.enableSwipeToDismiss()
.show();
}
}
´´´
Комментарии:
1. Что вы подразумеваете под «мой телефон выключен»? Казалось бы логичным, что ваше устройство ничего не делает, когда оно не включено.
2. Когда я нажимаю кнопку ожидания. Экран черный, а мой телефон выключен.