반응형
<최종 실행 화면>
앱을 실행하면 바로 카메라로 화면을 보여주고, 캡쳐를 누르면 오른쪽 하단에 ImageView에 캡쳐화면이 나온다.
우선 퍼미션을 지정한다.
임의로 뷰를 만들것이기 때문에 SurfaceView를 상속받은 뷰를 만든다.
MyCameraView.java 코드 ( SurfaceView를 상속하면 무조건 생성자를 만들어야 한다. 사진 참고)
MyCameraViw.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package com.lcw.ex72cameraapitest;
import android.content.Context;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class MyCameraView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder holder; // Surfac를 관리하는 공장장 객체
//카메라 관리자 객체 참조 변수
Camera camera;
public MyCameraView(Context context, AttributeSet attrs) {
super(context, attrs);
holder= getHolder();//공장장 소환
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//카메라뷰가 화면에 그려낼 준비가 될때
//카메라 객체 열기
//카메라의 미리보기를 실행 전에 몇가지 설정
try {
camera.setPreviewDisplay(holder);
//카메라는 무조건 가로방향임
//프리뷰를 90도 회전
camera.setDisplayOrientation(90);
} catch (IOException e) { e.printStackTrace();}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
//surfaceCreated()메소드가 종료된 후
//자동으로 실행되는 메소드
//마케라 미리보기 시작
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//미리보기 종료
camera.stopPreview();
//카메라 닫기
camera.release();
camera= null;
}
}
|
화면 구성
activity_main.xml 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?xml version="1.0" encoding="utf-8"?>
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<!-- 디바이스의 카메라의 미리보기용 뷰-->
<!-- 프로그래머가 만든 뷰 (SurfaceView를 상속받아서 MyCameraViw를 만든 것임)-->
android:id="@+id/cv"
android:layout_width="match_parent"
android:layout_height="500dp"
android:visibility="gone"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="capture"
android:onClick="clickCapture"/>
<ImageView
android:id="@+id/iv"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
|
MainActivity.java 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
package com.lcw.ex72cameraapitest;
import androidx.annotation.NonNull;
import android.Manifest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
MyCameraView cv;
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cv=findViewById(R.id.cv);
iv=findViewById(R.id.iv);
//동적퍼미션 작업
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
if(permissionResult== PackageManager.PERMISSION_DENIED){
String[] permissions= new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions,10);
}
}else{
cv.setVisibility(View.VISIBLE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case 10:
if(grantResults[0]==PackageManager.PERMISSION_DENIED || grantResults[1]==PackageManager.PERMISSION_DENIED){
Toast.makeText(this, "이 앱 사용 불가", Toast.LENGTH_SHORT).show();
finish();
}else{
cv.setVisibility(View.VISIBLE);
}
break;
}
}
public void clickCapture(View view) {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
//카메라가 취득한 사진을 byte[]로 줌.
//byte[]을 Bitmap객체로 생성
Bitmap bm= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
iv.setImageBitmap(bm);
//만약 찍은 사진을 저장하고 싶다면..
//파일 입출력을 이용해서 byte[]을 파일로 저장하기..
//외부메모리 저장하기 예제를 참고해서..
}
});
}
}
|
<최종 실행 화면>
앱을 실행하면 바로 카메라로 화면을 보여주고, 캡쳐를 누르면 오른쪽 하단에 ImageView에 캡쳐화면이 나온다.
반응형
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Android 기능' 카테고리의 다른 글
Android Studio(기능) 첫페이지 인트로 효과 주기(로고,제목 애니메이션 효과) (0) | 2019.10.15 |
---|---|
Android Studio(기능) Alarm (4) | 2019.10.15 |
Android Studio(기능) Location / Map [Camera -3 (동영상)] (0) | 2019.10.14 |
Android Studio(기능) Location / Map [Camera -2] (0) | 2019.10.14 |
Android Studio(기능) Location / Map [Camera -1] (0) | 2019.10.14 |
댓글