2012-05-07 17 views
10

Próbuję utworzyć widok powierzchni dla kamery, aby wyświetlał się on na powierzchni w dowolnym miejscu w widoku kamery. W tej chwili wszystko, co widzę w widoku mojego aparatu, to widok z czarnego ekranu. Próbowałem szukać w Google i tutaj, ale do tej pory nie znalazłem tego, czego szukam. Każdy może zasugerować mi jakiś pomysł.Widok powierzchni aparatu z Androidem

Odpowiedz

18

Napisałem zajęcia to może ci pomóc.

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; 
     } 
    } 

w oczywisty kopiowania plików to kod o pozwolenie kamery

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

Objaśnienie:

SurfaceView jest typem widoku, który zawiera SurfaceHolder. SurfaceHolder posiada powierzchnię, na której możemy wyświetlać nasze media (zazwyczaj ramki).

mCamera to obiekt Camera, który będzie zawierał instancję kamery.

Jeśli chcesz zachować domyślną instancję kamery, możesz po prostu wywołać Camera.open();

Aparat mCamera = Camera.open();

Teraz masz otwartą kamerę lub masz domyślną instancję kamery. Teraz musisz uchwycić klatki z kamery i wyświetlić ją na powierzchni. Ale nie można wyświetlić go bez żadnej powierzchni. Tutaj surfaceView zapewnia surfaceHolder i surfaceHolder zapewnia powierzchnię do wyświetlania ram kamery. Teraz, gdy powierzchnia zostanie utworzona, trzy funkcje wywołania zwrotnego zostaną wywołane.

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

Uwaga: - Powierzchnia zostanie zniszczona, gdy aplikacja uruchomi się w trybie pauzy.

surfaceCreated: surfaceCreated to funkcja wywołania zwrotnego, która zostanie wywołana po utworzeniu powierzchni. W ten sposób można otworzyć aparat i ustawić inne atrybuty.

surfaceChanged: To będzie nazywać się co najmniej raz, kiedy twoja powierzchnia zostanie utworzona. Następnie zostanie wywołany za każdym razem, gdy zmieni się powierzchnia (w obrocie urządzenia). Tutaj możesz rozpocząć wyświetlanie podglądu, ponieważ twoja powierzchnia już została utworzona.

surfaceDestroyed: To będzie się nazywać za każdym razem, gdy powierzchnia zniszczy.Teraz, jeśli nie masz powierzchni, a następnie możesz wyświetlać ramki do kamer, zwolniłem kamerę, używając funkcji mCamera.release(). Jest to bardzo ważne, ponieważ jeśli twoja aktywność będzie wstrzymana, a każda inna próba otworzy kamerę, nie będzie mogła go otworzyć, ponieważ masz już otwartą kamerę. Kamera jest udostępnionym zasobem, więc jednorazowo może z niej korzystać tylko jedna aplikacja. Więc pamiętaj, że zawsze, gdy otworzysz kamerę, zawsze ją zwolnij.

stopPreview: Po uruchomieniu podglądu aparat rozpoczyna przechwytywanie klatek i wyświetlanie ich na powierzchni. Jeśli twoja powierzchnia uległa zniszczeniu, musisz zatrzymać przechwytywanie klatek z aparatu, aby móc wywołać mCamera.stopPreview.

+0

Dzięki Bharat, dam z siebie wszystko! dzięki jeszcze raz. Czy ktoś zna dobry artykuł, w którym mogę przeczytać o "Aparat nie działa podczas pracy w emulatorze"? Czy to prawda? – Kitaro

+0

Tak naprawdę podczas tworzenia emulatora musisz dodać do niego kamerę, więc myślę, że to zadziała. Spróbuję i dam ci znać .. –

+0

Okej, więc nie potrzebujemy urządzenia, aby móc korzystać z kamery, aby oglądać obraz na żywo? Coś artykułu przeczytałem mówiąc, że nie możemy uruchomić kamery w emulatorze, ale nie jestem pewien, czy to zostało rozwiązane. Proszę daj mi znać. Dzięki. – Kitaro

0

Producent Shure dodano uprawnienie:

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

Także te właściwości okna:

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); 

post jakiś kod jeśli to nie zadziała, aby pomóc

+0

Dzięki, dodałem już pozwolenie zgodnie z sugestią; i myślałem o użyciu 'surfaceChanged'? W tej chwili wszystko, co widzę na powierzchni mojej kamery jest czarne ..... Nie rozumiem dlaczego. – Kitaro

Powiązane problemy