2013-02-24 67 views
20

我嘗試在Android 4.0中組織背景視頻錄製。但我不能這樣做,因爲這些問題:Android 4.0中的背景視頻錄製

  1. 虛假表面在MediaRecorder(錯誤:無效的面)不工作

  2. 如果您使用的表面活性1×1像素,表面被破壞的活動暫停(停止記錄)

  3. 如果您在使用WindowsManager表面1×1像素,表面被破壞的應用程序暫停(停止記錄)

  4. 面傳熱eTexture不MediaRecorder.setPreviewDisplay(新的表面(表面紋理))工作

  5. 的Widget不允許處理表面1×1像素

  6. 狀態欄不允許處理表面1×1像素

請幫助我找到正確的方法。

+1

你可以給我的代碼隱藏的攝像頭 – 2015-12-16 07:27:31

回答

-4

我找到了答案:有必要使用WindowManager並從Service中調用它。

+6

請ü可以發佈您的代碼 – 2013-03-04 08:27:42

+1

ü可以發佈您的代碼.... – 2013-04-09 11:24:04

+1

請ü可以發佈您的代碼 – 2015-07-08 15:38:45

39

樣品和簡單的代碼(在果凍豆,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; } 

} 

不要忘記權限:

<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" /> 
+0

即將發佈。訣竅是將MediaRecorder設置在OnSurfaceCreated上,之後它變得非常簡單。 – 2013-06-03 16:32:01

+0

謝謝你提供了很棒的代碼,但我遇到了一個小問題。我在Nexus 5X上測試過它,並且相機顛倒了。我嘗試了camera.setDisplayOrientation(90)和camera.getParameters()。setRotation(90),但沒有任何更改攝像機的方向。你有什麼想法如何改變它? – Michal 2016-12-21 21:15:32

+0

我真的很抱歉回答這麼晚。我希望這有助於:https://plus.google.com/+AndroidDevelopers/posts/jXNFNKWxsc3 - 如果沒有,你可以試試這個:mediaRecorder.setOrientationHint(180); - 它不會改變相機的方向,但會告訴視頻播放器在播放時改變方向。這是我所知道的一切。 – cman 2017-04-02 18:01:42

2
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){} 

只是一個小的修改上面的代碼。 ..它會將5秒的文件保存到你的SD卡的根文件夾...根據你的需要修改定時器。和它的工作在Nexus 4和福邦以及..