我正在开发一个 android 应用程序,它可以使用按钮简单地开始和停止录制。 我用线程。我创建了三个类..一个开始录制..一个停止录制和主类..
问题是我可以在我的手机中看到该文件,但它是空的,手机给我一条消息“无法播放视频”..我希望它与线程一起工作..我不想要其他方法。 .
这是我的代码 主类:
public class MediaRecorderSampleActivity extends Activity {
Button start;
Button stop ;
private MediaRecorder recorder ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button)findViewById(R.id.startbtn);
stop = (Button)findViewById(R.id.stopbtn);
start.setOnClickListener(new btnClick());
stop.setOnClickListener(new StopbtnClick());
}
class btnClick implements View.OnClickListener {
public void onClick(View arg0) {
Log.i("Media", "Start Clicked...");
Thread startThread = new Thread ( new startRe (recorder));
Log.i("Media", "start Thread Created");
startThread.start() ;
Log.i("Media", "start Recording");
}
}
class StopbtnClick implements View.OnClickListener {
public void onClick(View arg0) {
Log.i("Media", "Stop Clicked...");
// TODO Auto-generated method stub
Thread stopThread = new Thread ( new stopRecording (recorder));
Log.i("Media", "stop Thread Created");
stopThread.start();
Log.i("Media", "stop Recording");
}
}
}
开始录音类
public class startRe implements Runnable {
private MediaRecorder recorder;
startRe( MediaRecorder r ) {
Log.i("Media", "start cons");
this.recorder = r ;
}
public void run() {
// TODO Auto-generated method stub
Log.i("Media", "IN RUN start Recording");
startRecording();
}
public void startRecording() {
Log.i("Media", "IN Method start Recording");
recorder = new MediaRecorder();
Log.i("Media", "create variable");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Log.i("Media", "1");
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
Log.i("Media", "2");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Log.i("Media", "3");
recorder.setOutputFile(getFilePath());
try{
Log.i("Media", "prepar");
recorder.prepare();
Log.i("Media", "before");
recorder.start();
Log.i("Media", "after");
}catch (Exception e){
e.printStackTrace();
}
}
private String getFilePath() {
String filePath = Environment.getExternalStorageDirectory().getPath();
File file = new File(filePath, "MediaRecorderSample");
if(!file.exists())
file.mkdirs();
return (file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".mp4" );
}
}
停止类
public class stopRecording implements Runnable {
private MediaRecorder recorder ;
public stopRecording(MediaRecorder recorder2) {
Log.i("Media", "Stop in Cos");
// TODO Auto-generated constructor stub
try {
this.recorder = recorder2 ; }
catch ( Exception e )
{
Log.i("Media", "Stop out Cos" + e.getMessage()) ;
}
}
public void run() {
Log.i("Media", "Stop in RUN");
stopRecording();
Log.i("Media", "Stop out of RUN");
}
最佳答案
MediaRecorder
对象的使用方式存在问题。您需要在 Activity 类中创建对象,然后将对象传递给两个 Runnable
..
因此您需要进行以下更改:
在Activity类中创建对象如下代码:
private MediaRecorder recorder ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button)findViewById(R.id.startbtn);
stop = (Button)findViewById(R.id.stopbtn);
start.setOnClickListener(new btnClick());
stop.setOnClickListener(new StopbtnClick());
// Create the object in Activity so that both Runnable works on the same object...
recorder = new MediaRecorder();
}
将同一个对象传递给两个 Runnable
类,就像您已经在做的那样。
不要在 startRecording()
方法中创建对象,因为它会创建一个本地对象并将其分配给一个不能从 stopRecording
访问的本地变量> 可运行
..
public void startRecording() {
Log.i("Media", "IN Method start Recording");
// comment this recorder = new MediaRecorder();
Log.i("Media", "create variable");
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
Log.i("Media", "1");
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
Log.i("Media", "2");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Log.i("Media", "3");
recorder.setOutputFile(getFilePath());
try{
Log.i("Media", "prepar");
recorder.prepare();
Log.i("Media", "before");
recorder.start();
Log.i("Media", "after");
}catch (Exception e){
e.printStackTrace();
}
}
试着让我们知道结果...
关于使用线程的 Android 媒体录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14118624/