안드로이드에서는 구글 지도를 앱과 연동하는 방법을 ... - KOCw

11
123 17. 구글 맵 안드로이드에서는 구글 지도를 앱과 연동하는 방법을 제공하고 있다. 지도를 사용하기 위해서는 레이아웃에 다음과 같은 map fragment 추가해야 한다. <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> 지도 서비스를 이용하기 위해서는 약간의 퍼미션과 구글 MAP API 사용하기 위한 값을 매니패스트 파일에 제공해야 한다. 예는 다음과 같다. 지도의 특정 위치에 마커를 넣을 있는데, 다음과 같이 마커를 넣을 있다. mMap = googleMap; // Add a marker in Sydney and move the camera LatLng seoul = new LatLng(37, 127); mMap.addMarker(new MarkerOptions().position(seoul).title("Marker in Seoul")); 구글 지도의 보여주는 방식은 일반, 혼합, 위성, 지형의 4 가지 방식을 지원한다. 이를 프로그램 코드에서 설정할 있으며 다음과 같다. googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 구글지도에서 줌인 줌아웃 제스쳐를 지원하기 위해서는 다음의 메소드를 사용한다. googleMap.getUiSettings().setZoomGesturesEnabled(true); 예제 ) 구글 지도 활용하기 1) 프로젝트를 생성한다. 여기서 프로젝트는 여지까지 했던 Empty Activity 아닌 Google Map Activity 선택한다. 2) 생성된 프로젝트에서 google_maps_api.xml 파일이 열리게 되면 부분 주소를 복사하여 브라우저 주소창에 붙여 해당 주소로 이동한다.

Transcript of 안드로이드에서는 구글 지도를 앱과 연동하는 방법을 ... - KOCw

123

17. 구글 맵

안드로이드에서는 구글 지도를 앱과 연동하는 방법을 제공하고 있다.

지도를 사용하기 위해서는 레이아웃에 다음과 같은 map fragment를 추가해야 한다.

<fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/>

지도 서비스를 이용하기 위해서는 약간의 퍼미션과 구글 MAP API를 사용하기 위한 키 값을

매니패스트 파일에 제공해야 한다. 그 예는 다음과 같다.

지도의 특정 위치에 마커를 넣을 수 있는데, 다음과 같이 마커를 넣을 수 있다.

mMap = googleMap; // Add a marker in Sydney and move the camera LatLng seoul = new LatLng(37, 127); mMap.addMarker(new MarkerOptions().position(seoul).title("Marker in Seoul"));

구글 지도의 보여주는 방식은 일반, 혼합, 위성, 지형의 4가지 방식을 지원한다. 이를

프로그램 코드에서 설정할 수 있으며 다음과 같다.

googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE); googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);

구글지도에서 줌인 줌아웃 제스쳐를 지원하기 위해서는 다음의 메소드를 사용한다.

googleMap.getUiSettings().setZoomGesturesEnabled(true);

예제 ) 구글 지도 활용하기

1) 프로젝트를 생성한다. 여기서 프로젝트는 여지까지 했던 Empty Activity 가 아닌

Google Map Activity로 선택한다.

2) 생성된 프로젝트에서 google_maps_api.xml 파일이 열리게 되면 이 부분 주소를

복사하여 웹 브라우저 주소창에 붙여 해당 주소로 이동한다.

124

3) 아래 화면이 나타날 때 까지 계속 진행한다.

4) API 만들기를 선택하면 다음과 같은 화면이 뜬다.

5) 여기서 나오는 API 키를 복사하여 안드로이드 스튜디오의 매니페스트 파일의 해당

부분(검은 색 줄로 그어 있는 부분)에 붙인다.

125

6) activity_main.java의 onMapReady() 메소드에 다음의 내용을 추가한다. 아래 내용은

지도로 보여줄 부분과 마커에 대한 내용을 지정하는 것이다.

public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // 마커를 동국대로 위치시키고 카메라를 이동시킴 LatLng dongguk = new LatLng(37.55827, 126.998425); // 마커에 대한 옵션 설정 MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(dongguk); markerOptions.title("동국대학교");

markerOptions.snippet("지금 있는 곳"); mMap.addMarker(markerOptions); // 줌 기능 활성화 mMap.getUiSettings().setZoomGesturesEnabled(true);

// 현재 위치로 이동 mMap.moveCamera(CameraUpdateFactory.newLatLng(dongguk));

// 줌 레벨 설정 mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); }

7) 프로젝트를 실행한다.

126

18. 카메라 다루기

안드로이드에서 카메라를 다루는 방법은 두 가지이다. 하나는 스마트폰의 기존 앱을

활용하는 것이고 다른 하나는 새로운 카메라 앱을 만드는 것이다. 많은 코딩 작업 없이

앱에서 사진이나 비디오를 찍을 수 있도록 하는 방법은 intent를 사용하여 기존의 앱을

활용하도록 하는 것이다. 여기서는 기존의 앱을 활용하여 카메라 작업을 하는 방법을

다룬다.

기존의 앱을 활용하여 동영상 촬영하기

우선 AndroidManifest.xml 파일에 <uses-feature> 태그를 삽입하는 것이 필요하다. 이

태그를 통해 앱은 시스템에 카메라 기기를 다룰 것이라는 것을 시스템에 알리게 된다.

<uses-feature android:name="android.hardware.camera" android:required="true" />

다음 단계는 intent를 사용하여 기존의 카메라 녹화 앱을 불러오는 것이다. Intent를

활용하는 방법은 세 가지 단계로 나누어 지는데, 우선 카메라를 다루는 Intent를 작성하고,

Activity을 시작하는 함수를 호출하며, 카메라 앱 실행이 끝나고 다시 앱으로 돌아왔을

때 결과물인 이미지 데이터를 처리하는 단계를 말한다. 이에 대한 내용은 다음과 같다.

private void dispatchTakeVideoIntent() { Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if(takeVideoIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); } }

위의 코드를 보면 startActivityForResult() 메소드를 호출하기 전에

resolveActivity()를 통해 무언가를 체크하고 있다. 이 이유는 만약 카메라로 동영상을

녹화하는 앱이 스마트폰에 없을 경우 앱의 실행에 문제가 생기므로 이를 방지하기 위한

것이다. resultActivity()의 결과가 null이 아닌 경우 카메라를 통해 녹화하는 앱이

있다는 의미이므로 액티비티를 실행해도 안전하다.

마지막 단계는 비디오를 볼 수 있도록 하는 부분을 구현하면 된다. 이를 위해서 먼저

레이아웃에 VideoView 위젯을 올려야 하며, onActivityResult()에 비디오를 보여 줄 수

있는 부분을 작성하면 된다.

예제) 비디오 녹화 앱 구현

1) 프로젝트를 생성한다.

127

2) 매니페스트 파일에 <uses-feature> 태그와 그에 대한 아래와 같이 내용을 작성한다.

<uses-feature android:name="android.hardware.camera" android:required="true" />

3) 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"> <VideoView android:id="@+id/videoView" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="0dp" /> </androidx.constraintlayout.widget.ConstraintLayout>

4) MainActivity.java파일에 intent관련 부분, intent 결과 처리 부분, video view

위젯 부분을 다음과 같이 추가한다.

public class MainActivity extends AppCompatActivity { static final int REQUEST_VIDEO_CAPTURE = 1; VideoView videoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); videoView = (VideoView)findViewById(R.id.videoView); dispatchTakeVideoIntent(); } private void dispatchTakeVideoIntent() { Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); if(takeVideoIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); }

128

} @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if(requestCode == REQUEST_VIDEO_CAPTURE && requestCode == RESULT_OK) { Uri videoUri = data.getData(); videoView.setVideoURI(videoUri); } } }

5) 프로젝트를 실행한다.

기존의 앱을 활용하여 사진 찍기

기본적인 방법은 사진을 찍는 방식과 매우 유사하다. 먼저 앱에서 사진을 찍기 이전에

AndroidManifest.xml 파일에 <uses-feature> 태그를 통해 앱이 스마트폰의 카메라를

다룬 다는 것을 명시해야 한다.

<uses-feature android:name="android.hardware.camera" android:required="true" />

Intent를 활용하는 방법은 앞의 동영상을 찍는 앱과 마찬가지로 세 가지 단계로 나누어

지는데, 우선 카메라를 다루는 Intent를 작성하고, Activity을 시작하는 함수를 호출하며,

카메라 앱 실행이 끝나고 다시 앱으로 돌아왔을 때 결과물인 이미지 데이터를 처리하는

단계로 구성된다. 이중 intent를 작성하고 이를 시스템에 알리는 작업에 대한 코드는

다음과 같다.

private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(takePictureIntent.resolveActivity(getPackageManager())!=null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } }

사진앱으로 사진을 찍은 후 앱으로 다시 돌아 왔을 때, 사진의 이미지가 썸네일로

보여진다면 좋을 것이다. 아래 코드는 그에 대한 내용이다. onActivityResult()는

콜백함수로 카메라 앱의 실행이 끝나면 호출된다. onActivityResult()에 결과값으로

보내진 Intent는 “data”라는 영역에 비트맵 이미지를 포함하고 있다. 따라서 이 값을

활용하면 된다.

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

129

Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); imageView.setImageBitmap(imageBitmap); } }

카메라 앱을 통해 찍은 사진은 파일로 만들어 스마트폰의 저장장치에 저장해야 할 것이다.

일반적으로 카메라가 찍은 사진들은 모든 앱들에게 접근이 가능한 public 장소에 저장된다.

이 장소는 시스템에 의해 설정된 장소로서 getExternalStoragePublicDirectory()에

의해 위치를 파악할 수 있다. 또사진을 저장하기 위해서는 WRITE_EXTERNAL_STORAGE

권한이 필요하다. 따라서 매니패스트 파일에 이 권한을 명시해 준다.

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

다음은 파일을 저장하는 루틴을 아래와 같이 만들어 준 후 이를 위에서 작성한 intent

부분과 합쳐준다. 아래의 루틴은 사진 파일 이름을 사진 파일이 생성된 시간을 사용하여

랜덤하게 정해준 후 적절한 장소(getExternalStoragePublicDirectory()에서 지정하는

장소)에 저장하는 작업을 한다.

private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents currentPhotoPath = image.getAbsolutePath(); return image; }

하지만 이미지 파일을 처리하는 방법은 안드로이드에서 간단하지는 않으므로

Glide(https://bumptech.github.io/glide/)나 또는 다른 3rd 파티에서 제공하는 이미지

라이브러리를 사용하는 것이 좋다. 기능도 많고 편리하게 이미지 파일을 처리할 수 있도록

구성되어 있다.

130

19. 안드로이드 앱 등록

여러분들이 만든 앱들은 안드로이드 앱의 등록을 통해 다른 사용자들이 사용할 수 있도록

한다. 앱 등록은 앱 개발의 마지막 단계로 안드로이드 앱의 개발 주기는 다음 그림과 같이

coding->add building->testing->signing->deploying의 5 단계로 표현될 수 있다.

Coding은 프로그래밍 하는 작업을 의미하며 코딩이 끝난 프로그램은 Building과정을

거쳐 실행가능한 앱으로 만들어야 한다. 이 앱은 원하는 기기에서 높은 수준의 안정성을

가지고 동작할 수 있어야 하며 이는 충분한 테스팅 과정을 수반한다.

여러분들이 만든 앱이 충분한 테스트를 거쳐 안정적으로 사용가능하다면 구글 플레이를

이용하여 여러분들의 앱을 판매하거나 또는 무료로 배포할 수 있다. 이 때 먼저 구글

플레이에 이용자 등록을 하여야 하며 이 과정을 Signing 과정이라고 말할 수 있다.

최종적으로는 앱을 구글 플레이에 올리는 과정으로 앱 개발과정은 완료된다.

또한 완성된 앱은 구글 플레이에 올려서 배포하기 전에 몇 가지 점검을 해야 한다. 다음은

앱을 배포하기 이전에 점검해야 하는 체크 리스트이다.

131

항목 설명

Regression Testing 앱을 등록하기 전에, 기본적인 앱 품질 기준을

만족시켜야 한다. 특히 목표로 하는 스마트폰 기기의 잘

동작하는 지 여부를 충분히 테스팅 해야 한다.

Application Rating 앱의 사용 가능 연령을 설정해야 한다. 현재의 연령

기준은 1) 전체이용가능 2) 만 3세 이상 3) 만 12세

이상 4) 만 18세 이상 으로 구분된다.

Target Region 앱이 사용될 지역을 설정한다.

App Size 앱의 최대 크기는 50MB 로 제한되어 있다. 만약 그

크기를 초과한다면 APK Expansion Files를 사용해야

한다.

SDK와 화면 호환 사용을 원하는 기기에 맞는 개발 버전과 화면 크기를

구성해야 한다.

가격 유료로 할 지 무료로 할 지를 결정해야 한다. 무료인

경우 계속 무료로 제공해야 하므로 신중하게 결정해야

하며 유료인 경우 가격을 여러 화폐에 맞추어 제공할 수

있어야 한다.

앱 정보 제공 구매자가 충분히 앱을 파악할 수 있도록 사용 화면을

제공해야 한다.

Release ready APK 앱을 배포할 때에는 release ready 버전으로 배포해야

한다.

앱 상세 설명 구글 플레이의 앱 정보 란에 구매 또는 사용 의욕을 높일

수 있도록 친절한 정보와 사진들, 동영상 들을 제공할

수 있어야 한다.

앱 개발이 완료되고 충분한 테스트로 앱의 검증이 완료되었다면 앱을 구글 플레이에

올리기 전에 앱을 APK 파일로 만들어야 한다.

이를 위해서는 다음의 도구들이 필요하다.

DX tools(Dalvik executable tools): .class 파일 (자바 컴파일 후 생성되는

파일)을 .dex파일로 변환하는데 사용된다. .dex 파일은 메모리 최적화와 앱 시작

속도를 높이는 데 유용하다.

AAPT(Android assistance packaging tool): .dex 파일을 .APK파일로 변환한다.

132

APK(Android packaging kit): 최종 산출물은 .apk 로 저장된다.

앱을 export하는 단계는 다음과 같다.

1) 안드로이드 스튜디오에서 Build->Generate Signed APK 를 선택 실행한 후

Android App Bundle을 선택 ‘Next’를 선택한다.

2) 아래 화면에서 key store path와 password를 설정한다. Key store path는

여러분 들의 컴퓨터에서 임의의 경로로 설정한다.

3) 아래 화면에서 release를 선택한다.

133

4) 구글 플레이 에 등록한다. 등록에는 구글 ID 가 필요하며 $25 의 등록비가

필요하다.

5) 구글 플레이에 등록이 완료되었다면 안드로이드 스튜디오에서 생성한 APK파일을

만들어 올린다. 앱을 올릴 때 자료화면, 스크린 샷, 설명 등의 내용을 필요로 하니

참고한다.