Проблема с camera.release

Ответить
Slampy
Сообщения: 18
Зарегистрирован: 25 сен 2012, 17:16

Проблема с camera.release

Сообщение Slampy » 09 окт 2012, 18:19

Доброго времени суток.
Пишу рекордер (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
		
	}
	

Ответить