21

androidを使用して、ファイルから電話のイヤピース(または接続されているヘッドセット)にオーディオを再生したいのですがMediaPlayer。このスレッドで提案されているように、MODE_IN_CALLハックを使用してみました-Android-イヤピースを介してオーディオを再生しまし たが、それは役に立ちませんでした。このアプリにはandroid.permission.MODIFY_AUDIO_SETTINGS権限もありますが、への呼び出しm_amAudioManager.setSpeakerphoneOn(false);はすべて無視されます。

private AudioManager m_amAudioManager;  
m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
m_amAudioManager.setSpeakerphoneOn(false); 

の呼び出しも役に立ちませんでしたsetMode(AudioManager.STREAM_VOICE_CALL);MediaPlayer

mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();

このコードを壊すためにAndroid2.3から何か変更がありましたか?Android ICSでコードを試しましたが、成功しませんでした。誰かが私を正しい方向に向けることができますか?これまでのところ、オーディオは常にスピーカーフォンから再生されます。

4

8 に答える 8

39

これを行う正しい方法は、次のコードを使用することです。

イヤーピースを再生します

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

スピーカーフォンで再生する

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

それだ。他の解決策(ここに投稿されたものを含む-> Android-イヤピースを介してオーディオを再生する)は、デバイス間で一貫して機能しません。実際、MODE_IN_CALLを使用すると、特定のデバイスでオーディオが再生されないことが保証されます。

注:ストリームを変更するには、メディアプレーヤーを再準備する必要があります。

于 2013-03-06T18:46:00.850 に答える
5

DeepakBalaの回答の完全な例を追加したかっただけです。MediaPlayer.create()メソッドを使用しない場合に機能します。

    this.player = new MediaPlayer(); 
    this.player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

    try {
        this.player.setDataSource(getContext(), Uri.fromFile(new File(m.localFileUrl)));
        this.player.prepare();
    } catch (IllegalStateException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
于 2016-05-11T08:58:34.550 に答える
4

私の場合、問題は以下のコードを使用して解決されました

    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
    mAudioManager.setSpeakerphoneOn(false);
于 2018-12-24T12:11:13.947 に答える
3

次のコードは私にとっては問題なく機能し、複数のデバイスでテストしました。

1-インスタンスの作成:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE));

2-音量を最大に設定する場合(オプション)

 int maxVolumeMusic = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumeMusic, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
 mAudioManager.setMode(AudioManager.STREAM_MUSIC);

3-イヤピースから再生するオーディオを設定します。

mAudioManager.setSpeakerphoneOn(false);

4-プレイ:

mPlayer.setLooping(true);
mPlayer.start();

終わり!!!!しかし、私があなたと共有しようとしているいくつかのヒントがあります:

1-ステップ2で、AudioManager.setStreamVolume()の前にAudiomanager.setMode()を設定すると、音量は最大に設定されません。

2- mPlayer.setLooping(true);の前にmPlayer.prepare()を追加した場合。クラッシュにつながる可能性があります!、mPlayerが次のように初期化されている間はmPlayer.prepare()を使用しないでください。

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);

3-ステップ2で、mAudioManager.setMode()AudioManager.STREAM_MUSICを使用しましたが、他のモードを試すと、多くの場合、スピーカーのオンとオフを切り替えることができませんでした。

于 2017-12-31T08:05:07.697 に答える
1

この方法は私にとってはうまく機能しています。

オーディオマネージャモードも設定する必要があります。次に、audiomgr.setSpeakerphoneOn(false)APIを使用して切り替えることができます。

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
audiomgr.setSpeakerphoneOn(false);
于 2017-05-20T21:41:14.063 に答える
0

では、これはどうですか?

// Make sure that streams following the PHONE routing strategy aren't forced
// to play in the speaker.
Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse",
    int.class,
    int.class);
// First 0 == FOR_COMMUNICATION, second 0 == FORCE_NONE.
setForceUse.invoke(null, 0, 0);

次にSTREAM_VOICE_CALL、MediaPlayerに使用します。

通話が成功してもMediaPlayerからの音声がスピーカーで再生される場合setForceUseは、これをテストしている電話/タブレットのAudioPolicyManager実装で問題が発生していると言えます。

于 2012-12-19T21:38:00.887 に答える
0

メディアプレーヤーとオーディオマネージャーの両方を設定する必要があることがわかりました

private MediaPlayer mp = new MediaPlayer();
AudioManager mAudioManager = (AudioManager) v.getContext()
                                .getSystemService(Context.AUDIO_SERVICE);
                        mAudioManager.setSpeakerphoneOn(false);
                        mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
于 2017-05-18T09:50:18.290 に答える
0

オーディオマネージャーのスピーカーフォンの問題は、この方法でのみ解決されます。

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
audiomgr.setSpeakerphoneOn(false);
于 2021-02-15T17:47:44.180 に答える