본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Android 기능

Android Studio(기능) Location / Map [Camera -1]

by 차누감 2019. 10. 14.
반응형

우리는 카메라를 사용하는 방벙은 두 가지가 있다.

카메라 앱 

◎카메라 API

 

카메라 앱을 실행시킨다는 것은 내 앱에서 다른 앱을 실행 시킨다는 것이다. (새로운 Activity를 띄운다. 묵시적 Intent)

화면 구성: 버튼 1, 이미지 뷰1

 

일단 화면 구성을 해보자.

카메라를 실행하는 것은 간단하다.

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
 
 
import android.provider.MediaStore;
 
public class MainActivity extends AppCompatActivity {
 
    ImageView iv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        iv=findViewById(R.id.iv);
    }
 
    public void clickPhoto(View view) {
        //Camera 앱을 실행시키는 Intent 생성
        Intent intent= new Intent();//묵시적 인텐트 (식별자를 써서 띄움)
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
 
        //결과를 받아야 하므로 결과를 받을 수 있도록 카메라 액티비티 실행하기
        startActivity(intent);
 
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

<실행 화면>

카메라 앱을 잘 실행되지만, 우리는 그 캡쳐 화면을 가져오는 작업도 필요하다.

카메라로 사진을 찍고 확인을 누르면 그 사진이 이미지뷰에 보인다.

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
76
77
78
79
80
81
82
83
84
85
86
87
 
import androidx.annotation.Nullable;
 
import android.provider.MediaStore;
 
 
public class MainActivity extends AppCompatActivity {
 
    ImageView iv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        iv=findViewById(R.id.iv);
    }
 
    public void clickPhoto(View view) {
        //Camera 앱을 실행시키는 Intent 생성
        Intent intent= new Intent();//묵시적 인텐트 (식별자를 써서 띄움)
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
 
        //결과를 받아야 하므로 결과를 받을 수 있도록 카메라 액티비티 실행하기
        startActivityForResult(intent, 100);
    }
 
    //startActivityForResult()로 실행한
    //액티비티가 종료된 후 자동으로 실행되는
    //콜백메소드
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
 
        switch ( requestCode){
            case 100:
 
                //카메라앱의 실행결과가 OK일 때 (카메라로 찍었다.)
                if(resultCode == RESULT_OK){
                    //캡쳐한 사진 이미지를 이미지뷰에 보여주기
 
                    //결과물을 가져온 Intent객체(3번째 파라미터: data)에게 결과 받기
                    Uri uri=data.getData(); // Uri: 리소스의 경로를 관리하는 객체
 
                    //디바이스 마다 프로그램을 통해 실행한
                    //카메라 앱의 사진 캡쳐 방식이 다름.
 
                    //마시멜로우 부터 앱이 캡쳐한 이미지를
                    //파일로 저장하지 않고 Bitmap 이미지 데이터로
                    //결과를 돌려주는 다바이스들이 많음.
 
                    if(uri != null){ // 파일로 저장되는 방식일때
                        //카메라로 취득한 사진은 해상도가 너무 높아서
                        //이미지에 바로 사용 못하는 경우가 많음.
                        //이미지의 해상도를 리사이징 해서 사용함.
                        //이런 작업을 자동으로 해주는 라이브러리 사용(Glide, Picasso)
                        //iv.setImageURI(uri);
                        Toast.makeText(this"uri 로 사진 정보 획득", Toast.LENGTH_SHORT).show();
                        Glide.with(this).load(uri).into(iv);
 
                    }else{//Bitmap 이미지 데이터만 줄때[요즘은 거의 이방식]
                        Toast.makeText(this"Bitmap 객체로 사진 정보 획득", Toast.LENGTH_SHORT).show();
 
                        //Bitmap 객체를 Intent 로 Extra 부터 데이터로 전달 받음
                        Bundle bundle= data.getExtras();
                        Bitmap bm= (Bitmap) bundle.get("data"); //data는 정해진 값임 ( 모든 카메라앱은 data로 저장된단.)
 
                        Glide.with(this).load(bm).into(iv);
 
                    }
                    
                }
                break;
        }
    }
}
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity">
 
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="take a photo"
        android:textAllCaps="false"
        android:onClick="clickPhoto"/>
 
    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
 
 
</LinearLayout>
 
 

이렇게 하면 시진을 찍고, 나면 이미지 뷰에 사진이 나올 것이다.

(단, 사진이 갤러리에 저장은 안됨.)

반응형

댓글