1

RTC_WAKEUP フラグを使用してブロードキャスト インテントを AlarmManager に登録し、指定された時間にオフにするアラーム (一種の) アプリを作成しています。作品...

ブロードキャストが受信されると、レシーバーは STREAM_ALARM ストリームを使用して MediaPlayer で着信音を再生するアクティビティを開始し、その他の処理を行います。すべてうまくいきますが、画面がオフのときにブロードキャストを受信すると、アクティビティは正しく起動しますが、着信音は再生されません。画面がオンでロックが解除されているときに受信すると、正常に動作し、着信音を再生します。

着信音を再生するアクティビティにコードを追加するように編集しました。

public void onCreate(Bundle bundle) {
    super.onCreate(bundle)
    ...
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    ringtonePlayer = new MediaPlayer();
    ...
    playRingtone();
}

private void playRingtone() throws IllegalArgumentException, SecurityException,      IllegalStateException, IOException {
    ringtonePlayer.setDataSource(prefs.getString(getRingTone(), RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE).toString()));

    ringtonePlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
    ringtonePlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK);
    ringtonePlayer.setLooping(true);
    ringtonePlayer.prepare();
    ringtonePlayer.start();
    Log.i(LOG_TAG, "Ringtone started");
}
4

3 に答える 3

5

これは古い投稿ですが、同じ問題があり、ここに何が欠けているかを知っていると思います. あなたのコードをこれ以上見ないのは単なる仮定ですが、通常、mediaPlayer を使用する場合は、onStop() および onPause() で停止する (または onPause() で一時停止する) ことをお勧めします。これを行った場合、可能な解決策がここにあります。onPause または onStop では、以下を呼び出さないでください。

 mMediaPlayer.stop();

(およびリリースなどの必要なものすべて)。WakeLock を呼び出して画面をオンにしておくためのフラグを設定すると、 onCreate が完了した後に onStop() と onPause() がアクティビティに対して複数回呼び出されるためです。これは、Android 4.1.2 を搭載したデバイス Samsung Galaxy s3 で検出したものです。代わりに、MediaPlayer が終了した場合に確実に停止するには、次のようにします。

   if(this.isFinishing()){

        mMediaPlayer.stop();

   }

これにより、アクティビティが実際に終了したときにのみ呼び出されるようになります。これはうまくいくはずです。

于 2013-08-01T05:05:39.783 に答える
1

onResume で再生を呼び出します - これは私にとってはうまくいきます

public class AlarmActivity extends Activity {
    private Uri uri = null;
    private int volume;
    private MediaPlayer mp = null;

    private void play() {
        if (uri == null) {
            return;
        }
        mp = new MediaPlayer();
        AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) * volume / 100, 0);
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mp.setOnPreparedListener(mpOnPrepared);
        mp.setOnCompletionListener(mpOnCompletion);
        try {
            mp.setDataSource(this, uri);
            mp.prepare();
        } catch (IOException e) {
            mp.release();
            mp = null;
            return;
        }
    }

    private OnPreparedListener mpOnPrepared = new OnPreparedListener()
    {
        @Override
        public void onPrepared(MediaPlayer mp)
        {
            mp.start();
        }
    };

    private OnCompletionListener mpOnCompletion = new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            mp.release();
            mp = null;
        }
    };

    private void stop() {
        if (mp != null) {
            mp.release();
            mp = null;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        setContentView(R.layout.activity_alarm);

        getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

        SharedPreferences sp = getSharedPreferences("settings", MODE_PRIVATE);
        uri = Uri.parse(sp.getString("uri", ""));
        volume = sp.getInt("volume", 100);
    }

    @Override
    protected void onResume () {
        super.onResume();

        play();
    }

    @Override
    protected void onPause () {
        super.onPause();

        stop();

        finish();
    }
}
于 2015-04-01T12:38:07.473 に答える
0

追加してみる

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);   
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

Activity開始するMediaPlayer

が開始する前に、これを使用して画面をオンにし、必要に応じてロックを解除する必要がありますActivity

于 2013-04-16T23:19:11.507 に答える