【问题标题】:Android Studio - audio record problem - newbie in JavaAndroid Studio - 录音问题 - Java 新手
【发布时间】:2020-09-11 08:27:06
【问题描述】:

我的录音机有问题,我从 youtube 教程制作了应用程序,但是当我尝试播放我的文件时,我总是看到“文件不存在”。我的代码有什么问题以及如何保存我的音频文件并运行它。

这是我的 MainActivity:

package pl.wsiz.voicemoduler;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.Toast;

import java.io.*;

public class MainActivity extends AppCompatActivity  {

    File file = new File(Environment.getExternalStorageDirectory(),"test.pcm");

    public static Boolean recording;
    private Spinner spFrequency;
    ImageView imageView1,playBack,startRec;
    ArrayAdapter<String> adapter;

    AudioTrack audioTrack;

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


        String[] arrayOfStrings = new String[8];
        arrayOfStrings[0]="Ghost";
        arrayOfStrings[1]="Slow Motion";
        arrayOfStrings[2]="Robot";
        arrayOfStrings[3]="Normal";
        arrayOfStrings[4]="Chimpunk";
        arrayOfStrings[5]="Funny";
        arrayOfStrings[6]="Bee";
        arrayOfStrings[7]="Elephant";


        startRec = (ImageView)findViewById(R.id.startrec);
        imageView1 = (ImageView)findViewById(R.id.imageViewMic);
        playBack = (ImageView)findViewById(R.id.playback);
        spFrequency = (Spinner)findViewById(R.id.frequency);



        startRec.setOnClickListener(new View.OnClickListener(){
          @Override
          public void onClick(View v){
              Intent intent = new Intent (MainActivity.this,RecordingDialog.class);
              startActivity(intent);

              new Thread(new Runnable() {
                  @Override
                  public void run() {
                    recording = true;
                   try {
                       startRecord();
                   } catch (IOException e){
                       e.printStackTrace();
                   }
                  }
              }).start();
          }
        });

        playBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(file.exists())
                {
                    try {
                        playRecord();
                    } catch (IOException e){
                        e.printStackTrace();
                    }

                }
                else
                {
                    Toast.makeText(MainActivity.this,
                            "File not exist", Toast.LENGTH_LONG).show();
                }

            }
        });

        adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arrayOfStrings);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spFrequency.setAdapter(adapter);
        imageView1.setVisibility(View.VISIBLE);
    }

    private void playRecord() throws IOException {
            int i=0;

            String str = (String)spFrequency.getSelectedItem();

            int shortSizeInBytes = Short.SIZE / Byte.SIZE;

            int bufferSizeInBytes = (int) (file.length() / shortSizeInBytes);
            short[] audioData = new short[bufferSizeInBytes];

        InputStream inputStream = new FileInputStream(file);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

        int j=0;

        while(dataInputStream.available() > 0 )
        {
            audioData[j] = dataInputStream.readShort();
            j++;
        }

        dataInputStream.close();
        if(str.equals("Ghost"))
        {
            i= 5000;
        }
        if(str.equals("Slow Motion"))
        {
            i= 6050;
        }
        if(str.equals("Robot"))
        {
            i= 8500;
        }
        if(str.equals("Normal"))
        {
            i= 11025;
        }
        if(str.equals("Chimpunk"))
        {
            i= 16000;
        }
        if(str.equals("Funny"))
        {
            i= 22050;
        }
        if(str.equals("Bee"))
        {
            i= 41000;
        }
        if(str.equals("Elephant"))
        {
            i= 30000;
        }

        audioTrack = new AudioTrack(3,i,2,2,bufferSizeInBytes,1);

        audioTrack.play();
        audioTrack.write(audioData,0,bufferSizeInBytes);



    }

    private void startRecord() throws IOException {
 File myfile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"test.pcm");

// myfile.getParentFile().mkdirs();
 myfile.createNewFile();

        OutputStream outputStream = new FileOutputStream(myfile);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

        DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);

        int minBufferSize = AudioRecord.getMinBufferSize(11025,2,2);

        short[] audioData = new short[minBufferSize];

        AudioRecord audioRecord = new AudioRecord(1,11025,2,2,minBufferSize);

        audioRecord.startRecording();

        while(recording)
        {
            int numberOfShort = audioRecord.read(audioData,0,minBufferSize);
            for(int i=0;i<numberOfShort;i++)
            {
                dataOutputStream.writeShort(audioData[i]);
            }
        }

        if(!recording.booleanValue())
        {
            audioRecord.stop();
            dataOutputStream.close();
        }


    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        recording = false;
    if(audioTrack!=null)
    {
        audioTrack.release();
    }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }
}

现在可以看到动画录制,但我也无法在模拟器和手机上播放我的录制。我可以做什么 ?我认为问题在于记录我的文件。

【问题讨论】:

    标签: java android voice


    【解决方案1】:

    仅仅是因为 Environment.getExternalStorageDirectory() 已被弃用。解决这个问题的最简单方法是打开 build.gradle(Module: app) 并将 compileSdkVersion 和 targetSdkVersion 更改为 28,这样可以无缝运行

    【讨论】:

    • 尝试从设备上卸载应用并重新安装
    • 也许有人认为视图有问题?但我没有错误,我认为问题在于录制音频
    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2021-12-26
    • 2010-09-15
    相关资源
    最近更新 更多