android - 我是编程新手。我正在尝试制作 Android 应用程序 soundrecoder

标签 android

我正在尝试制作一个可以录制音频并播放它们的Android应用程序。 为此,我做了三个按钮开始、停止和播放,但我的应用程序崩溃了 这是java代码

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private Button play, stop, record;
    private MediaRecorder myAudioRecorder;
    private String outputFile;

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

        play = (Button) findViewById(R.id.play);
        stop = (Button) findViewById(R.id.stop);
        record = (Button) findViewById(R.id.record);

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PackageManager.PERMISSION_GRANTED);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PackageManager.PERMISSION_GRANTED);


        stop.setEnabled(false);
        play.setEnabled(false);

        outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
        myAudioRecorder = new MediaRecorder();

        myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        myAudioRecorder.setOutputFile(outputFile);


        record.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    myAudioRecorder.prepare();
                    myAudioRecorder.start();
                } catch (IllegalStateException ise) {
                    Toast.makeText(getApplicationContext(), "ise", Toast.LENGTH_LONG).show();
                    ise.printStackTrace();
                } catch (IOException ioe) {
                    Toast.makeText(getApplicationContext(), "ioe", Toast.LENGTH_LONG).show();
                    ioe.printStackTrace();
                }
                record.setEnabled(false);
                stop.setEnabled(true);
                Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
            }
        });

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myAudioRecorder.stop();
                myAudioRecorder.release();
                myAudioRecorder = null;
                record.setEnabled(true);
                stop.setEnabled(false);
                play.setEnabled(true);
                Toast.makeText(getApplicationContext(), "Audio Recorder successfully", Toast.LENGTH_LONG).show();
            }
        });

        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mediaPlayer = new MediaPlayer();
                try {
                    mediaPlayer.setDataSource(outputFile);
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    Toast.makeText(getApplicationContext(), "Playing Audio", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }
}

崩溃的堆栈跟踪

java.lang.RuntimeException: setAudioSource failed.
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
                                                                                  at android.app.ActivityThread.-wrap11(Unknown Source:0)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                                  at android.os.Looper.loop(Looper.java:164)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                                                               Caused by: java.lang.RuntimeException: setAudioSource failed.
                                                                                  at android.media.MediaRecorder.setAudioSource(Native Method)
                                                                                  at com.arunjay.rtu.voiceofrtu.MainActivity.onCreate(MainActivity.java:42)
                                                                                  at android.app.Activity.performCreate(Activity.java:6975)
                                                                                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
                                                                                  at android.app.ActivityThread.-wrap11(Unknown Source:0) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:105) 
                                                                                  at android.os.Looper.loop(Looper.java:164) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6541) 
                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

最佳答案

第 1 步: 确保将此权限设置为 AndroidManifest.xml

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

第 2 步: 请求录制音频的许可:

if (ActivityCompat.checkSelfPermission(activity(), 
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {

ActivityCompat.requestPermissions(activity(), new String[]{Manifest.permission.RECORD_AUDIO},
      BuildDev.RECORD_AUDIO);

} else {
   startRecording();
}

关于android - 我是编程新手。我正在尝试制作 Android 应用程序 soundrecoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59054538/

相关文章:

android - 如果我不使用 MediaExtractor,在 Media Codec 中使用哪个 presentationTimeUs?

android - 如何在android中从字符串创建UUID

java - 用相机拍照并存储在内部而不是外部存储中

java - Android java.lang.AbstractMethodError on requestLocationUpdates

android - Recyclerview 给出错误膨胀类 android.support.v7.widget.RecyclerView

android - 为什么 Button 上的 maxWidth 不起作用以及如何解决它?

android - 为什么我在 Firebase 崩溃报告中看不到日志

android - Google billing 消耗品和非消耗品

java - Android 客户端/Java 服务器套接字; android发送但不接收?

安卓:java.net.SocketException:权限被拒绝