IT/안드로이드+JAVA

[안드로이드] SurfaceView Camera 서페이스뷰 이용한 카메라 기능

안경 쓴 귀니 2016. 9. 19. 16:20
반응형



[안드로이드] SurfaceView Camera 서페이스뷰 이용한 카메라 기능


[출처 : http://webnautes.tistory.com/822 ]


http://www.tutorialspoint.com/android/android_camera.htm 에 있는 예제를 수정해서 만들었습니다..



AndroidManifest.xml 파일에 아래 빨간색 4줄을 추가해줍니다.

회색으로 칠해진 2줄은 카메라 영상 결과를 보여줄 액티비티를 적어준 것입니다.


  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.webnautes.camera1" >  
  4.   
  5.     <uses-permission android:name="android.permission.CAMERA" />  
  6.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  7.     <uses-feature android:name="android.hardware.camera" />  
  8.     <uses-feature android:name="android.hardware.camera.autofocus" />  
  9.   
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@mipmap/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:supportsRtl="true"  
  16.         android:theme="@style/AppTheme" >  
  17.         <activity android:name=".MainActivity" >  
  18.             <intent-filter>  
  19.                 <action android:name="android.intent.action.MAIN" />  
  20.   
  21.                 <category android:name="android.intent.category.LAUNCHER" />  
  22.             </intent-filter>  
  23.         </activity>  
  24.   
  25.         <activity android:name=".ResultActivity" >  
  26.             </activity>  
  27.     </application>  
  28.   
  29. </manifest>  




메인 액티비티의 레이아웃 파일입니다. activity_main.xml

카메라 프리뷰를 보여줄 SurfaceView와 카메라 촬영시 사용될 버튼이 정의되어 있습니다. 


  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".MainActivity">  
  7.   
  8.     <SurfaceView  
  9.         android:id="@+id/surfaceView"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="match_parent"  
  12.         android:layout_above="@+id/button"  
  13.         android:layout_alignParentLeft="true"  
  14.         android:layout_alignParentTop="true" />  
  15.   
  16.     <Button  
  17.         android:id="@+id/button"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_alignParentBottom="true"  
  21.         android:layout_alignParentLeft="true"  
  22.         android:layout_alignParentRight="true"  
  23.         android:text="사진찍기" />  
  24.   
  25.   
  26. </RelativeLayout>  



다음은 결과를 보여줄 레이아웃 파일입니다. result.xml

결과 이미지를 보여주기 위한 imageview가 정의되어 있습니다.

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ImageView  
  8.         android:id="@+id/imageView1"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.          />  
  12.   
  13. </LinearLayout>  



메인 액티비티입니다. MainActivity.java

카메라 프리뷰를 보여주다가 버튼을 클릭하면 파일로 저장합니다. 
  1. package com.example.webnautes.camera1;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.PixelFormat;  
  6. import android.hardware.Camera;  
  7. import android.os.Bundle;  
  8. import android.view.Surface;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11. import android.view.View;  
  12. import android.widget.Button;  
  13. import android.widget.Toast;  
  14.   
  15. import java.io.FileNotFoundException;  
  16. import java.io.FileOutputStream;  
  17. import java.io.IOException;  
  18.   
  19.   
  20. public class MainActivity extends Activity   
  21.         implements SurfaceHolder.Callback {  
  22.     @SuppressWarnings("deprecation")  
  23.     Camera camera;  
  24.     SurfaceView surfaceView;  
  25.     SurfaceHolder surfaceHolder;  
  26.     Button button;  
  27.     String str;  
  28.   
  29.     @SuppressWarnings("deprecation")  
  30.     Camera.PictureCallback jpegCallback;  
  31.   
  32.     @SuppressWarnings("deprecation")  
  33.     @Override  
  34.     protected void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.activity_main);  
  37.   
  38.         button = (Button) findViewById(R.id.button);  
  39.         button.setOnClickListener(new View.OnClickListener() {  
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 camera.takePicture(nullnull, jpegCallback);  
  43.             }  
  44.         });  
  45.   
  46.         getWindow().setFormat(PixelFormat.UNKNOWN);  
  47.   
  48.   
  49.         surfaceView = (SurfaceView) findViewById(R.id.surfaceView);  
  50.         surfaceHolder = surfaceView.getHolder();  
  51.         surfaceHolder.addCallback(this);  
  52.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  53.   
  54.   
  55.   
  56.         jpegCallback = new Camera.PictureCallback() {  
  57.   
  58.             @Override  
  59.             public void onPictureTaken(byte[] data, Camera camera) {  
  60.                 FileOutputStream outStream = null;  
  61.                 try {  
  62.                     str = String.format("/sdcard/%d.jpg",   
  63.                             System.currentTimeMillis());  
  64.                     outStream = new FileOutputStream(str);  
  65.   
  66.                     outStream.write(data);  
  67.                     outStream.close();  
  68.                 }  
  69.   
  70.                 catch (FileNotFoundException e) {  
  71.                     e.printStackTrace();  
  72.                 }  
  73.   
  74.                 catch (IOException e) {  
  75.                     e.printStackTrace();  
  76.                 }  
  77.   
  78.                 finally {  
  79.                 }  
  80.   
  81.                 Toast.makeText(getApplicationContext(),   
  82.                         "Picture Saved", Toast.LENGTH_LONG).show();  
  83.                 refreshCamera();  
  84.   
  85.                 Intent intent = new Intent(MainActivity.this,  
  86.                         ResultActivity.class);  
  87.                 intent.putExtra("strParamName", str);  
  88.                 startActivity(intent);  
  89.             }  
  90.         };  
  91.     }  
  92.   
  93.   
  94.     public void refreshCamera() {  
  95.         if (surfaceHolder.getSurface() == null) {  
  96.             return;  
  97.         }  
  98.   
  99.         try {  
  100.             camera.stopPreview();  
  101.         }  
  102.   
  103.         catch (Exception e) {  
  104.         }  
  105.   
  106.         try {  
  107.             camera.setPreviewDisplay(surfaceHolder);  
  108.             camera.startPreview();  
  109.         }  
  110.         catch (Exception e) {  
  111.         }  
  112.     }  
  113.   
  114.     @Override  
  115.     protected void onDestroy() {  
  116.         super.onDestroy();  
  117.     }  
  118.   
  119.   
  120.     @SuppressWarnings("deprecation")  
  121.     @Override  
  122.     public void surfaceCreated(SurfaceHolder holder) {  
  123.   
  124.         camera = Camera.open();  
  125.         camera.stopPreview();  
  126.         Camera.Parameters param = camera.getParameters();  
  127.         param.setRotation(90);  
  128.         camera.setParameters(param);  
  129.   
  130.         try {  
  131.   
  132.             camera.setPreviewDisplay(surfaceHolder);  
  133.             camera.startPreview();  
  134.         }  
  135.   
  136.         catch (Exception e) {  
  137.             System.err.println(e);  
  138.             return;  
  139.         }  
  140.     }  
  141.   
  142.     @Override  
  143.     public void surfaceChanged(SurfaceHolder holder,   
  144.                                int format, int width, int height) {  
  145.         refreshCamera();  
  146.     }  
  147.   
  148.     @Override  
  149.     public void surfaceDestroyed(SurfaceHolder holder) {  
  150.         camera.stopPreview();  
  151.         camera.release();  
  152.         camera = null;  
  153.     }  
  154. }  



결과 이미지를 보여주는 액티비티입니다. ResultActivity.java

스마트폰의 뒤로가기 버튼을 누르면 다시 프리뷰화면을 보여주는 액티비티로 돌아갑니다.

  1. package com.example.webnautes.camera1;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.content.Intent;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.BitmapFactory;  
  8. import android.graphics.Matrix;  
  9. import android.os.Bundle;  
  10. import android.widget.ImageView;  
  11.   
  12. public class ResultActivity extends Activity {  
  13.      
  14.   
  15.   
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.result);  
  20.   
  21.   
  22.         Intent intent = getIntent();  
  23.         String photoPath = intent.getStringExtra("strParamName");  
  24.   
  25.         BitmapFactory.Options options = new BitmapFactory.Options();  
  26.         options.inSampleSize = 4;  
  27.         final Bitmap bmp = BitmapFactory.decodeFile(photoPath, options);  
  28.   
  29.         Matrix matrix = new Matrix();  
  30.         matrix.preRotate(90);  
  31.         Bitmap adjustedBitmap = Bitmap.createBitmap(bmp, 00, bmp.getWidth(), 
  32.                                   bmp.getHeight(), matrix, true);  
  33.   
  34.         ImageView img = (ImageView) findViewById(R.id.imageView1);  
  35.         img.setImageBitmap(adjustedBitmap);  
  36.   
  37.     }  
  38.   
  39. }  






반응형