Java 当应用程序关闭且手机关闭时,警报未播放

Java 当应用程序关闭且手机关闭时,警报未播放,java,android,audio,timer,countdown,Java,Android,Audio,Timer,Countdown,我想在计时器为00:00时播放警报声。我还想推一个通知。通知工作正常。但是我的声音有问题 当应用程序打开时,一切正常,但当手机处于待机状态且屏幕为黑色时,一切都不会发生。只显示通知 我试图用MediaPlayer解决这个问题。这条路对吗? 我必须使用唤醒锁吗 有没有办法让它工作,让计时器做他应该做的 我怎样才能解决这个问题 package com.example.countdown; import androidx.appcompat.app.AppCompatActivity; impor

我想在计时器为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(),
                    "%02d:%02d:%02d", hours, minutes, seconds);
        }else {
            timeLeftFormatted = String.format(Locale.getDefault(),
                    "%02d:%02d", 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();

    }

}
´´´
package com.example.countdown;
导入androidx.appcompat.app.appcompat活动;
导入android.content.SharedReferences;
导入android.media.AudioAttributes;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.media.Ringtone;
导入android.media.ringtonemager;
导入android.media.SoundPool;
导入android.net.Uri;
导入android.os.Build;
导入android.os.Bundle;
导入android.os.CountDownTimer;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.view.inputmethod.InputMethodManager;
导入com.google.android.gms.ads.AdView;
导入java.util.Locale;
导入com.google.android.gms.ads.MobileAds;
导入com.google.android.gms.ads.initialization.InitializationStatus;
导入com.google.android.gms.ads.initialization.OnInitializationCompleteListener;
导入com.google.android.gms.ads.AdRequest;
导入com.tapadoo.alerter.alerter;
公共类MainActivity扩展了AppCompatActivity{
私有EditText mEditTextInput;
私有文本视图MTEXTVIEW倒计时;
私人按钮mButtonSet;
私人按钮mButtonStartPause;
私人按钮;
专用按钮mButton8h;
专用按钮MBUTON12H;
专用按钮mButton24h;
私人按钮mButton3d;
专用按钮mButton7d;
私人按钮mButton_showAlerter;
私人按钮mButtonAlarmSound;
专用倒数计时器mCountDownTimer;
私有布尔mTimerRunning;
私人长mStartTimeInMillis;
私有长mtimelftinmillis;
私生活时间长;
私人声池声池;
专用int报警;
AdView mAdView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
初始化(这是新的OnInitializationCompleteListener(){
@凌驾
public void onInitializationComplete(初始化状态InitializationStatus){
}
});
mAdView=findviewbyd(R.id.adView);
AdRequest AdRequest=新建AdRequest.Builder().build();
mAdView.loadAd(adRequest);
mEditTextInput=findViewById(R.id.edit\u text\u input);
mTextViewCountDown=findviewbyd(R.id.text\u view\u countdown);
mButtonSet=findviewbyd(R.id.按钮组);
mButtonStartPause=findViewById(R.id.按钮\启动\暂停);
mbutonreset=findviewbyd(R.id.按钮\ U重置);
mButton8h=findViewById(R.id.按钮_8h);
mButton12h=findViewById(R.id.按钮_12h);
mButton24h=findviewbyd(R.id.button_24h);
mButton3d=findViewById(R.id.button_3d);
mButton7d=findviewbyd(R.id.button_7d);
mButton_showAlerter=findViewById(R.id.Button_showAlerter);
mButtonAlarmSound=findViewById(R.id.按钮\警报声);
mButtonSet.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
字符串输入=mEditTextInput.getText().toString();
if(input.length()==0){
Toast.makeText(MainActivity.this,“字段不能为空!”,Toast.LENGTH\u SHORT.show();
返回;
}
long millisInput=long.parseLong(输入)*60000;
如果(毫秒输入==0){
Toast.makeText(MainActivity.this,“请输入正数!”,Toast.LENGTH\u SHORT.show();
返回;
}
设定时间(毫输入);
mEditTextInput.setText(“”);
}
});
mButtonStartPause.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(mTimerRunning){
pauseTimer();
}否则{
startTimer();
}
}
});
mbutonreset.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
重置计时器();
}
});
mButton8h.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mEditTextInput.setText(“480”);
}
});
mButton12h.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mEditTextInput.setText(“720”);
}
});
mButton24h.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mEditTextInput.setText(“1440”);
}
});
mButton3d.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mEditTextInput.setText(“4320”);
}
});
mButton7d.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
mEditTextInput.setText(“10080”);
}
});
}
私有void设置时间(长毫秒){
mStartTimeInMillis=毫秒;
重置计时器();
关闭键盘();
}
私有void startTimer(){