Ciao a tutti ragazzi è un pochino di tempo che sto impazzendo per creare una classe che riesca a fare partire la registrazione video in automatico e sopratutto in background.
Avrò letto 2000 pagine di tutti i tipi e fatto altrettante ricerche e alla fine sono riuscito a creare una piccola classe che però mi da un errore.
Non riesco a capire cosa c'è che non va, spero che mi possiate dare una mano, vi posto il codice:
Questa è la classe che fa la registrazione video:
codice:import java.io.IOException; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.hardware.Camera; import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.IBinder; import android.view.Gravity; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.Toast; public class CameraService extends Service implements SurfaceHolder.Callback { public WindowManager windowManager; public SurfaceView surfaceView; public Camera camera = null; public MediaRecorder mediaRecorder = null; @Override public int onStartCommand(Intent intent, int flags, int startId){ windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); surfaceView = new SurfaceView(getApplicationContext()); LayoutParams layoutParams = new WindowManager.LayoutParams( 1, 1, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT ); layoutParams.gravity = Gravity.LEFT | Gravity.TOP; windowManager.addView(surfaceView, layoutParams); surfaceView.getHolder().addCallback(this); return START_STICKY; } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub if(camera == null){ try { camera = camera.open(); camera.setPreviewDisplay(holder); camera.startPreview(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } startRecording(holder); } public void startRecording(SurfaceHolder surfaceHolder){ mediaRecorder = new MediaRecorder(); mediaRecorder.setCamera(camera); //1° mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); //2° mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); //3° mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); //4° mediaRecorder.setOutputFile("/sdcard/video.mp4"); //5° mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); //6° //TUTTI GLI STEP PER AL GESTIONE DELLA TELECAMERA SONO STATI FATTI try{ mediaRecorder.prepare(); }catch(IOException e){ Toast.makeText(getApplicationContext(), "Prepare cam failed!", 1).show(); } mediaRecorder.start(); } @Override public void onDestroy(){ mediaRecorder.stop(); mediaRecorder.reset(); mediaRecorder.release(); camera.release(); windowManager.removeView(surfaceView); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
Questo è il main:
codice:import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { Button startRecording; Button stopRecording; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startRecording = (Button)findViewById(R.id.buttonStartRecording); stopRecording = (Button)findViewById(R.id.buttonStopRecording); } @Override public boolean onCreateOptionsMenu(Menu 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) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } public void startRecording(View v){ startService(new Intent(this, CameraService.class)); Toast.makeText(getApplicationContext(), "Recording started!", 2).show(); } public void stopRecording(View v){ stopService(new Intent(this, CameraService.class)); Toast.makeText(getApplicationContext(), "Recording stopped!", 2).show(); } }
Questo è il Manifest:
codice:<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.testcameraservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:enabled="true" android:name=".CameraService"> </service> </application> </manifest>
e questo è l'errore che mi genera:
codice:03-01 20:41:06.996: E/AndroidRuntime(7781): FATAL EXCEPTION: main 03-01 20:41:06.996: E/AndroidRuntime(7781): java.lang.RuntimeException: start failed. 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.media.MediaRecorder.start(Native Method) 03-01 20:41:06.996: E/AndroidRuntime(7781): at com.example.testcameraservice.CameraService.startRecording(CameraService.java:77) 03-01 20:41:06.996: E/AndroidRuntime(7781): at com.example.testcameraservice.CameraService.surfaceCreated(CameraService.java:59) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.SurfaceView.updateWindow(SurfaceView.java:591) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.SurfaceView.access$000(SurfaceView.java:81) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:173) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:707) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1944) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1113) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4481) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.Choreographer.doFrame(Choreographer.java:525) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.os.Handler.handleCallback(Handler.java:615) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.os.Handler.dispatchMessage(Handler.java:92) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.os.Looper.loop(Looper.java:137) 03-01 20:41:06.996: E/AndroidRuntime(7781): at android.app.ActivityThread.main(ActivityThread.java:4867) 03-01 20:41:06.996: E/AndroidRuntime(7781): at java.lang.reflect.Method.invokeNative(Native Method) 03-01 20:41:06.996: E/AndroidRuntime(7781): at java.lang.reflect.Method.invoke(Method.java:511) 03-01 20:41:06.996: E/AndroidRuntime(7781): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 03-01 20:41:06.996: E/AndroidRuntime(7781): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 03-01 20:41:06.996: E/AndroidRuntime(7781): at dalvik.system.NativeStart.main(Native Method)
Vi ringrazio sempre per anticipatamente per la disponibilità!

Rispondi quotando