Android - FATAL EXCEPTION:main,无法启动Activity,setAudioSource

时间:2017-06-11 14:50:23

标签: android audio recording

我只是尝试制作基本的录音和播放活动,但不断收到此错误。

以下是代码:

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));
        }
    });
}
}

这是错误:

  

致命的例外:主要                                                                              处理: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)                                                                                  at java.lang.reflect.Method.invoke(Native Method)                                                                                  在   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)                                                                                  at java.lang.reflect.Method.invoke(Native Method)                                                                                  在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:865)                                                                                  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

清单:

<?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>

1 个答案:

答案 0 :(得分:0)

mediaPlayer.setDataSource(String);

失败,refer to this获取更多信息。

因此您可以使用FileDescriptor

创建方法

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

然后致电

 try {
        mediaPlayer.setDataSource(openFile(outputFile));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }