我在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();
}
}
现在可以看到动画录制了,但是我也无法在模拟器和手机上播放录制的内容。我可以做什么 ?我认为问题在于记录我的文件。
最佳答案
仅仅是因为不推荐使用Environment.getExternalStorageDirectory()。解决此问题的最简单方法是打开build.gradle(Module:app)并将compileSdkVersion和targetSdkVersion更改为28,这将无缝运行