任何人都可以提供录音机代码作为Android手机上的应用程序吗?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2801368/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 07:27:35  来源:igfitidea点击:

Can anyone give code for voice recorder as an application on android phone?

androidvoicerecorder

提问by gowtham

I want to develop an application on android phone regarding voice recorder. I have to record a sound for about 30 seconds and then stop and save the recorded sound in gallery. Can anyone post the code if you have please?

我想在安卓手机上开发一个关于录音机的应用程序。我必须录制大约 30 秒的声音,然后停止并将录制的声音保存在画廊中。如果你有请任何人可以发布代码吗?

回答by Dave Webb

There is an example of how to do audio capture using MediaRecorderin the Android Developer Documentation.

Android Developer Documentation 中一个如何使用音频捕获的示例MediaRecorder

I would recommend saving the files on the SD Card and then have your gallery code check the SD card to see which files to display. You can get the directory of the SD Card using the Environment.getExternalStorageDirectory()method. It would be best to save your files in a subdirectory of the SD Card root directory.

我建议将文件保存在 SD 卡上,然后让您的画廊代码检查 SD 卡以查看要显示哪些文件。您可以使用Environment.getExternalStorageDirectory()方法获取 SD 卡的目录。最好将文件保存在 SD 卡根目录的子目录中。

Make sure you give your applications the Permissions it will need. At the very least it will need RECORD_AUDIOand WRITE_EXTERNAL_STORAGE.

确保为应用程序提供所需的权限。至少它需要RECORD_AUDIOWRITE_EXTERNAL_STORAGE

回答by Steve

Output:

输出:

enter image description here

在此处输入图片说明

MainActivity.java:

主活动.java:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;

/**
 * This class shows how to run Sound Recorder activity
 * @author The Developer's Info
 */
public class Main extends Activity {
    private static final int REQUEST_CODE_RECORD = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button startRecording = (Button) findViewById(R.id.startBtn);
        startRecording.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent recordIntent = new Intent(
                        MediaStore.Audio.Media.RECORD_SOUND_ACTION);
                startActivityForResult(recordIntent, REQUEST_CODE_RECORD);

            }
        });
    }
}  

main.xml:

主文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/startBtn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/startBtnText" />

</LinearLayout>

回答by Rajith Rajan

If you want record the voice with clear clarity You should use the audio recorder...

如果您想录制清晰清晰的声音,您应该使用录音机...

The audio recorder implementation as follows..

录音机实现如下..

     public static int datacount=1;
     private static final int RECORDER_BPP = 16;
      private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
      private static final String AUDIO_RECORDER_FOLDER = "/'/'";
      private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
      private static final int RECORDER_SAMPLERATE = 44100;
      private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
      private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

      private AudioRecord recorder = null;
      private int bufferSize = 0;
      private Thread recordingThread = null;
      private boolean isRecording = false;
      int numCrossing,p;

      public int frequency;





      public static File myfile;

      private Context mcontext;



      public static String final_sound_path=null;

      Handler handler;



      public static  String filename;


      public Taukyrecorder(Context cntxt) {
        // TODO Auto-generated constructor stub
          mcontext=cntxt;
          handler=new Handler();

          wave=new Taukywave(mcontext);






            bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);

            recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
                    RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);



            recorder.setRecordPositionUpdateListener(new OnRecordPositionUpdateListener() {

                @Override
                public void onPeriodicNotification(AudioRecord recorder) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onMarkerReached(AudioRecord recorder) {
                    // TODO Auto-generated method stub

                }
            }, handler);



    }






    //Get the file for saving sound into the folder
      public File GetFileTOwriteSound()
        {
            File tempPicFile=null;
            String ext_storage_state=Environment.getExternalStorageState();
            File mediaStorage=new File(Environment.getExternalStorageDirectory()+"/TAUKY/SOUNDS");
            if(ext_storage_state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
            {
                if(!mediaStorage.exists())
                {
                    mediaStorage.mkdirs();
                }else
                {
                    //do nothing
                }

                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                .format(new Date());
                tempPicFile = new File(mediaStorage.getPath() + File.separator
                        + "SOUND_" + timeStamp + ".wav");

            myfile=tempPicFile;

            }
            else
            {

                Toast.makeText(mcontext, "NO SDCARD MOUNTED", 1).show();

            }
            return tempPicFile;
        }







      public String getTempFilename(){
        String filepath = Environment.getExternalStorageDirectory().getPath();
        File file = new File(filepath,AUDIO_RECORDER_FOLDER);

        if(!file.exists()){
          file.mkdirs();
        }

        File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);

        if(tempFile.exists())
          tempFile.delete();

        return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
      }

      public void startRecording(){


        recorder.startRecording();

        isRecording = true;



        recordingThread = new Thread(new Runnable() {

          @Override
          public void run() {
            writedataToFile();
          }
        },"AudioRecorder Thread");

        recordingThread.start();
      }

      private void writedataToFile(){
        final byte data[] = new byte[bufferSize];


        filename = getTempFilename();
        FileOutputStream os = null;



        try {
          os = new FileOutputStream(filename);
        } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }







        if(null != os){
          while(isRecording){
            read = recorder.read(data, 0, bufferSize);


            wave.Updatewave(data);


//          new Thread(new Runnable() {
//              
//              @Override
//              public void run() {
//                  // TODO Auto-generated method stub
//                  
//                  for (int i = 0; i < read; i++) {
//                      
//                      sum +=data [i] * data [i];
//                  }
//                  if (read> 0) {
//                      final double amplitude = sum / read;
//                      //pb.setProgress((int) Math.sqrt(amplitude));
//                      
//                      wave.Updatewave(amplitude);
//                  }
//              
//                      
//                  
//              }
//          }).start();

            Log.i("recorder", "Recording");


            if(AudioRecord.ERROR_INVALID_OPERATION != read){
              try {
                os.write(data);




                //
              } catch (IOException e) {
                e.printStackTrace();
              }



              numCrossing=0; //initialize your number of zero crossings to 0
              for (p=0;p<bufferSize/4;p+=4) {
                     if (data[p]>0 && data[p+1]<=0) numCrossing++;
                      if (data[p]<0 && data[p+1]>=0) numCrossing++;
                      if (data[p+1]>0 && data[p+2]<=0) numCrossing++;
                      if (data[p+1]<0 && data[p+2]>=0) numCrossing++;
                      if (data[p+2]>0 && data[p+3]<=0) numCrossing++;
                      if (data[p+2]<0 && data[p+3]>=0) numCrossing++;
                      if (data[p+3]>0 && data[p+4]<=0) numCrossing++;
                      if (data[p+3]<0 && data[p+4]>=0) numCrossing++;
                      }//for p

                for (p=(bufferSize/4)*4;p<bufferSize-1;p++) {
                      if (data[p]>0 && data[p+1]<=0) numCrossing++;
                      if (data[p]<0 && data[p+1]>=0) numCrossing++;
                      }



      frequency=(8000/bufferSize)*(numCrossing/2);  // Set the audio Frequency to half the number of zero crossings, times the number of samples our buffersize is per second.



      handler.post(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
             //view.setText("Frequency is"+frequency);

        }
    });

            }
          }

          try {
            os.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }

      public void stopRecording(){
          String getfilename=GetFileTOwriteSound().getAbsolutePath();
          final_sound_path=getfilename;
        if(null != recorder){
          isRecording = false;

          recorder.stop();
          recorder.release();

          recorder = null;
          recordingThread = null;
        }

        copyWaveFile(getTempFilename(),getfilename);
        deleteTempFile();
      }

      private void deleteTempFile() {
        File file = new File(getTempFilename());

        file.delete();
      }

      private void copyWaveFile(String inFilename,String outFilename){
        FileInputStream in = null;
        FileOutputStream out = null;
        long totalAudioLen = 0;
        long totalDataLen = totalAudioLen + 36;
        long longSampleRate = RECORDER_SAMPLERATE;
        int channels = 2;
        long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8;

        byte[] data = new byte[bufferSize];

        try {
          in = new FileInputStream(inFilename);
          out = new FileOutputStream(outFilename);
          totalAudioLen = in.getChannel().size();
          totalDataLen = totalAudioLen + 36;

          ///AppLog.logString("File size: " + totalDataLen);

          WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
              longSampleRate, channels, byteRate);

          while(in.read(data) != -1){
            out.write(data);
          }

          in.close();
          out.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }

      private void WriteWaveFileHeader(
          FileOutputStream out, long totalAudioLen,
          long totalDataLen, long longSampleRate, int channels,
          long byteRate) throws IOException {

        byte[] header = new byte[44];

        header[0] = 'R';  // RIFF/WAVE header
        header[1] = 'I';
        header[2] = 'F';
        header[3] = 'F';
        header[4] = (byte) (totalDataLen & 0xff);
        header[5] = (byte) ((totalDataLen >> 8) & 0xff);
        header[6] = (byte) ((totalDataLen >> 16) & 0xff);
        header[7] = (byte) ((totalDataLen >> 24) & 0xff);
        header[8] = 'W';
        header[9] = 'A';
        header[10] = 'V';
        header[11] = 'E';
        header[12] = 'f';  // 'fmt ' chunk
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        header[20] = 1;  // format = 1
        header[21] = 0;
        header[22] = (byte) channels;
        header[23] = 0;
        header[24] = (byte) (longSampleRate & 0xff);
        header[25] = (byte) ((longSampleRate >> 8) & 0xff);
        header[26] = (byte) ((longSampleRate >> 16) & 0xff);
        header[27] = (byte) ((longSampleRate >> 24) & 0xff);
        header[28] = (byte) (byteRate & 0xff);
        header[29] = (byte) ((byteRate >> 8) & 0xff);
        header[30] = (byte) ((byteRate >> 16) & 0xff);
        header[31] = (byte) ((byteRate >> 24) & 0xff);
        header[32] = (byte) (2 * 16 / 8);  // block align
        header[33] = 0;
        header[34] = RECORDER_BPP;  // bits per sample
        header[35] = 0;
        header[36] = 'd';
        header[37] = 'a';
        header[38] = 't';
        header[39] = 'a';
        header[40] = (byte) (totalAudioLen & 0xff);
        header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
        header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
        header[43] = (byte) ((totalAudioLen >> 24) & 0xff);

        out.write(header, 0, 44);
      }




}

回答by o0'.

So you want someone to actually post the whole code of the application youwant to code?

因此,您希望有人实际发布要编写的应用程序的整个代码吗?

Here it is, I guess.

在这里,我猜。

回答by uncaught_exceptions

You can write the actual recording code or you could leverage existing voice recorder application in your phone... Most phones have a default recorder app....

您可以编写实际的录音代码,也可以利用手机中现有的录音机应用程序...大多数手机都有一个默认的录音机应用程序....

Call startActivityForResult with corresponding action. The following is the code.

使用相应的操作调用 startActivityForResult。以下是代码。

Intent recordIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
                startActivityForResult(recordIntent, REQUEST_CODE_RECORD);