0

在我的許多活動應用程序中,我試圖在一項活動中進行錄製並將其存儲在電話文件中。然後在另一個活動中,我想要播放該文件。我想我可能對如何保存原始文件存在問題,因爲它想要讀取文件時會在第二個活動中崩潰。我不知道如何保存一個活動,然後在下一個活動中讀取該音頻文件。我已經包含了我認爲是來自兩個活動的相關代碼。在一項活動中錄製和保存音頻並在另一項活動中播放音頻

//This is the Activity that simply records and then saves the audio file 

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Context mContext = getApplicationContext(); 
     createTempFile("Status_Recorder.txt", "INPROGRESS"); 

     /* 
      * Create the file where the audio tone that is recorded will be saved 
      * 
      */ 
     try{ 
      FileOutputStream fOut = openFileOutput("audio_test_right.3gp" , MODE_WORLD_READABLE); 

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

     path = mContext.getFilesDir()+"/audio_test_right.3gp"; 

     start_recording(); 
} 


    //Method to Start the Recording 
    private void start_recording() { 
     //Intialize the recorder 
     try{ 
     speaker_recorder = new MediaRecorder(); 
     speaker_recorder.reset(); 
     } catch(Exception e){ 
      Log.e(log_tag,"Recorder Initialization Failed"); 
      createTempFile("Status.txt", "COMPLETED-RECORDER FAILED"); 
     } 

     //Setting for the Recorder 
     try{ 
     Log.i(log_tag,"Setting the recorder"); 
     speaker_recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     speaker_recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     speaker_recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     speaker_recorder.setOutputFile(path); 
     } catch(Exception e){ 
      Log.e(log_tag,"Recording Settings Failed"); 
      createTempFile("Status.txt", "COMPLETED-RECORDER FAILED"); 
     } 
     //Prepare the Recorder 
     try{ 
      Log.i(log_tag,"Preparing the Recorder"); 
      speaker_recorder.prepare(); 
     } catch(Exception e){ 
      Log.e(log_tag,"Recording failed"); 
      createTempFile("Status.txt", "COMPLETED-RECORDER FAILED"); 
      exit_function(); 
     } 

     //Start the Recorder 
     try { 
      Log.i(log_tag,"Starting the recorder"); 
      title_text = ((TextView) findViewById(R.id.textView)); 
      title_text.setTextColor(Color.RED); 
      title_text.setText("RECORDING"); 
      speaker_recorder.start(); 
//   Thread.sleep(10000); 
      mHandler.postDelayed(new Runnable() { 
       public void run() { 
        createTempFile("Status_Recorder.txt", "COMPLETED-RECORDER FAILED"); 
        exit_function(); 
       } 
      }, timer); 

     } catch (Exception e) { 
      Log.e(log_tag,"Recorder start failed"); 
      createTempFile("Status.txt", "COMPLETED-RECORDER FAILED"); 
      exit_function(); 
     } 

} 

    private void exit_function() { 
     if (speaker_recorder != null) { 
      speaker_recorder.release(); 
     } 
     onDestroy(); 
    } 

    @Override 
    /* 
    * (non-Javadoc) 
    * @see android.app.Activity#onDestroy() 
    * Function invoked before we exit the application . Reset all the volume 
    * and stream values in this function 
    */ 
    protected void onDestroy() { 
     Log.i(log_tag,"Entered onDestroy()"); 
     super.onDestroy(); 
     this.finish(); 

    } 

    /* 
    * Function to create the a text file in the application directory context. This function 
    * takes the file name and the string that is to be written in it as the input. This function is invoked 
    * to create the Result.txt file. 
    */ 
    private void createTempFile(String filename, String text) { 

     try { 
      FileOutputStream fOut = openFileOutput(filename , MODE_WORLD_READABLE); 
      OutputStreamWriter osw = new OutputStreamWriter(fOut); 
      osw.write(text); 
      osw.flush(); 
      osw.close(); 

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

    } 

//這是第二個活動,但它到達mp.setDataSource(path)時崩潰;因爲我猜它不能找到路徑

private void playSound(boolean speakers) { 
     mContext = getApplicationContext(); 
//  audioManager.setMicrophoneMute(true); 
     path = mContext.getFilesDir() + "/audio_test_right.3gp"; 
     audioManager.setSpeakerphoneOn(true); 
     try { 
      mp.setDataSource(path); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (speakers) { 
      mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     } else { 
      mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

     } 
     mp.start(); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       createTempFile("Status_RightSpeaker.txt", "COMPLETED"); 
       exit_function(); 
      } 
     }); 
    } 


    } 

回答

0

好了,所以當true供應將開始我有一個工作代碼爲你的問題

這種方法記錄否則將停止記錄。因此,當與true開始提供給發揮聲音別的停止你可以這樣做你的第一個活動

private void startOrStopRecording(boolean record){ 
    if (record) { 
     // Record the audio 
     mMediaRecorder = new MediaRecorder(); 
     mMediaRecorder.reset(); 
     mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mMediaRecorder.setOutputFile(getFilesDir().getAbsolutePath() + "/audio_test.3gp"); 

     try { 
      mMediaRecorder.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     mMediaRecorder.start(); 
    }else{ 
     // Stop recording 
     if (mMediaRecorder != null){ 
      mMediaRecorder.stop(); 
      mMediaRecorder.release(); 
      mMediaRecorder = null; 
     } 
    } 
} 

這種方法。所以,你可以實現它在你的第二個活動

注意String mFile = getFilesDir().getAbsolutePath() + "/audio_test.3gp";

private void playOrStop(boolean play){ 
    mPlayer = new MediaPlayer(); 
    try{ 
     if (play){ 
      mPlayer.setDataSource(mFile); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     }else { 
      mPlayer.stop(); 
      mPlayer.release(); 
      mPlayer = null; 
     } 
    }catch (IOException e){ 
     Log.e("Mtali", e.getMessage()); 
    } 
} 

一定要添加的權限

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

BONUS

您可以使用ToggleButton

START STOP &錄製

JAVA

final ToggleButton recordButton = (ToggleButton) findViewById(R.id.record_button); 
recordButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     startOrStopRecording(isChecked); 
    } 
}); 

XML

<ToggleButton 
    android:id="@+id/record_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textOff="@string/start_playback_string" 
    android:textOn="@string/stop_playback_string"/> 

啓動和停止播放

JAVA

ToggleButton button = (ToggleButton) findViewById(R.id.play_button); 
button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     playOrStop(isChecked); 
    } 
}); 

XML

<ToggleButton 
     android:id="@+id/play_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dp" 
     android:textOff="@string/start_playback_string" 
     android:textOn="@string/stop_playback_string"/> 
+0

你是了不起的!我試圖通過這個Android的東西絆倒我,並且你一直在拯救我的生命。非常感謝!!!! – Toby