我在Android应用程序中使用视频录制。它在Android2.2
和Android2.3
设备中正常工作,但应用程序在Android4.0
中崩溃。
这是我的代码:
class VideoPreview extends SurfaceView implements SurfaceHolder.Callback
{
MediaRecorder recorder;
SurfaceHolder holder = null;
FileOutputStream fileout;
public VideoPreview(Context context,MediaRecorder temprecorder) {
super(context);
recorder= temprecorder;
holder= getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder){
}
public void surfaceDestroyed(SurfaceHolder holder)
{
if(recorder!=null)
{
recorder.release();
Log.d("Video Preview", "Exception1");
recorder = null;
}
}
//surfaceChanged : This method is called after the surface is created.
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
}
public void stop(){
if(recorder!=null)
{
recorder.release();
recorder = null;
}
}
@Override
public boolean onKeyDown (int keyCode, KeyEvent event){
return false;
}
public boolean start() {
String state = android.os.Environment.getExternalStorageState();
String path = Environment.getExternalStorageDirectory().getAbsolutePath() +"/myvideo.mp4";
File fname = new File(path);
if (!state.equals(Environment.MEDIA_MOUNTED)) return false;
File directory = new File(path).getParentFile();
if(!directory.exists() && !directory.mkdirs()) return false;
if (recorder == null)
recorder = new MediaRecorder();
int out_format = MediaRecorder.OutputFormat.MPEG_4;
//THREE_GPP;
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(out_format);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
//recorder.setMaxDuration(20000);
//recorder.setVideoSize(352,288); // 352, 288 m_recorder.setVideoSize(320, 240); 176,144
recorder.setVideoFrameRate(15);
recorder.setOutputFile(fname.getPath());
/* videoview = (VideoView) findViewById(R.id.videosurface);
SurfaceHolder holder = videoview.getHolder();
mediarecorder.setPreviewDisplay(holder.getSurface());*/
recorder.setPreviewDisplay(holder.getSurface());
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!Recorder_Prepare())
return false;
else
return true;
}
private boolean Recorder_Prepare()
{
try {
if (recorder != null){
recorder.prepare();
Log.d("Video Preview", "Exception2");
recorder.start();
Log.d("Video Preview", "Exception3");
}
}
catch (IllegalStateException e) {
return false;
}
catch (IOException e) {
return false;
}
return true;
}
}
这是我的
logcat
在recorder.start();
处引发异常,如下所示: 06-11 13:54:54.926: E/MediaRecorder(22582): start failed: -19
06-11 13:54:54.961: E/AndroidRuntime(22582): FATAL EXCEPTION: Thread-2201
06-11 13:54:54.961: E/AndroidRuntime(22582): java.lang.RuntimeException: start failed.
06-11 13:54:54.961: E/AndroidRuntime(22582): at android.media.MediaRecorder.start(Native Method)
06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.VideoPreview.Recorder_Prepare(VideoPreview.java:106)
06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.VideoPreview.start(VideoPreview.java:94)
06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.videoRecord$1.run(videoRecord.java:94)
06-11 13:54:54.961: E/AndroidRuntime(22582): at java.lang.Thread.run(Thread.java:856)
我在Samsung Nexus S中验证了该应用程序,但它没有
SDCard
支持。我用谷歌搜索了4小时,但找不到解决方案。上面的程序中有不推荐使用的方法吗?请帮助我解决问题。 最佳答案
Android 4.0引入了新的运行时检查,以确保您不会像访问主线程上的网络那样做傻事。
您是否在做一些愚蠢的事情,例如访问主线程上的网络?您的媒体是否正在通过网络流式传输,您从哪里调用VideoPreview.start()
方法?