Пишу рекордер (MediaRecorder) и не могу разобраться: при отладке стоит один раз "упасть" приложению и приходится перезапускать телефон. Вроде release я правильно делаю...
Код: Выделить всё
public class RecorderNew extends Activity implements SurfaceHolder.Callback,
OnInfoListener, OnErrorListener,
OnClickListener, AnimationListener
{
private ImageButton recBtn = null;
private ImageButton stopBtn = null;
private ImageButton retakeBtn = null;
private VideoView videoView;
private Camera camera = null;
private SurfaceHolder holder = null;
private static final String TAG = "Recorder";
private MediaRecorder recorder = null;
private String outputFileName = Environment.getExternalStorageDirectory().getPath() +
"/CameraExample/test.mp4";
private int cameraId = 0;
private MediaPlayer musicPlayer;
private TextView countText;
private ImageView recordSign;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recorder_new);
recBtn = (ImageButton)findViewById(R.id.record_next);
recBtn.setOnClickListener(this);
countText = (TextView)findViewById(R.id.coundown_text);
stopBtn = (ImageButton)findViewById(R.id.record_done);
stopBtn.setOnClickListener(this);
retakeBtn = (ImageButton) findViewById(R.id.record_retake);
retakeBtn.setOnClickListener(this);
recordSign = (ImageView)findViewById(R.id.record_sign_new);
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.animate);
videoView = (VideoView)findViewById(R.id.videoView);
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
countText.setText(Long.toString((millisUntilFinished / 1000)));
}
public void onFinish() {
countText.setVisibility(View.GONE);
initRecorder();
beginRecording();
}
}.start();
musicPlayer = new MediaPlayer();
}
@Override
public void onAnimationEnd(Animation animation)
{
}
@Override
public void onAnimationRepeat(Animation animation)
{
}
@Override
public void onAnimationStart(Animation animation)
{
// TODO Auto-generated method stub
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.record_next:
initRecorder();
beginRecording();
break;
case R.id.record_done:
stopRecording();
recordSign.clearAnimation();
try {
postVideo();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.record_retake:
stopRecording();
initRecorder();
beginRecording();
break;
}
}
private void initRecorder()
{
if (recorder != null) return;
File outFile = new File(outputFileName);
if (outFile.exists())
{
outFile.delete();
}
try
{
camera.stopPreview();
camera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoSize(176, 144);
Method[] methods = recorder.getClass().getMethods();
for (Method method: methods){
try{
if(method.getName().equals("setAudioEncodingBitRate")){
method.invoke(recorder, 12200);
}
else if(method.getName().equals("setVideoEncodingBitRate")){
method.invoke(recorder, 800000);
}
else if(method.getName().equals("setAudioSamplingRate")){
method.invoke(recorder, 8000);
}
else if(method.getName().equals("setVideoFrameRate")){
method.invoke(recorder, 20);
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}
}
recorder.setVideoFrameRate(15);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setMaxDuration(7000); // 7 sec
recorder.setPreviewDisplay(holder.getSurface());
recorder.setOutputFile(outputFileName);
recorder.prepare();
Log.v(TAG, "MR initialized");
} catch (IOException e)
{
Log.v(TAG, "MR failed to initialized");
e.printStackTrace();
}
}
private void beginRecording()
{
recorder.setOnInfoListener(this);
recorder.setOnErrorListener(this);
recorder.start();
recBtn.setEnabled(false);
stopBtn.setEnabled(true);
}
private void stopRecording()
{
if (recorder != null)
{
recorder.setOnErrorListener(null);
recorder.setOnInfoListener(null);
try {
recorder.stop();
} catch (IllegalStateException e)
{
Log.e(TAG, "GOT ILLEgalSE in STOPRECORDING");
}
releaseRecorder();
releaseCamera();
}
}
private void releaseCamera()
{
if (camera != null)
{
try
{
camera.reconnect();
} catch (IOException e)
{
e.printStackTrace();
}
camera.release();
camera = null;
}
}
private void releaseRecorder()
{
if (recorder != null)
{
recorder.release();
recorder = null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_record, menu);
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
Log.v(TAG, "in surfaceCreated");
try
{
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e)
{
Log.v(TAG, "Could not start the preview");
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
void postVideo() throws ClientProtocolException, IOException
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(postURL);
File file = new File(outputFileName);
FileBody filebodyVideo = new FileBody(new File(outputFileName));
//StringBody title = new StringBody("Filename: " + outputFileName);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("video", filebodyVideo);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute( httppost );
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200)
{
Toast.makeText(getApplicationContext(), "Ok", Toast.LENGTH_LONG).show();
httpclient.getConnectionManager( ).shutdown( );
} else
{
Toast.makeText(getApplicationContext(), "NO", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onResume()
{
Log.v(TAG, "in onResume");
super.onResume();
if (!initCamera())
{
finish();
}
}
private boolean initCamera()
{
try {
Camera.CameraInfo info=new Camera.CameraInfo();
for (int i=0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
camera=Camera.open(i);
cameraId = i;
}
}
//camera = Camera.open();
Camera.Parameters camParams = camera.getParameters();
//camParams.set( "cam_mode", 1 );
//camera.setParameters( camParams );
camera.setDisplayOrientation(90);
camera.lock();
holder = videoView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
} catch (RuntimeException re)
{
Log.v(TAG, "Could not initialize the Camera");
re.printStackTrace();
return false;
}
return true;
}
@Override
public void onError(MediaRecorder mr, int what, int extra) {
// TODO Auto-generated method stub
}
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
// TODO Auto-generated method stub
}