Android Activity 不会播放录音
Android Activity Will not Playback Recording
我正在尝试在一个 activity 中录制,然后在另一个 activity 中播放。如果它在同一个 activity 中,我这样做没有问题。当我拆分它时,我似乎根本无法解决它。一切都一样,只是拆分,所以我假设它找不到保存在 phone 上的文件的路径。请帮忙!!!
这是第一个 activity 录音发生的地方:
public class RecorderActivity2 extends Activity {
MediaRecorder recorder = null; //Recorder object used to record the audio tone
String path = null; //Stores the path of the media files that is been recorded
TextView title_text;
//How long the Recording lasts
int timer = 10000;
String log_tag = "Recorder1";
//DELAY AFTER THE RECORDING IS COMPLETED
int delay = 10000;
String file;
Context mContext;
Handler mHandler = new Handler();
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
* API's to launch the application when the tablet is locked or
* display is turned off
*/
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
setContentView(R.layout.activity_recorder);
//Check to see if the device has a microphone
PackageManager pm = getPackageManager();
boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE);
boolean playerPresent = pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
if (!micPresent){
Log.i(log_tag, "There is no microphone present in this device.");
exit_function();
}
else {
createTempFile("Status_Recorder.txt", "INPROGRESS");
/*
* Create the file where the audio tone that is recorded will be saved
*
*/
path = getApplicationContext().getFilesDir().getAbsolutePath() + "/audio_test.3gp";
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}
start_recording();
}
}
//Method to Start the Recording
private void start_recording() {
if (recorder != null) {
recorder.release();
}
//Setting for the Recorder
try{
Log.i(log_tag,"Setting the recorder");
// MediaRecorder.
recorder = new MediaRecorder();
recorder.reset();
//audioManager.setMicrophoneMute(false);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
} catch(Exception e){
Log.e(log_tag,"Recording Settings Failed");
createTempFile("Status.txt", "COMPLETED-RECORDER FAILED");
exit_function();
}
//Prepare the Recorder
try{
Log.i(log_tag,"Preparing the Recorder");
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");
recorder.start();
//The recording lasts as long as he timer and then stops
mHandler.postDelayed(new Runnable() {
public void run() {
if (recorder != null) {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
}
Log.e(log_tag,"First Delay");
exit_function();
}
}, 5000);
createTempFile("Status_Recorder.txt", "Complete");
//This Delay is between Recording and Playback
mHandler.postDelayed(new Runnable() {
public void run() {
}
}, 5000);
} catch (Exception e) {
Log.e(log_tag,"Recorder start failed");
createTempFile("Status.txt", "COMPLETED-RECORDER FAILED");
exit_function();
}
}
private void exit_function() {
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();
if (recorder != null) {
recorder.release();
}
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();
}
}
}
这是播放录音的第二个录音:
public class RecorderPlaybackActivity extends Activity {
int default_mode; //Saves the default mode of the device
int music_volume; //Saves the default volume of the music stream
int call_volume; //Saves the default volume of the in call stream
AudioManager audioManager = null; //Object to provide access to system volume controls and settings
MediaPlayer mPlayer = null; //Media object which has the playback control of audio and video files
String path = null; //Stores the path of the media files that is been recorded
TextView title_text;
//How long the Recording lasts
int timer = 10000;
String log_tag = "RecorderPlayback";
//DELAY AFTER THE RECORDING IS COMPLETED
String file;
final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;
Class audioSystemClass = null;
Method setForceUse = null;
int volume = 20;
Context mContext;
Handler mHandler = new Handler();
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
* API's to launch the application when the tablet is locked or
* display is turned off
*/
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
setContentView(R.layout.activity_recorder);
//Check to see if the device supports audio output
PackageManager pm = getPackageManager();
boolean playerPresent = pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
if (!playerPresent){
Log.i(log_tag, "There is no audio player present in this device.");
exit_function();
}
else {
createTempFile("Status_Recorder.txt", "INPROGRESS");
/*
* Create the file where the audio tone that is recorded will be saved
*
*/
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}
path = getApplicationContext().getFilesDir().getAbsolutePath() + "/audio_test.3gp";
audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
default_mode = audioManager.getMode();
music_volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
call_volume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
// //Setting the volume level
// audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI);
// audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,volume, AudioManager.FLAG_SHOW_UI);
//Setting the volume to max
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
try {
audioSystemClass = Class.forName("android.media.AudioSystem");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
start_playback();
}
}
public void start_playback() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
mPlayer = new MediaPlayer();
//Setting the playback path
try {
Log.i(log_tag, "setting the data source");
mPlayer.setDataSource(path); //The variable path contains the file path where the recorded tone was saved
} catch (Exception e) {
Log.e(log_tag, "exception while setting the data source");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
//Preparing the playback
try {
mPlayer.prepare();
} catch (Exception e) {
Log.e(log_tag, "prepare() failed");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
//Playing the recording
try {
Log.i(log_tag, "starting the audio playback # " + (count+1));
title_text.setText("PLAYING RECORDING #" + (count+1));
audioManager.setSpeakerphoneOn(true);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.start();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mPlayer) {
//Change this delay for break in between playback
mHandler.postDelayed(new Runnable() {
public void run() {
if (count <1){
count++;
start_playback();
}
else{
createTempFile("Status_Recorder.txt", "COMPLETED");
exit_function();
}
}
}, 0);
}
});
} catch (Exception e) {
Log.e(log_tag, "start failed");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
}
private void exit_function() {
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();
if (mPlayer != null) {
mPlayer.release();
}
//Reset to the default settings here
audioManager.setMode(default_mode);
try {
setForceUse.invoke(null, FOR_MEDIA, FORCE_NONE);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, music_volume, 0);
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, call_volume, 0);
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();
}
}
}
我终于弄清楚我做错了什么。我在两个活动的顶部都有以下行:
//Create the file that will be used to save the recording
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}
我正在尝试在一个 activity 中录制,然后在另一个 activity 中播放。如果它在同一个 activity 中,我这样做没有问题。当我拆分它时,我似乎根本无法解决它。一切都一样,只是拆分,所以我假设它找不到保存在 phone 上的文件的路径。请帮忙!!!
这是第一个 activity 录音发生的地方:
public class RecorderActivity2 extends Activity {
MediaRecorder recorder = null; //Recorder object used to record the audio tone
String path = null; //Stores the path of the media files that is been recorded
TextView title_text;
//How long the Recording lasts
int timer = 10000;
String log_tag = "Recorder1";
//DELAY AFTER THE RECORDING IS COMPLETED
int delay = 10000;
String file;
Context mContext;
Handler mHandler = new Handler();
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
* API's to launch the application when the tablet is locked or
* display is turned off
*/
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
setContentView(R.layout.activity_recorder);
//Check to see if the device has a microphone
PackageManager pm = getPackageManager();
boolean micPresent = pm.hasSystemFeature(PackageManager.FEATURE_MICROPHONE);
boolean playerPresent = pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
if (!micPresent){
Log.i(log_tag, "There is no microphone present in this device.");
exit_function();
}
else {
createTempFile("Status_Recorder.txt", "INPROGRESS");
/*
* Create the file where the audio tone that is recorded will be saved
*
*/
path = getApplicationContext().getFilesDir().getAbsolutePath() + "/audio_test.3gp";
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}
start_recording();
}
}
//Method to Start the Recording
private void start_recording() {
if (recorder != null) {
recorder.release();
}
//Setting for the Recorder
try{
Log.i(log_tag,"Setting the recorder");
// MediaRecorder.
recorder = new MediaRecorder();
recorder.reset();
//audioManager.setMicrophoneMute(false);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
} catch(Exception e){
Log.e(log_tag,"Recording Settings Failed");
createTempFile("Status.txt", "COMPLETED-RECORDER FAILED");
exit_function();
}
//Prepare the Recorder
try{
Log.i(log_tag,"Preparing the Recorder");
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");
recorder.start();
//The recording lasts as long as he timer and then stops
mHandler.postDelayed(new Runnable() {
public void run() {
if (recorder != null) {
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
}
Log.e(log_tag,"First Delay");
exit_function();
}
}, 5000);
createTempFile("Status_Recorder.txt", "Complete");
//This Delay is between Recording and Playback
mHandler.postDelayed(new Runnable() {
public void run() {
}
}, 5000);
} catch (Exception e) {
Log.e(log_tag,"Recorder start failed");
createTempFile("Status.txt", "COMPLETED-RECORDER FAILED");
exit_function();
}
}
private void exit_function() {
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();
if (recorder != null) {
recorder.release();
}
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();
}
}
}
这是播放录音的第二个录音:
public class RecorderPlaybackActivity extends Activity {
int default_mode; //Saves the default mode of the device
int music_volume; //Saves the default volume of the music stream
int call_volume; //Saves the default volume of the in call stream
AudioManager audioManager = null; //Object to provide access to system volume controls and settings
MediaPlayer mPlayer = null; //Media object which has the playback control of audio and video files
String path = null; //Stores the path of the media files that is been recorded
TextView title_text;
//How long the Recording lasts
int timer = 10000;
String log_tag = "RecorderPlayback";
//DELAY AFTER THE RECORDING IS COMPLETED
String file;
final static int FOR_MEDIA = 1;
final static int FORCE_NONE = 0;
final static int FORCE_SPEAKER = 1;
Class audioSystemClass = null;
Method setForceUse = null;
int volume = 20;
Context mContext;
Handler mHandler = new Handler();
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*
* API's to launch the application when the tablet is locked or
* display is turned off
*/
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
setContentView(R.layout.activity_recorder);
//Check to see if the device supports audio output
PackageManager pm = getPackageManager();
boolean playerPresent = pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT);
if (!playerPresent){
Log.i(log_tag, "There is no audio player present in this device.");
exit_function();
}
else {
createTempFile("Status_Recorder.txt", "INPROGRESS");
/*
* Create the file where the audio tone that is recorded will be saved
*
*/
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}
path = getApplicationContext().getFilesDir().getAbsolutePath() + "/audio_test.3gp";
audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
default_mode = audioManager.getMode();
music_volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
call_volume = audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
// //Setting the volume level
// audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, AudioManager.FLAG_SHOW_UI);
// audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,volume, AudioManager.FLAG_SHOW_UI);
//Setting the volume to max
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
try {
audioSystemClass = Class.forName("android.media.AudioSystem");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
start_playback();
}
}
public void start_playback() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
mPlayer = new MediaPlayer();
//Setting the playback path
try {
Log.i(log_tag, "setting the data source");
mPlayer.setDataSource(path); //The variable path contains the file path where the recorded tone was saved
} catch (Exception e) {
Log.e(log_tag, "exception while setting the data source");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
//Preparing the playback
try {
mPlayer.prepare();
} catch (Exception e) {
Log.e(log_tag, "prepare() failed");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
//Playing the recording
try {
Log.i(log_tag, "starting the audio playback # " + (count+1));
title_text.setText("PLAYING RECORDING #" + (count+1));
audioManager.setSpeakerphoneOn(true);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.start();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mPlayer) {
//Change this delay for break in between playback
mHandler.postDelayed(new Runnable() {
public void run() {
if (count <1){
count++;
start_playback();
}
else{
createTempFile("Status_Recorder.txt", "COMPLETED");
exit_function();
}
}
}, 0);
}
});
} catch (Exception e) {
Log.e(log_tag, "start failed");
createTempFile("Status.txt", "COMPLETED-PLAYER FAILED");
exit_function();
}
}
private void exit_function() {
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();
if (mPlayer != null) {
mPlayer.release();
}
//Reset to the default settings here
audioManager.setMode(default_mode);
try {
setForceUse.invoke(null, FOR_MEDIA, FORCE_NONE);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, music_volume, 0);
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, call_volume, 0);
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();
}
}
}
我终于弄清楚我做错了什么。我在两个活动的顶部都有以下行:
//Create the file that will be used to save the recording
try {
FileOutputStream fOut = openFileOutput("audio_test.3gp", MODE_WORLD_READABLE);
} catch (IOException e) {
e.printStackTrace();
Log.e(log_tag, "FAILED TO CREATE THE FILE OUTPUT STREAM");
exit_function();
}