Запись видео с камеры через версию Android 2.2

1

enter code here Когда я пытаюсь записывать видео с камеры на версию Android 2.2. У него есть некоторые ошибки. Никто не может найти решение. Там есть ошибка Android MediaRecorder API. Как я могу это решить. У меня появилось больше ошибок. Вы можете видеть некоторые из них на картинке. И такая ошибка: Предварительный просмотр камеры -13 Большое спасибо.

http://i.stack.imgur.com/72lp7.png recorder.prepare() терпит неудачу и бросает Java.lang.illegalexeption Вот код:

package app.raceway.com;

import java.io.File;
import java.io.IOException;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

public class VideoCapture extends Activity implements  SurfaceHolder.Callback {
    MediaRecorder recorder;
    SurfaceHolder holder;
    public Camera camera;
    File video;
    String filePath;
    boolean recording = false;
      private static final int FRAME_RATE = 15;

      private static final int CIF_WIDTH = 320;

      private static final int CIF_HEIGHT = 240;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


    recorder = new MediaRecorder();

    setContentView(R.layout.main);

    SurfaceView cameraView = (SurfaceView) findViewById(R.id.cameraView);
    holder = cameraView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    String path=Environment.getExternalStorageDirectory().getAbsolutePath()+
    "/video/videocapture_example.mpg4";
    // make sure the directory we plan to store the recording in exists
    File sampleDir = Environment.getExternalStorageDirectory();
    try { 
        video = new File(sampleDir+"/videofile.3gp");
        sampleDir.createNewFile();
          //video = File.createTempFile("videofile", ".3gp", sampleDir);
      } 
      catch (IOException e)
      {
          Log.e("deneme","sdcard access error");

      }
      filePath=video.getAbsolutePath();

}

private void initRecorder() {

    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

}
private void prepareRecorder() throws IOException{
    recorder.setCamera(camera);
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
    recorder.setOutputFile(filePath);
    recorder.setMaxDuration(50000); // 50 seconds
    recorder.setMaxFileSize(5000000); // Approximately 5 megabytes
try {

} catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}


}



public void onclickSaveVideo(View v) throws IOException {
    if (recording) {
    Toast t=new Toast(getApplicationContext());
    t.makeText(getApplicationContext(), "Video Recording stopped",Toast.LENGTH_SHORT);
    t.show();
        recorder.stop();
        recording = false;

        // Let initRecorder so we can record again
        initRecorder();     
    } else {
        try {
            prepareRecorder();
            //recorder.prepare();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        recording = true;
        recorder.prepare();
        recorder.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        recorder.stop();
        Toast t=new Toast(getApplicationContext());
        t.makeText(getApplicationContext(), "Video Recording started",Toast.LENGTH_SHORT);
        t.show();
    }
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    camera=Camera.open();

    try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    camera.startPreview();
    camera.unlock();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (recording) {
        recorder.stop();
        recording = false;
    }
    recorder.release();
    finish();
    camera.release();
}


}
  • 1
    Правило № 1 - Почтовый индекс!
  • 0
    Я добавил код. Пожалуйста, помогите мне найти решение. Я пытался сделать это в течение 10 дней.
Теги:
video
video-capture

1 ответ

0
Лучший ответ

Emin,

Основываясь на изображении вывода logcat, вы указываете, что авария происходит с помощью метода start(). В документации по методу start вы увидите, что prepare() нужно вызвать сначала, иначе он выкинет IllegalStateException. В вашем коде все вызовы prepare() закомментированы?

РЕДАКТИРОВАТЬ: Мы отсортировали вещи в комментариях ниже моего ответа. Он запускал этот код на эмуляторе, а MediaRecorder не поддерживался эмулятором.

  • 0
    Willytate, я попробовал это отчаянно, но когда я попытался решить, я отметил это как комментарий. Когда я раскомментирую рекордер .prepare (). есть ошибка: ** java.io.IOException: подготовка не удалась. **
  • 0
    ааа. Просто дважды проверьте, что вы не пытаетесь сделать это на эмуляторе правильно?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню