Android 如何使用智能眼镜录制音频?

Android 如何使用智能眼镜录制音频?,android,sony,sony-smarteyeglass,Android,Sony,Sony Smarteyeglass,我正在开发一个带有索尼智能眼镜的录音机,但它不能很好地工作 我的应用程序只记录手机麦克风的声音,而不是智能眼镜麦克风的声音 我只想录制一个来自智能眼镜麦克风的声音 有什么想法吗 这是我的密码 public class AudioRecordControl extends ControlExtension { private final AudioManager _audioManager; private final File _file; private SmartEy

我正在开发一个带有索尼智能眼镜的录音机,但它不能很好地工作

我的应用程序只记录手机麦克风的声音,而不是智能眼镜麦克风的声音

我只想录制一个来自智能眼镜麦克风的声音

有什么想法吗

这是我的密码

public class AudioRecordControl extends ControlExtension {
    private final AudioManager _audioManager;
    private final File _file;
    private SmartEyeglassControlUtils _util;
    private static final int SMARTEYEGLASS_API_VERSION = 1;
    private MediaRecorder _recorder;
    private MediaPlayer _player;

    enum State {
        STOP,
        RECORDING,
        PLAYING,
    }

    private State _state;

    public AudioRecordControl(Context context, String hostAppPackageName) {
        super(context, hostAppPackageName);
        _util = new SmartEyeglassControlUtils(hostAppPackageName, new SmartEyeglassEventListener() {
            @Override
            public void onDialogClosed(int code) {
                super.onDialogClosed(code);
                doNextAction(code);
                showCurrentLayout();
            }
        });
        _util.setRequiredApiVersion(SMARTEYEGLASS_API_VERSION);
        _util.activate(context);

        _audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
        _audioManager.setMode(AudioManager.MODE_IN_CALL);
        _audioManager.startBluetoothSco();

        _state = State.STOP;

        File directoryPath = Environment.getExternalStoragePublicDirectory("AudioRecord");
        if (!directoryPath.exists()) {
            if (!directoryPath.mkdirs()) {
                Log.e(Constants.LOG_TAG, "failed to create directory '" + directoryPath.toString() + "'");
            }
        }
        _file = new File(directoryPath, "record.3gp");

        showCurrentLayout();
    }

    private void showCurrentLayout() {
        showLayout(R.layout.layout, null);
        switch (_state) {
            case STOP:
                String[] buttons;
                if (_file.exists()) {
                    buttons = new String[]{
                            mContext.getString(R.string.record),
                            mContext.getString(R.string.play)};
                } else {
                    buttons = new String[]{mContext.getString(R.string.record)};
                }
                _util.showDialogMessage(
                        mContext.getString(R.string.title),
                        mContext.getString(R.string.choose_one), buttons);
                break;
            case RECORDING:
                _util.showDialogMessage(
                        mContext.getString(R.string.stop_recording),
                        com.sony.smarteyeglass.SmartEyeglassControl.Intents.DIALOG_MODE_OK);
                break;
            case PLAYING:
                _util.showDialogMessage(
                        mContext.getString(R.string.stop_playing),
                        com.sony.smarteyeglass.SmartEyeglassControl.Intents.DIALOG_MODE_OK);
                break;
            default:
                break;
        }
    }

    private void doNextAction(int code) {
        if (code == -1) {
            stopRequest();
        }
        showLayout(R.layout.layout, null);
        switch (_state) {
            case STOP:
                if (code == 0) {
                    Log.d(Constants.LOG_TAG, "start recording");
                    try {
                        _startRecording();
                    } catch (IOException e) {
                        Log.e(Constants.LOG_TAG, "failed to record", e);
                        _util.showDialogMessage(
                                mContext.getString(R.string.failed_to_record),
                                SmartEyeglassControl.Intents.DIALOG_MODE_TIMEOUT);
                        _recorder = null;
                        return;
                    }
                    _state = State.RECORDING;
                } else if (code == 1) {
                    Log.d(Constants.LOG_TAG, "start playing");
                    try {
                        _play();
                    } catch (IOException e) {
                        Log.e(Constants.LOG_TAG, "failed to play", e);
                        _util.showDialogMessage(
                                mContext.getString(R.string.failed_to_pla),
                                SmartEyeglassControl.Intents.DIALOG_MODE_TIMEOUT);
                        _player = null;
                        return;
                    }
                    _state = State.PLAYING;
                } else {
                    stopRequest();
                }
                break;
            case RECORDING:
                Log.d(Constants.LOG_TAG, "stop recording");
                _stopRecord();
                _state = State.STOP;
                break;
            case PLAYING:
                Log.d(Constants.LOG_TAG, "stop playing");
                _stopPlay();
                _state = State.STOP;
                break;
            default:
                _state = State.STOP;
                break;
        }
    }

    private void _startRecording() throws IOException {
        if (_recorder == null) {
            _recorder = new MediaRecorder();
            _recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            _recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            _recorder.setOutputFile(String.valueOf(_file));
            _recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            _recorder.prepare();
            _recorder.start();
        }
    }

    private void _stopRecord() {
        if (_recorder != null) {
            _recorder.stop();
            _recorder.reset();
            _recorder.release();
            _recorder = null;
        }
    }

    private void _play() throws IOException {
        if (_player == null) {
            _player = new MediaPlayer();
            _player.setDataSource(String.valueOf(_file));
            _player.prepare();
            _player.start();
        }
    }

    private void _stopPlay() {
        if (_player != null) {
            _player.stop();
            _player.reset();
            _player.release();
            _player= null;
        }
    }

    @Override
    public void onResume() {
        showCurrentLayout();
    }

    @Override
    public void onTap(int action, long timeStamp) {
        super.onTap(action, timeStamp);
        showCurrentLayout();
    }

    @Override
    public void onDestroy() {
        Log.d(Constants.LOG_TAG, "Control On Desuptroy");
        _util.deactivate();
        _audioManager.setMode(AudioManager.MODE_NORMAL);
        _audioManager.stopBluetoothSco();
    }
}

某些手机在设置模式后需要额外的方法调用:

private AudioManager m_amAudioManager;  
m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
m_amAudioManager.setSpeakerphoneOn(false); 
要了解有关其余操作的更多信息,请参阅SmartyeGlass音频I/O指南:

您是否可以在不使用眼镜的情况下将录制代码放入活动和测试中

由于您仅使用手机的功能,如果您可以在活动中单独使用麦克风录音,则手机应该可以正常工作。请确保已在AndroidManifest.xml中添加uses权限标记