Android - ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной, невозможно начать действие, setAudioSource

Я просто пытаюсь выполнить простую запись и воспроизведение звука, но продолжаю получать эту ошибку.

Вот код:

package com.example.wesle.noisemachine;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.widget.Toast;
import java.io.IOException;

public class ReceiveScreen extends AppCompatActivity {

private Button buttonStart, buttonStop, buttonPlay;
private MediaRecorder mediaRecorder = new MediaRecorder();
private String outputFile;

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

            buttonStart = (Button) findViewById(R.id.buttonStart);
            buttonStop = (Button) findViewById(R.id.buttonStop);
            buttonPlay = (Button) findViewById(R.id.buttonPlay);
            buttonStop.setEnabled(false);
            buttonPlay.setEnabled(false);
            outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mediaRecorder.setOutputFile(outputFile);

            buttonStart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                        try {
                            mediaRecorder.prepare();
                            mediaRecorder.start();
                        } catch (IllegalStateException ise) {
                        System.out.println("ISE Catch");
                    } catch (IOException ioe) {
                            System.out.println("ISE Catch");

                        }
                        buttonStart.setEnabled(false);
                        buttonStop.setEnabled(true);


                        Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();


                }
            });

            buttonStop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                        mediaRecorder.stop();
                        mediaRecorder.release();

                        buttonStop.setEnabled(false);
                        buttonPlay.setEnabled(true);
                        buttonStart.setEnabled(true);

                        Toast.makeText(getApplicationContext(), "Recording Completed", Toast.LENGTH_LONG).show();
                }
            });

            buttonPlay.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            MediaPlayer mediaPlayer = new MediaPlayer();

                            try {
                                mediaPlayer.setDataSource(outputFile);
                                mediaPlayer.prepare();
                                mediaPlayer.start();
                            } catch (Exception e) {
                                System.out.println("E Catch");
                            }
                            Toast.makeText(getApplicationContext(), "Recording Playing", Toast.LENGTH_LONG).show();
                        }
            });

    //Code for the back button
    Button backbuttonR = (Button) findViewById(R.id.backbuttonR);
    backbuttonR.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(ReceiveScreen.this, MainActivity.class));
        }
    });
}
}

Вот ошибка:

И манифест:

не работает, см. здесь для получения дополнительной информации.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wesle.noisemachine">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.example.wesle.noisemachine.MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.wesle.noisemachine.TransmitScreen" />
        <activity android:name="com.example.wesle.noisemachine.ReceiveScreen"></activity>
    </application>

</manifest>

person Wes Summers    schedule 11.06.2017    source источник
comment
нет, я сделал только WRITE_EXTERNAL-STORAGE и RECORD_AUDIO, я попробую это сейчас   -  person Florescu Cătălin    schedule 11.06.2017
comment
нет, та же ошибка   -  person Wes Summers    schedule 11.06.2017
comment
Вы используете Android 6 или выше? Разрешения в настройках разрешены?   -  person Wes Summers    schedule 11.06.2017
comment
я использовал 5X для эмуляции, я попробую 6   -  person Florescu Cătălin    schedule 11.06.2017
comment
все еще та же ошибка, что-то не так с setAudioSource?   -  person Wes Summers    schedule 11.06.2017
comment
Этот метод создал новую ошибку: Ошибка: (37, 30) ошибка: не найден подходящий метод для setOutputFile (File) метод MediaRecorder.setOutputFile (FileDescriptor) не применим (несоответствие аргументов; файл не может быть преобразован в FileDescriptor) метод MediaRecorder.setOutputFile (String) неприменимо (несоответствие аргументов; файл не может быть преобразован в String)   -  person Wes Summers    schedule 11.06.2017


Ответы (1)


mediaPlayer.setDataSource(String);

поэтому вы можете использовать FileDescriptor вместо

Создать метод

тогда позвони

private FileDescriptor openFile(String path)
    throws FileNotFoundException, IOException {
File file = new File(path);
FileOutputStream fos = new FileOutputStream(file);
return fos.getFD();
}

Вы предоставили

mediaPlayer.setDataSource(String);
разрешение?

 try {
        mediaPlayer.setDataSource(openFile(outputFile));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
person Adithya    schedule 11.06.2017
comment
Так что я почти уверен, что outputFile должен оставаться строкой - person Wes Summers; 11.06.2017
comment
Он не может разрешить FileNotFoundException, я не уверен, почему - person Wes Summers; 11.06.2017
comment
накройте его блоком try catch - person Wes Summers; 11.06.2017
comment
ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.example.wesle.mathsucks, PID: 4255 java.lang.RuntimeException: невозможно запустить действие ComponentInfo {com.example.wesle.mathsucks / com.example.wesle.noisemachine.ReceiveScreen}: java. lang.RuntimeException: сбой setAudioSource. в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2646) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2707) в android.app.ActivityThread.-wrap12 (ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1460) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main ( ActivityThread.java:6077) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) в com.android.internal.os.ZygoteInit.main (ZygoteInit. java: 755) Причина: java.lang.RuntimeException: сбой setAudioSource. в android.media.MediaRecorder.setAudioSource (собственный метод) в com.example.wesle.noisemachine.ReceiveScreen.onCreate (ReceiveScreen.java:35) в android.app.Activity.performCreate (Activity.java:6662) в android.app . Instrumentation.callActivityOnCreate (Instrumentation.java:1118) в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2599) в android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2707) в android.app.ActivityThread.-wrap12 ( ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1460) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:154 ) в android.app.ActivityThread.main (ActivityThread.java:6077) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755) - person Adithya; 11.06.2017