이번에는 카메라를 실행시켜서 사진을 찍어서 가져와 이미지뷰에 보여지게 해보겠습니다!
1. 권한을 추가해줍니다 - AnroidManifest.xml
<uses-permission android:name="android.permission.CAMERA"/>
2. 이미지뷰를 추가해줍니다 - activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
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"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="300dp"
android:layout_height="300dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="#123123" />
</androidx.constraintlayout.widget.ConstraintLayout>
이미지뷰를 클릭하면 카메라가 실행되도록 구성하기 위해서 이미지뷰만 넣었습니다 실제로 코드를 실행해볼때는 이미지뷰가 보이지 않지만 클릭하면 작동이 됩니다
3. MainActivity.java
권한설정을 위한 함수를 만들어줍니다.
public void checkSelfPermission() {
String temp = ""; //권한에 대한 상수값
//카메라 권한 확인
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
temp += Manifest.permission.CAMERA;
}
if(TextUtils.isEmpty(temp) == false){ //temp가 비어있지 않으면
ActivityCompat.requestPermissions(this, temp.trim().split(" "), 1);
}
else {
//권한허용을 했는데 작동을 안할경우 추가해줌
}
}
temp는 권한에 대한 상수값을 저장해주는 변수입니다.
checkSelfPermission()으로 권한을 자가 진단합니다. 권한이 승인되어 있지 않으면 temp에 권한을 추가합니다.
PackageManager.PERMISSION_GRANTED은 상수값으로 권한이 승인되어있다는 의미입니다.
Log를 통해 temp를 확인해보면 READ_EXTERNAL_STORAGE 와 WRITE_EXTERNAL_STORAGE 권한 문자열이 같이 들어가있습니다. 문자열이 붙어있기 때문에 split하여 분리해줘야 합니다. Log에서는 공백이 없어보이지만 두 문자열에 사이에 공백이 들어가있습니다
ActivityCompat.requestPermissions(this, temp.trim().split(" "), 1); - temp의 공백을 제거한 후 문자열을 분리하여 두 개의 권한을 추가해줍니다. 1은 requestCode입니다.
사용자가 시스템 권한 대화상자에 응답하면 시스템은 앱의 onRequestPermissionsResult() 구현을 호출합니다
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1) {
int length = permissions.length;
for(int i=0; i<length; i++) {
if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
//허용 확인 되었을 때의 동작
}
else {
}
}
}
}
아까 requestCode가 1이었으므로 requestCode == 1일 경우로 동작을 구현해줍니다. 이 코드에서는 딱히 동작을 정의해주지는 않았습니다.
변수를 정의해주고 onCreate()를 구현해줍니다.
ImageView iv;
private static final int GET_FROM_CAMERA = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkSelfPermission();
iv = (ImageView)findViewById(R.id.imageView);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int permission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);
if(permission == PackageManager.PERMISSION_DENIED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 0);
}
else{
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, GET_FROM_CAMERA);
}
}
});
}
카메라를 실행시켰을 때 카메라에 권한이 있는지 확인합니다. 권한이 없다면 권한을 추가해주고 권한이 있다면 카메라를 실행시킵니다.
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - 카메라를 실행시킵니다
startActivityForResult(i, GET_FROM_CAMERA); - 액티비티를 실행합니다. requestCode는 위에서 정의해준 상수값을 사용합니다. 숫자값으로 직접쓸 경우 외부에서 접근이 가능하므로 상수값으로 정의해서 접근하지 못하도록 해줍니다.
다음은 메인액티비티에서 갤러리로 넘어갔다가 다시 메인액티비티로 돌아올 때 호출되는 메소드입니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 100 && resultCode == RESULT_OK) { //정상 동작할 때
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap)extras.get("data");
iv.setImageBitmap(imageBitmap);
}
}
Bundle extras = data.getExtras(); - 번들객체를 통해 데이터를 받아옵니다
Bitmap imageBitmap = (Bitmap)extras.get("data"); - 데이터를 비트맵으로 저장합니다
iv.setImageBitmap(imageBitmap); - 이미지뷰에 받아온 사진을 넣어줍니다
실행화면
'Android' 카테고리의 다른 글
[Android] 카메라(Camera) 호출 후 이미지 크롭(Crop) 하기 (2) | 2020.12.26 |
---|---|
[Android] Room 데이터 베이스 (0) | 2020.12.18 |
[Android] 6주차 스터디 (Gallery) (0) | 2020.11.29 |
[Android] 5주차 스터디 (RecyclerView) (0) | 2020.11.25 |
[Android] Bottom Navigation and Fragment with Jetpack (0) | 2020.11.04 |