Android Studio - 音频记录问题--Java新手。

问题描述 投票:0回答:1

我有一个问题与我的音频录音机,我从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个回答
0
投票

很简单,因为Environment.getExternalStorageDirectory()已经废弃了。最简单的解决方法是打开build.gradle(Module: app),把compileSdkVersion和targetSdkVersion改成28,这样就可以无缝运行了。

© www.soinside.com 2019 - 2024. All rights reserved.