22

メディア プレーヤーを介してファイルを再生し、スピーカーのオン/オフ、ヘッドセットを介した再生、Bluetooth などのオプションを提供したいと考えています。Android 2.2でうまく機能する以下のコードを試しましたが、2.2と4.0の両方でも機能するものが必要です。プログラムでスピーカーのオン/オフを切り替えたり、ヘッドフォンで再生したりできますか?

AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
    if(isOn){
        audioManager.setMode(AudioManager.MODE_IN_CALL);    
        audioManager.setMode(AudioManager.MODE_NORMAL); 
    }else{
        //Seems that this back and forth somehow resets the audio channel
        audioManager.setMode(AudioManager.MODE_NORMAL);     
        audioManager.setMode(AudioManager.MODE_IN_CALL);        
    }
    audioManager.setSpeakerphoneOn(isOn);

PS:マニフェストでこの許可を与えました:

android.permission.MODIFY_AUDIO_SETTINGS 
4

8 に答える 8

27

このようなものは、一部のデバイスで動作する可能性があります (XPeria P でのみテストしました)。

final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;

Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
// To get back to the default behaviour, use the combination FOR_MEDIA,FORCE_NONE.

この組み合わせFOR_MEDIA, FORCE_SPEAKERは、通常、FM ラジオ オーディオをラウドスピーカーにルーティングするために内部でのみ使用されます (FM ラジオでは、アンテナとして機能するように有線ヘッドセット/ヘッドフォンを接続する必要があるため)。FM ラジオ機能を持たない (または代替の実装を使用する) デバイスは、このパラメーターの組み合わせを無視する可能性があるため、このメソッドはそのようなデバイスでは機能しません。

于 2012-08-20T12:33:24.300 に答える
5

リアスピーカーまたはフロントイヤーピースのいずれかを一度に取得できます。

アクセサリが接続されていない場合。

audioManager.setMode(AudioManager.MODE_IN_CALL);audioManager.setSpeakerphoneOn(false);でフロントスピーカー/受話口を使用。しかし、これはスピーカーではなくイヤホンでオーディオを再生します。リアスピーカーを使用するには、audioManager.setMode(AudioManager.MODE_NORMAL);&を使用します。audioManager.setSpeakerphoneOn(true);

アクセサリが接続されている場合。audioManager.setMode(AudioManager.MODE_IN_CALL); を使用します。& audioManager.setSpeakerphoneOn(false); フロントスピーカー/イヤピースを使用する。しかし、これはスピーカーではなくイヤホンでオーディオを再生します。リアスピーカーを使用するには、audioManager.setMode(AudioManager.MODE_IN_CALL);&を使用します。audioManager.setSpeakerphoneOn(true);

注:イヤホン経由でオーディオをルーティングするようaudioManager.setWiredHeadsetOn(boolean on)audioManager.setBluetoothScoOn(boolean on)設定してください。それに応じてオーディオをルーティングfalseするには、どちらかを に設定します。true

于 2014-03-14T11:50:20.820 に答える
2

スピーカーフォンを開きたいだけの場合は、アクティビティの oncreate() にこの行を記述してください。

static AudioManager audioManager =  (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
于 2014-10-29T10:12:13.920 に答える
2

問題が解決しました。まだ答えを探しているあなたへ。これはバグではなく、ただのトリッキーなことです。PhoneStateListener を使用する必要があります

このガイドの使用: http://danielthat.blogspot.co.il/2013/06/android-make-phone-call-with-speaker-on.html

于 2014-08-22T07:52:58.623 に答える
-1

試す

AudioManager.speakerphone(true);

これを見てください。

于 2012-08-20T10:48:24.210 に答える