package com.example.rotorm; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import com.example.rotorm.R; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; import android.widget.Toast; public class MainActivity extends Activity implements Callback { @Override protected void onDestroy() { stopRecording(); super.onDestroy(); } private SurfaceHolder surfaceHolder; private SurfaceView surfaceView; public MediaRecorder mrec = new MediaRecorder(); private Camera mCamera; private Uri uriSound; MediaPlayer mp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); uriSound=Uri.parse(""); Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 10); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "Start"); //menu.add(0, 0, 0, "Pick audio track"); return super.onCreateOptionsMenu(menu); // Inflate the menu; this adds items to the action bar if it is present. //getMenuInflater().inflate(R.menu.main, menu); //return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getTitle().equals("Start")) { try { startRecording(); item.setTitle("Stop"); } catch (Exception e) { String message = e.getMessage(); Log.i(null, "Problem " + message); mrec.release(); } } else if(item.getTitle().equals("Stop")) { mrec.stop(); mrec.release(); mrec = null; item.setTitle("Start"); mp.stop(); } else if(item.getTitle().equals("Pick audio track")) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 10); } return super.onOptionsItemSelected(item); } protected void startPreview() throws IOException { //http://stackoverflow.com/questions/12098298/android-camera-app-passed-null-surface //http://developer.android.com/training/camera/cameradirect.html if (mCamera!=null){ Log.e("Rotor", "Nulling camera"); mCamera.stopPreview(); mCamera.setPreviewCallback(null); mCamera.release(); mCamera=null; } if(mCamera == null){ mCamera = Camera.open(); Log.e("Rotor", "Setting up camera"); /* Camera.Parameters parameters = mCamera.getParameters(); //get a list of supported preview sizes and assign one List previewSizes = parameters.getSupportedPreviewSizes(); Camera.Size previewSize = previewSizes.get(0); parameters.setPreviewSize(previewSize.width, previewSize.height); //Set Frame rate parameters.setPreviewFrameRate(25); //Set Scene List modes = parameters.getSupportedSceneModes(); parameters.setSceneMode(modes.get(0)); //Set focus mode List focus = parameters.getSupportedFocusModes(); parameters.setFocusMode(focus.get(0)); */ Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(1280,720); parameters.setPreviewFrameRate(25); parameters.setSceneMode(Camera.Parameters.SCENE_MODE_SPORTS); parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); parameters.setColorEffect(Camera.Parameters.EFFECT_NONE); mCamera.setParameters(parameters); //Apply parameters to camera object mCamera.setParameters(parameters); Log.e("Rotor", "Camera configured"); } if(mCamera==null) mCamera = Camera.open(); setContentView(R.layout.main); surfaceView = (SurfaceView) findViewById(R.id.surface_camera); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mCamera.lock(); mCamera.unlock(); ////crashes on nexus 10 //09-07 15:36:21.850: E/AndroidRuntime(5418): java.lang.RuntimeException: getParameters failed (empty parameters) //Start the preview Log.e("Rotor", "Starting preview"); //mCamera.setPreviewCallback(new cam_PreviewCallback()); mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); } protected void startRecording() throws IOException { if(mCamera==null) mCamera = Camera.open(); String filename; String path; path= Environment.getExternalStorageDirectory().getAbsolutePath().toString(); Date date=new Date(); filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4"; Log.i(null, "Saving video file: " + filename); //create empty file it must use File file=new File(path,filename); mrec = new MediaRecorder(); mCamera.lock(); mCamera.unlock(); // Please maintain sequence of following code. // If you change sequence it will not work. mrec.setCamera(mCamera); mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA); //mrec.setAudioSource(MediaRecorder.AudioSource.MIC); mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); //mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mrec.setPreviewDisplay(surfaceHolder.getSurface()); mrec.setOutputFile(path+filename); mrec.prepare(); mrec.start(); Log.i(null, "Audio file: " + uriSound); //try { //MediaPlayer mp = new MediaPlayer(); //MediaPlayer mp = MediaPlayer.create(this, R.raw.stick); mp = MediaPlayer.create(this, uriSound); //mp.setDataSource(this, uriSound); mp.start(); ///} catch (IllegalArgumentException e) { // TODO Auto-generated catch block // e.printStackTrace(); //} catch (SecurityException e) { // TODO Auto-generated catch block // e.printStackTrace(); //} catch (IllegalStateException e) { // TODO Auto-generated catch block // e.printStackTrace(); //} catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); //} } protected void stopRecording() { if(mrec!=null) { mrec.stop(); mrec.release(); mCamera.release(); mCamera.lock(); } mp.stop(); } private void releaseMediaRecorder() { if (mrec != null) { mrec.reset(); // clear recorder configuration mrec.release(); // release the recorder object } } private void releaseCamera() { if (mCamera != null) { mCamera.release(); // release the camera for other applications mCamera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { } @Override public void surfaceCreated(SurfaceHolder holder) { if (mCamera != null) { Parameters params = mCamera.getParameters(); mCamera.setParameters(params); Log.i("Surface", "Created"); } else { Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show(); finish(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); //http://stackoverflow.com/questions/13235306/method-called-after-release-exception-camera-preview //mCamera=null; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //if(requestCode == RESULT_OK && requestCode == 10){ uriSound=data.getData(); Log.i("Sound file",uriSound.toString()); //String temp="audioFileName"; //this.getIntent().getStringExtra(temp); //uriSound=Uri.parse(temp); //uriSound=Uri.parse("/Music/stick.mp3"); try { startPreview(); } catch (IOException e) { Log.e("Preview","Error"); e.printStackTrace(); } //} } }