이번 포스팅에서는 촬영한 사진의 썸네일을 가져와 이미지뷰에 넣는 예제를 다뤄보겠습니다.
스틱코드라는 플러그인을 통해 좀 더 빨리 만들 수 있는 방법을 소개하려고 해요.
- 매니페스트에 필요한 권한 명시
먼저 매니페스트에 아래 권한들을 명시해줍니다. 카메라와 내부 저장소 읽기, 쓰기 권한입니다.
권한을 설정하지 않으면 해당 기능을 사용할 수 없기 때문에 반드시 설정해줘야 합니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
- xml 파일 코딩
다음으로 xml 파일을 코딩해줍니다. 아래와 같이 만들면 다음과 같은 화면이 만들어집니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_photo"
android:layout_width="match_parent"
android:layout_height="680dp" />
<Button
android:id="@+id/btn_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="사진 찍기" />
</LinearLayout>
이미지뷰에 아직 아무 이미지도 넣지 않아서 텅 비어 있는데, 이제 여기에 찍은 사진의 썸네일을 넣는 처리를 해보겠습니다.
- 자바 파일 코딩
메인 액티비티의 자바 파일은 아래와 같이 만들어줍니다.
public class MainActivity extends AppCompatActivity
{
final private static String TAG = "MainActivity";
Button btn_photo;
ImageView iv_photo;
final static int TAKE_PICTURE = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_photo = findViewById(R.id.iv_photo);
btn_photo = findViewById(R.id.btn_photo);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
{
Log.e(TAG, "권한 설정 완료");
}
else
{
Log.e(TAG, "권한 설정 요청");
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
// 사진 찍기 버튼을 눌러 카메라 화면으로 이동 및 촬영
btn_photo.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_photo:
//
}
}
});
}
// 카메라 권한 요청
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult");
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
{
Log.e(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
}
}
// 카메라로 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우기
}
처음 앱을 빌드하면 권한이 설정되어 있지 않기 때문에, onRequestPermissionsResult()를 통해서 앱 실행에 필요한 권한을 사용자에게 요청합니다.
그러나 코드에는 아직 사진 찍기 버튼을 눌렀을 때 카메라로 이동하는 코드와 사진을 가져와 이미지뷰에 띄우는 작업을 수행하는 코드가 없습니다.
스틱코드를 이용해 빠르게 불러와 보겠습니다.
먼저 위의 get_camera를 선택하게 되면 아래 코드가 자동완성됩니다.
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, );
break;
startActivityForResult()의 2번째 파라미터가 비어있는데, 여기에는 전역변수로 설정해둔 TAKE_PICTURE 변수를 넣어주면 됩니다.
위와 같은 방식으로, 이번엔 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우는 코드를 자동완성해보겠습니다.
camera_onactivityresult를 선택하면 아래의 코드가 자동완성되는 걸 볼 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode)
{
case TAKE_PICTURE:
if (resultCode == RESULT_OK && intent.hasExtra("data"))
{
Bitmap bitmap = (Bitmap) intent.getExtras().get("data");
if (bitmap != null)
{
// .setImageBitmap(bitmap);
}
}
break;
}
}
if (bitmap != null)의 중괄호 내부에 주석이 되어 있는데, 이 부분에는 xml의 이미지뷰를 참조하는 변수를 넣어주면 됩니다. 이 예제에선 'iv_photo'라는 변수에 이미지뷰를 연결했으니 이 변수를 넣어주면 되겠습니다.
여기까지 따라왔다면 메인 액티비티 파일은 아래와 같은 형태로 완성됩니다.
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity
{
final private static String TAG = "MainActivity";
Button btn_photo;
ImageView iv_photo;
final static int TAKE_PICTURE = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_photo = findViewById(R.id.iv_photo);
btn_photo = findViewById(R.id.btn_photo);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
{
Log.e(TAG, "권한 설정 완료");
}
else
{
Log.e(TAG, "권한 설정 요청");
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
// 사진 찍기 버튼을 눌러 카메라 화면으로 이동 및 촬영
btn_photo.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_photo:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, TAKE_PICTURE);
break;
}
}
});
}
// 카메라 권한 요청
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult");
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED)
{
Log.e(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
}
}
// 카메라로 촬영한 사진의 썸네일을 가져와 이미지뷰에 띄우기
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode)
{
case TAKE_PICTURE:
if (resultCode == RESULT_OK && intent.hasExtra("data"))
{
Bitmap bitmap = (Bitmap) intent.getExtras().get("data");
if (bitmap != null)
{
iv_photo.setImageBitmap(bitmap);
}
}
break;
}
}
}
이제 만든 앱을 실행해 보겠습니다.
앱을 처음 실행하면 갤럭시 s20+ 기준으로 아래와 같은 화면들이 나타나게 됩니다.
각각 허용을 누르면 위에서 본 아무 이미지도 없는 화면이 나타납니다.
이제 하단에 위치한 사진 찍기 버튼을 누르면 카메라가 작동하면서 촬영할 수 있게 됩니다.
이제 확인을 누르게 되면 아래와 같이 촬영한 사진의 썸네일이 이미지뷰에 정상적으로 들어가는 걸 볼 수 있습니다.
활용한 스틱코드 링크)
stickode.com/detail.html?no=1909
'안드로이드 자바' 카테고리의 다른 글
[Java][Android]안드로이드 뷰페이저 / 텝 레이아웃 만들기 (0) | 2021.02.26 |
---|---|
[Java][Android] 메모장 만들기(2. 메모장 수정, 삭제) (19) | 2021.02.25 |
[Java][Android] check box 란? , 체크박스 빠르게 커스텀하기 (2) | 2021.02.23 |
[Java][Android] 안드로이드 - Radio Button, Radio Group 사용법 (0) | 2021.02.22 |
[Java][Android] 당겨서 새로고침 빠르게 구현하기 (2) | 2021.02.20 |