안드로이드 Camera 사용하기 - Intent편

Posted by ITPangPang
2016.04.18 22:54 안드로이드(android)/카메라(Camera)



안드로이드 Camera 사용하기 - Intent편



- 안드로이드에서 카메라를 사용하는 방법은 크게 2가지가 있습니다.


- 첫번째는 Intent를 사용하여 안드로이드에서 기본적으로 제공해주는 카메라를 이용하는 방법입니다.


- 두번째는 Surfaceview로 프리뷰를 띄운후 자신에게 맞게 커스텀해서 사용하는 방법입니다.


- 이번글에서는 역시 사용하기 쉬운 Intent를 먼저 하겠습니다.


- Surfaceview도 기본예제만 사용하면 어렵지는 않으나 원하는대로 만들기는 난이도가 꽤 높습니다.


- 이번 Intent는 사실 이와 연결되는 File이나 Image처리 관련글을 써보기 위해서 작성해봅니다.


- 사용하는건 쉬우나 Image처리가 골치 아프죠..






먼저 사진찍을 버튼 1개와

찍은 사진을 보여준 ImageView 1개를

배치하겠습니다.


[activity_main.xml]

<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:gravity="center"
tools:context=".MainActivity">

<ImageView
android:id="@+id/iv"
android:layout_width="300dp"
android:layout_height="300dp" />

<Button
android:id="@+id/btn"
android:text="찍자"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>



[MainActivity.java]


public class MainActivity extends Activity
{
Button btn = null;
ImageView iv = null;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

setup();
}

private void setup()
{
btn = (Button)findViewById(R.id.btn);
iv = (ImageView)findViewById(R.id.iv);
}
}



그 다음 버튼을 누르면

카메라를 실행시키기 위해서


딱 2줄만 추가시키면 됩니다.


btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);

}
});


코드 설명할 것도 없이

인텐트는 다들 잘 아실꺼고


MediaStore.ACTION_IMAGE_CAPTURE는

MediaStore 레퍼런스 키면 바로

ACTION_IMAGE_CAPTURE가 눈에 보입니다.


뭐 영어는 못하지만 대충 해석하면

카메라 어플리케이션이 캡쳐를 해서 이미지를 

리턴할수 있는 표준 동작이라는 뜻입니다.



여기까지만 입력하고

앱을 실행시키면 

카메라 작동 잘~ 됩니다







폰이 구려서 

사진은 잘 안나오지만


작동은 잘됩니다.

딱 2줄 추가했을뿐인데


저장 누르면 갤러리에

저장도 잘됩니다.


결국은 카메라에

관련된 내용은

여기까지고


나머지는 

File이나

이미지처리입니다


이제

onActivityResult를

추가해줍니다.


얼마전에 단축키 관련해서

썼던 글에 나왔던 내용인데



Alt+Insert키를 누른후

Override Methods...를 

눌러줍니다.




누른후에 

onAc정도 쓰시면


바로 검색이 되는데

클릭해주면 됩니다.




가져왔으면 

이제 최종코드를 

보겠습니다.


public class MainActivity extends Activity
{
Button btn = null;
ImageView iv = null;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

setup();
}

private void setup()
{
btn = (Button)findViewById(R.id.btn);
iv = (ImageView)findViewById(R.id.iv);

btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,1);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
iv.setImageURI(data.getData());
}
}


intent 결과값을


onActivityResult에서

처리할 수 있습니다.


data.getData()를

사용해서 방금사진찍은

Uri를 가져옵니다.


여기까지 하고

마지막으로 manifest를

한줄 추가합니다.


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


여기까지가 

찍은 사진을 

아무~ 처리 없이

가져오는 과정입니다.


메모리부족, 사진크기

사진이 돌아간것(회전)

등등 전부...


사실 카메라 부분은

Image처리부분이

꽃입니다. 후후


이와 관련된 내용은

 Image 카테고리에서

자세히 다뤄보도록

하겠습니다.




대충 이렇게 나옵니다

아마 여기서도

용량이 큰 사진은

Out of memory로

앱이 죽을 수 있습니다.

저작자 표시 비영리 변경 금지
신고
이 댓글을 비밀 댓글로
    • 조은성
    • 2016.11.26 21:52 신고
    좋은글 감사합니다. 이 방법대로 따라했는데 내장카메라앱을 사용했음에도 이미지뷰에 로드될때는 90도 회전된 이미지가 보여지더군요.. 그래서 이미지 회전을 구글링해서 다 적용해 보았는데 메모리 부족현상을 해결할 수가 없습니다.
    이 방법으로 이미지를 가져오면 메모리를 많이 차지하게 되는건가요?
    • 한은열
    • 2017.01.05 01:01 신고
    혹시 죄송한데 카메라 불 깜박이는 건 어떻게 소스짜는지 아시나요 ㅠㅠ
    • Flash 말씀하시는건가요?

      setFlashMode라고 있을거에요