web-dev-qa-db-ja.com

プログラムでスピーカーをオン/オフにする方法Android 4.0

メディアプレーヤーでファイルを再生し、スピーカーのオン/オフ、ヘッドセットでの再生、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 
20

このようなものは一部のデバイスで動作する可能性があります(私は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ラジオ機能を持たない(または代替の実装を使用する)デバイスは、このパラメーターの組み合わせを無視する可能性があるため、このメソッドはそのようなデバイスでは機能しません。

26
Michael
AudioManager mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

Button mVolumeButton = (Button)findViewById(R.id.btn_Volume);
        mVolumeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mAudioMgr.isWiredHeadsetOn()){
                    mAudioMgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
                    mAudioMgr.setWiredHeadsetOn(false);
                    mAudioMgr.setSpeakerphoneOn(true);
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);

                    Toast.makeText(getApplicationContext(), "SpeakerPhone On", Toast.LENGTH_LONG).show();
                }else{
                    mAudioMgr.setMode(AudioManager.MODE_IN_COMMUNICATION);
                    mAudioMgr.setSpeakerphoneOn(false);
                    mAudioMgr.setWiredHeadsetOn(true);
                    Toast.makeText(getApplicationContext(), "Wired Headset On", Toast.LENGTH_LONG).show();
                }
            }
        });
4
Jatin Patel

リアスピーカーまたはフロントイヤーピースのいずれかを同時に入手できます。

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

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に設定して、それに応じてオーディオをルーティングします。

3

uでスピーカーフォンを開きたいだけの場合は、アクティビティのoncreate()にこの行を書き込みます。

static AudioManager audioManager =  (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
2
Sujith Ks

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

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

2
myna

これを試して。

AudioManager audioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
    if (isOn) {
        isOn = false;
        audioManager.setMode(AudioManager.MODE_IN_CALL);
        audioManager.setMode(AudioManager.MODE_NORMAL);

    } else {
        isOn = true;
        audioManager.setMode(AudioManager.MODE_NORMAL);
        audioManager.setMode(AudioManager.MODE_IN_CALL);

    }
    audioManager.setSpeakerphoneOn(isOn);
1
user9673947

コードスニペットに従ってください:

//for spearphone on
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);

//for headphone on
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);

ところで、私はAndroid 7.0(Redmi 4x)でテストしましたが、うまくいきました。

0
Aolphn