IllegalStateException при выполнении MediaRecoder.start () для Android - PullRequest
0 голосов
/ 19 апреля 2020

Я застрял с проблемой.

Я пытаюсь выполнить потоковую передачу звука с устройства на сервер.

Устройство подключено к серверу через сокет. Я создал LocalServerSocket и установил MediaRecorder.setOutputFile для этого локального сокета.

Однако, когда я пытаюсь сделать MediaRecoder.start (), он генерирует исключение IllegalStateException. Если выходной файл был локальным файлом, он проходит успешно.

Я также поменял местами отправителя и получателя локальный сокет с тем же результатом.

public class ChatClientV2 extends AsyncTask {

    private boolean _mInChatMode=false, _mStopChat = false;
    private Object syncObject= new Object();
    private int _mPort;
    private String _mServerAddress;

    private MediaRecorder _mMediaRecorder;
    private MediaPlayer _mMediaPlayer;

    private LocalServerSocket _mLocalServer;
    private LocalSocket _mLocalReceiver, _mLocalSender;

    //private MediaPlayer _mMediaPlayer;

    //  private AudioRecord _mRecorder;
//    private AudioTrack _mPlayer;
    //  private int _mBufferSize;

    //private ChatPlayBack _mChatPlayBack;
    private final  String LOCAL_SOCKET_NAME = "chatRecord";

    public ChatClientV2(String serverAddress, int serverPort, int sampleRate){

        _mServerAddress=serverAddress;
        _mPort=serverPort;

        _mMediaRecorder = new MediaRecorder();
        //_mChatPlayBack = new ChatPlayBack(sampleRate);
        executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,(Object)null);

    }

    public void startChat(){
        if (_mInChatMode)
            return;
        synchronized (syncObject) {
            _mStopChat=false;
            _mInChatMode=true;
            syncObject.notifyAll();
        }

        startRecording();
    }

    public void stopChat(){
        if (!_mInChatMode)
            return;
        synchronized (syncObject){
            _mInChatMode = false;
            syncObject.notifyAll();
        }
        pauseRecording();
    }

    public void endChat(){
        synchronized (syncObject){
            _mStopChat = true;
            syncObject.notifyAll();
        }
    }

    @Override
    protected Object doInBackground(Object[] objects) {

        Socket _mSocket = new Socket();
        try {
            _mSocket.connect(new InetSocketAddress(_mServerAddress, _mPort));
            //      _mChatPlayBack.startPlayBack(_mSocket);
            try {
                _mLocalServer = new LocalServerSocket(LOCAL_SOCKET_NAME);
                setUpRecorder();
                _mLocalSender=_mLocalServer.accept();

            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }

            byte tempBuffer[] = new byte[1024];
            while (!_mStopChat){

                int retval= _mLocalSender.getInputStream().read(tempBuffer);
                if (retval > 0 ){
                    _mSocket.getOutputStream().write(tempBuffer,0,retval);
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private void setUpRecorder(){
        try
        {
            _mLocalReceiver = new LocalSocket(LocalSocket.SOCKET_STREAM);
            _mLocalReceiver.connect(new LocalSocketAddress(LOCAL_SOCKET_NAME));

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        Log.i("AudioRecord","------mRecorder configured--------");
    }

    private void startRecording(){
        _mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        _mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        _mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        _mMediaRecorder.setOutputFile(_mLocalReceiver.getFileDescriptor());
        try
        {
            _mMediaRecorder.prepare();
            _mMediaRecorder.start();
            Log.i("AudioRecord","------mRecorder.start()--------");
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void pauseRecording(){
        _mMediaRecorder.stop();
    }
}

Logcat ниже

W/b202.card28.g28: type=1400 audit(0.0:122215): avc: denied { read write } for path="socket:[10736829]" dev="sockfs" ino=10736829 scontext=u:r:mediaserver:s0 tcontext=u:r:untrusted_app:s0:c6,c257,c512,c768 tclass=unix_stream_socket permissive=0
E/MediaRecorder: start 0 m_rotation
E/MediaRecorder: start failed: -38
W/System.err: java.lang.IllegalStateException
W/System.err:     at android.media.MediaRecorder.native_start(Native Method)
W/System.err:     at android.media.MediaRecorder.start(MediaRecorder.java:1143)
W/System.err:     at in.b202.card28.Chat.ChatClientV2.startRecording(ChatClientV2.java:157)
W/System.err:     at in.b202.card28.Chat.ChatClientV2.startChat(ChatClientV2.java:61)
W/System.err:     at in.b202.card28.GamePlay.handleChat(GamePlay.java:862)
W/System.err:     at in.b202.card28.GamePlay.access$400(GamePlay.java:65)
W/System.err:     at in.b202.card28.GamePlay$6.onLongClick(GamePlay.java:849)

Я также пробовал с разными форматами и кодеками. Любая помощь в этом будет оценена.

...