【问题标题】:Can anyone give code for voice recorder as an application on android phone? [closed]任何人都可以将录音机的代码作为Android手机上的应用程序提供吗? [关闭]
【发布时间】:2010-05-10 08:47:05
【问题描述】:

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

【问题讨论】:

    标签: android voice recorder


    【解决方案1】:

    an example of how to do audio capture using MediaRecorder in the Android Developer Documentation

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

    确保您give your applications the Permissions it will need。至少它需要RECORD_AUDIOWRITE_EXTERNAL_STORAGE

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      输出:

      MainActivity.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);
      
                  }
              });
          }
      }  
      

      ma​​in.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>
      

      【讨论】:

        【解决方案4】:

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

        录音机实现如下..

             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);
              }
        
        
        
        
        }
        

        【讨论】:

          【解决方案5】:

          所以您希望有人实际发布应用程序的全部代码想要编码?

          Here it is,我猜。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              猜你喜欢
              • 2010-10-31
              • 1970-01-01
              • 2021-10-18
              • 1970-01-01
              • 2022-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-06
              相关资源
              最近更新 更多