2012-05-07 34 views
10

Tôi đang cố tạo chế độ xem bề mặt cho máy ảnh để nó hiển thị trên bề mặt bất cứ khi nào ở chế độ xem của máy ảnh. Hiện tại tất cả những gì tôi có thể thấy trên màn hình máy ảnh của tôi là chế độ xem màn hình màu đen. Tôi đã cố gắng tìm kiếm trên Google và ở đây nhưng cho đến nay tôi vẫn chưa tìm thấy những gì tôi đang tìm kiếm. Bất cứ ai cũng có thể gợi ý cho tôi một số ý tưởng.Android Camera Surface View

Trả lời

18

Tôi đã viết một lớp điều này có thể giúp bạn.

public class Preview_can_work extends Activity { 
     private SurfaceView surface_view; 
     private Camera mCamera; 
     SurfaceHolder.Callback sh_ob = null; 
     SurfaceHolder surface_holder  = null; 
     SurfaceHolder.Callback sh_callback = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      getWindow().setFormat(PixelFormat.TRANSLUCENT); 

      surface_view = new SurfaceView(getApplicationContext()); 
      addContentView(surface_view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

      if (surface_holder == null) { 
       surface_holder = surface_view.getHolder(); 
      } 

      sh_callback = my_callback(); 
      surface_holder.addCallback(sh_callback); 
     } 

      SurfaceHolder.Callback my_callback() {  
       SurfaceHolder.Callback ob1 = new SurfaceHolder.Callback() { 

        @Override 
        public void surfaceDestroyed(SurfaceHolder holder) { 
          mCamera.stopPreview(); 
          mCamera.release(); 
          mCamera = null; 
        } 

        @Override 
        public void surfaceCreated(SurfaceHolder holder) { 
         mCamera = Camera.open(); 

          try { 
           mCamera.setPreviewDisplay(holder); 
          } catch (IOException exception) { 
           mCamera.release(); 
           mCamera = null; 
          } 
        } 

        @Override 
        public void surfaceChanged(SurfaceHolder holder, int format, int width, 
          int height) { 
         mCamera.startPreview(); 
        } 
       }; 
       return ob1; 
     } 
    } 

trong bản sao file manifest của bạn mã này cho phép camera

<uses-permission android:name="android.permission.CAMERA"/> 

Giải thích:

SurfaceView là một loại Xem trong đó có một SurfaceHolder. SurfaceHolder giữ bề mặt mà trên đó chúng ta có thể hiển thị phương tiện truyền thông của chúng tôi (thường khung).

mCamera là đối tượng Máy ảnh sẽ chứa phiên bản máy ảnh.

Khi bạn muốn giữ trường hợp Camera mặc định thì bạn có thể chỉ cần gọi Camera.open();

Máy ảnh mCamera = Camera.open();

Bây giờ bạn có máy ảnh mở hoặc bạn đang có phiên bản máy ảnh mặc định. Bây giờ bạn cần chụp các khung hình từ máy ảnh và hiển thị nó trên một bề mặt. Nhưng bạn không thể hiển thị nó mà không cần bất kỳ

bề mặt. Ở đây surfaceView cung cấp surfaceHolder và surfaceHolder cung cấp bề mặt để hiển thị khung máy ảnh. Bây giờ khi bề mặt sẽ được tạo ba chức năng gọi lại sẽ là

được gọi.

1. public void surfaceCreated(SurfaceHolder holder) 
2. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
3. public void surfaceDestroyed(SurfaceHolder holder) 

Lưu ý: - Bề mặt sẽ bị hủy khi ứng dụng của bạn sẽ tạm dừng.

bề mặtĐược tạo: bề mặtĐược tạo là chức năng gọi lại sẽ được gọi khi bề mặt của bạn được tạo. Trong này, bạn có thể mở máy ảnh của bạn và thiết lập các thuộc tính khác.

bề mặtThay đổi: Điều này sẽ được gọi ít nhất một lần khi bề mặt của bạn được tạo ra. Sau đó nó sẽ được gọi bất cứ khi nào bề mặt của bạn sẽ thay đổi (Trong xoay thiết bị). Tại đây, bạn có thể

bắt đầu xem trước vì bề mặt của bạn đã được tạo.

bề mặtĐược phá hủy: Điều này sẽ được gọi mỗi khi bề mặt của bạn bị phá hủy.Bây giờ nếu bạn không có bề mặt thì bạn có thể hiển thị cho bạn khung máy ảnh để tôi đã phát hành máy ảnh bằng cách sử dụng

mCamera.release(). Điều này rất quan trọng vì nếu hoạt động của bạn sẽ tạm dừng và bất kỳ hoạt động nào khác cố gắng mở máy ảnh thì nó sẽ không thể mở nó khi bạn có

máy ảnh đã mở. Máy ảnh là một tài nguyên được chia sẻ, do đó một lần duy nhất một ứng dụng có thể sử dụng nó. Vì vậy, hãy nhớ một điều bất cứ khi nào bạn mở một máy ảnh sau đó luôn luôn phát hành nó.

stopPreview: Khi bạn bắt đầu xem trước, máy ảnh của bạn bắt đầu chụp khung của bạn và hiển thị nó trên bề mặt. Bây giờ nếu bề mặt của bạn đã bị phá hủy thì bạn cần dừng chụp khung hình

từ máy ảnh để bạn phải gọi mCamera.stopPreview.

+0

Cảm ơn Bharat, tôi sẽ bỏ mặc cho việc này! cảm ơn một lần nữa. Có ai biết bài viết hay nơi tôi có thể đọc về “Máy ảnh không hoạt động khi chạy trong trình mô phỏng” không? Có đúng không? – Kitaro

+0

ya thực sự trong khi tạo giả lập bạn cần phải thêm máy ảnh vào nó sau đó tôi nghĩ rằng nó sẽ làm việc. Tôi sẽ cố gắng và cho bạn biết .. –

+0

Được rồi, vì vậy chúng tôi không cần phải có thiết bị để sử dụng máy ảnh để xem chế độ xem trực tiếp? Cos một số bài báo tôi đọc nói rằng chúng tôi không thể chạy máy ảnh trong giả lập nhưng tôi không chắc chắn nếu điều này đã được giải quyết. Làm ơn cho tôi biết. Cảm ơn. – Kitaro

0

Make shure bạn thêm sự cho phép:

<uses-permission android:name="android.permission.CAMERA"/>

Ngoài những tính chất cửa sổ:

getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

bài viết một số mã nếu điều đó không làm việc để giúp bạn

+0

Cảm ơn, tôi đã thêm quyền khi bạn đề xuất; và tôi đã suy nghĩ về việc sử dụng 'surfaceChanged'? Hiện tại tất cả những gì tôi có thể nhìn thấy trên bề mặt máy ảnh của tôi là màu đen ..... Tôi không hiểu tại sao. – Kitaro

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