繁体   English   中英

插入耳机时强制音频到扬声器?

[英]Force audio to speaker when headphone is plugged in?

这是我的代码,我想同时打开耳机和扬声器 请编辑我的代码,因为我是编程初学者,我也尝试多次使用 AudioManager.Mode_Stream 但当我这样做时我什么也没听到

  package meracal.myapplicationlive;

import android.content.Context;
import android.media.audiofx.AcousticEchoCanceler;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.media.*;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity  {
    Button start, stop;
    boolean isRecording = false;
    AudioManager am = null;
    AudioRecord record = null;
    AudioTrack track = null;
    MediaPlayer mplayer = null;
    MediaRecorder mrecord = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        initRecordAndTrack();

        am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
        am.setMode(AudioManager.STREAM_RING);
        am.setSpeakerphoneOn(true);
        am.setBluetoothScoOn(true);
        am.startBluetoothSco();
        am.setBluetoothScoOn(true);

        (new Thread() {
            @Override
            public void run() {
                recordAndPlay();
            }
        }).start();

         start = (Button) findViewById(R.id.btnstart);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isRecording) {
                    startRecordAndPlay();
                }
            }
        });
         stop = (Button) findViewById(R.id.btnsstop);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isRecording) {
                    stopRecordAndPlay();
                }
            }
        });
    }

    private void initRecordAndTrack() {
        int min = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        record = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
                min);

        track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 44100, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, min,
                AudioTrack.MODE_STREAM);
    }

    private void recordAndPlay() {
        short[] lin = new short[1024];
        int num = 0;
        am.setMode(AudioManager.MODE_IN_COMMUNICATION);
        am.setSpeakerphoneOn(true);
        while (true) {
            if (isRecording) {
                num = record.read(lin, 0, 1024);
                track.write(lin, 0, num);

            }
        }
    }

    private void startRecordAndPlay() {
        record.startRecording();
        track.play();

        am.setSpeakerphoneOn(true);
        isRecording = true;
    }

    private void stopRecordAndPlay() {
        record.stop();
        track.pause();
        isRecording = false;
    }
}

这里的代码可能会强制通过扬声器播放音频:

audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

这对我有用

首先,我在 Manifest.xml 中添加了权限

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

然后,我使用了这个:

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

    m_amAudioManager.setMode(AudioManager.MODE_RINGTONE | AudioManager.MODE_IN_CALL);
    m_amAudioManager.setSpeakerphoneOn(true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM