5

中断が発生した場合に再生を停止するようにオーディオ再生アプリを設定しようとしています。次のようなAudioFocusHelperの設定に関するAndroidSDK開発者向けノートの指示に従いました。

public class AudioFocusHelper  implements AudioManager.OnAudioFocusChangeListener {
    AudioManager mAudioManager;  
    Media_Service mService;
    Context mContext;
    public AudioFocusHelper(Context ctx, Media_Service svc) {  
        mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);        
        mService = svc;    
        }    

    public boolean requestFocus() {        
        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==            
                mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,            
                        AudioManager.AUDIOFOCUS_GAIN);    
        }    

    public boolean abandonFocus() {        
        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==            
                mAudioManager.abandonAudioFocus(this);    
        }    

    @Override    
    public void onAudioFocusChange(int focusChange) {        
        // let your service know about the focus change    
        mService.AudioFocus(focusChange);
    }
}

そして、彼らが提案するように、私はオーディオプレーヤーをサービスで実行しています。オーディオサービスにこのメソッドがあり、オーディオフォーカスの変更に応答して再生を一時停止しますが、機能しません-vmデバッガーでこれをテストする方法がわからないため、着信時に何が起こっているかを実際に確認できません電話。トーストをポップアップするように言ったので、呼び出されていないようです。

public void AudioFocus(int focusChange) {
    switch (focusChange) {        
    case AudioManager.AUDIOFOCUS_GAIN:            // resume playback           
        if (mMediaPlayer == null) 
            initMediaPlayer();            
        else if (!mMediaPlayer.isPlaying()) 
            mMediaPlayer.start();            
        //mMediaPlayer.setVolume(1.0f, 1.0f);            
        break;        
    case AudioManager.AUDIOFOCUS_LOSS:            // Lost focus for an unbounded amount of time: stop playback and release media player            
        if (mMediaPlayer.isPlaying()) {
            Toast.makeText(this,
                    "Playback interrupted by focus loss", Toast.LENGTH_SHORT).show();

            mMediaPlayer.stop();     
        }
        mMediaPlayer.release();            
        mMediaPlayer = null;            
        break;        
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:            // Lost focus for a short time, but we have to stop           
        // playback. We don't release the media player because playback            
        // is likely to resume            
        if (mMediaPlayer.isPlaying()) {
            Toast.makeText(this,
                    "Playback paused by focus loss (transient)", Toast.LENGTH_SHORT).show();
            mMediaPlayer.pause();      
        }
        break;        
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:            // Lost focus for a short time, but it's ok to keep playing            
        // at an attenuated level            
        if (mMediaPlayer.isPlaying())  {
            Toast.makeText(this,
                    "Playback paused by focus loss (duck)", Toast.LENGTH_SHORT).show();
            mMediaPlayer.pause();            
            //mMediaPlayer.setVolume(0.1f, 0.1f); 
        }
        break;    
    }   
}

必要に応じてさらに多くのコードを投稿できます。すでに多くのコードを投稿しているようで、過剰な量を投稿したくありません。私のonAudioFocusChangeが呼び出されていないように見えます。これらの機能は2.2より前ではサポートされていないため、Android 2.2(minSDK 8)でこれを実行しています。こんにちはと低いでヒントを検索しましたが、このトピックについてはほとんど見つけられないので、誰かが私にいくつかの手がかりを与えてくれることを願っています。

4

2 に答える 2

3

これと同じ問題が発生しました。再生を開始するときにrequestFocus()メソッドを呼び出し、終了するときにabandonFocus()を呼び出す必要があることを忘れないでください。

于 2011-08-26T18:12:45.617 に答える
0

これは、DDMSを介して着信を生成するのに役立つと思います:Fake Incoming Call Android

うまくいけば、これでアプリケーションをデバッグできます。

于 2011-08-24T18:04:40.663 に答える