Hintergrund Videoaufnahme in Android 4.0

Ich versuche, HintergrundVideo-Aufzeichnung in Android 4.0 zu organisieren. Aber ich kann es nicht tun wegen dieser Probleme:

  1. Dummy Surface funktioniert nicht in MediaRecorder (Fehler: ungültige Oberfläche)

  2. Wenn du die Oberfläche 1 x 1 px auf Aktivität nimmst, wird die Oberfläche bei Aktivitätspause zerstört (Aufnahme wird gestoppt)

  3. Wenn du Surface 1 x 1 px auf WindowsManager nutzst, wird Surface auf Application Pause zerstört (Aufnahme wird gestoppt)

  4. SurfaceTexture funktioniert nicht in MediaRecorder.setPreviewDisplay (neue Oberfläche (SurfaceTexture))

  5. Widget erlaubt es nicht, Oberfläche 1 x 1 px zu behandeln

  6. Statusleiste erlaubt es nicht, Oberfläche 1 x 1 px zu behandeln

Bitte helfen Sie mir, richtig zu finden.

  • VideoView Ernte zu quadratisch
  • Stream Video von PHP-Server zu Android programmgesteuert
  • Schwarzer Bildschirm bei der Rückkehr zur Video-Wiedergabe-Aktivität in Android
  • Pre-Load oder Pre-Buffer. MP4 Video in Android App Entwicklung
  • Wie man HDMI Gebrauch auf Samsung-Galaxie S II entdeckt
  • Mit MediaCodec können Sie Bilder als Video speichern
  • Wie bekomme ich eine Liste von Key-Frames (Sync Frames) Zeitstempel für eine Videodatei in Android?
  • Android: Jcodec: Kodierung von Bilddateien auf .mp4 Video
  • 3 Solutions collect form web for “Hintergrund Videoaufnahme in Android 4.0”

    Beispiel und einfacher Code (getestet auf Jelly Bean, SGS2):

    public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback { private WindowManager windowManager; private SurfaceView surfaceView; private Camera camera = null; private MediaRecorder mediaRecorder = null; @Override public void onCreate() { // Start foreground service to avoid unexpected kill Notification notification = new Notification.Builder(this) .setContentTitle("Background Video Recorder") .setContentText("") .setSmallIcon(R.drawable.ic_launcher) .build(); startForeground(1234, notification); // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); surfaceView = new SurfaceView(this); 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); } // Method called right after Surface created (initializing and starting MediaRecorder) @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { camera = Camera.open(); mediaRecorder = new MediaRecorder(); camera.unlock(); mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); mediaRecorder.setCamera(camera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mediaRecorder.setOutputFile( Environment.getExternalStorageDirectory()+"/"+ DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime())+ ".mp4" ); try { mediaRecorder.prepare(); } catch (Exception e) {} mediaRecorder.start(); } // Stop recording and remove SurfaceView @Override public void onDestroy() { mediaRecorder.stop(); mediaRecorder.reset(); mediaRecorder.release(); camera.lock(); camera.release(); windowManager.removeView(surfaceView); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) {} @Override public IBinder onBind(Intent intent) { return null; } } 

    Vergessen Sie nicht über Berechtigungen:

     <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" /> 
     try { mediaRecorder.prepare(); } catch (Exception e) {} mediaRecorder.start(); Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { stopSelf(); } }, 5000); }catch(Exception e){} 

    Nur eine kleine Änderung an den oben genannten Code … es wird die 5sec-Datei in den Root-Ordner in ur sdcard speichern … ändern Sie den Timer nach ur Notwendigkeit. Und es hat auch auf Nexus 4 und Micromax gearbeitet ..

    Ich habe die Antwort gefunden: Es ist notwendig, WindowManager zu verwenden und es vom Service zu rufen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.