2013-02-24 41 views
20

Tôi cố gắng tổ chức quay video nền trong Android 4.0. Nhưng tôi không thể làm điều đó bởi vì những vấn đề này:Quay video nền trong Android 4.0

  1. Dummy Surface không hoạt động trong MediaRecorder (lỗi: bề mặt không hợp lệ)

  2. Nếu bạn sử dụng bề mặt 1 x 1 px trên hoạt động, bề mặt bị phá hủy trên Hoạt động tạm dừng (ghi được dừng)

  3. Nếu bạn sử dụng bề mặt 1 x 1 px trên WindowsManager, bề mặt bị phá hủy trên ứng dụng tạm dừng (ghi được dừng)

  4. surfac eTexture không hoạt động trong MediaRecorder.setPreviewDisplay (Surface mới (SurfaceTexture))

  5. Widget không cho phép để xử lý bề mặt 1 x 1 px

  6. Status Bar không cho phép để xử lý bề mặt 1 x 1 px

Vui lòng giúp tôi tìm đúng cách.

+1

bạn có thể cho tôi mã cho camera ẩn –

Trả lời

-4

Tôi tìm thấy câu trả lời: cần sử dụng WindowManager và gọi nó từ Dịch vụ.

+6

pls u có thể gửi mã của bạn –

+1

u có thể gửi mã của bạn .... –

+1

pls u có thể gửi mã của bạn –

39

mẫu và mã đơn giản (thử nghiệm trên 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; } 

} 

Đừng quên về quyền truy cập:

<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

Đã chuẩn bị để đăng bài này. Bí quyết là thiết lập MediaRecorder trên OnSurfaceCreated, sau đó nó trở nên khá đơn giản. –

+0

Cảm ơn bạn đã viết một đoạn mã tuyệt vời, nhưng tôi có một vấn đề nhỏ với điều đó. Tôi đã thử nghiệm nó trên Nexus 5X và tôi đã có camera upidedown. Tôi đã thử camera.setDisplayOrientation (90) và camera.getParameters(). SetRotation (90), nhưng không có gì thay đổi hướng máy ảnh. Bạn có bất kỳ ý tưởng làm thế nào để thay đổi nó? – Michal

+0

Tôi thực sự xin lỗi vì đã trả lời quá muộn. Tôi hy vọng điều này sẽ giúp: https://plus.google.com/+AndroidDevelopers/posts/jXNFNKWxsc3 - nếu không, bạn có thể thử điều này: mediaRecorder.setOrientationHint (180); - nó không thay đổi hướng của máy ảnh, nhưng yêu cầu trình phát video thay đổi hướng khi phát. Đó là tất cả những gì tôi biết. – cman

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

Chỉ cần một thay đổi nhỏ đối với mã ở trên. ..nó sẽ lưu các tập tin 5sec vào thư mục gốc trong sd sdcard ... sửa đổi bộ đếm thời gian theo nhu cầu ur. và nó làm việc trên Nexus 4 và Micromax cũng ..

Các vấn đề liên quan