안녕하세요. 제임스 입니다. 


이번에는 안드로이드 개발을 위한 개발환경 설정에 대해 정리 하겠습니다. 


■ Java JDK 설치

기본적으로 Java JDK 가 설치 되어 있어야 합니다. 

JDK 설치는 아래 오라클 홈페이지의 Java 설치 페이지로 이동 하시면 됩니다. 

http://www.oracle.com/technetwork/java/javase/downloads/index.html



Java Platform (JDK) 8uXXX 를 선택합니다. 


동의 후 PC 버전을 선택하여 다운로드를 시작 하시면 됩니다. 

필자의 PC 는 64비트 이므로 x64 를 선택했습니다. 

참고로 32비트의 경우 x86 을 선택 하시면 됩니다. 


설치 파일을 받으신후 프로그램 설치는 Setup Wizard 따라서 그냥 설치 하시면 되는 전혀 어렵지 않은 과정이므로 생략 합니다. 



■ 개발 툴 설치

개발 툴인 Android Studio 를 아래 링크에서 다운로드 받으시면 됩니다. 

https://developer.android.com/studio/index.html


툴 설치는 Setup Wizard 가 안내하는 대로 그대로 따라 가시기만 하면 간단히 설치 가 되므로 특별히 언급하지 않겠습니다. 


다만 일부 Windows 시스템에서는 JDK 가 설치된 위치를 런처 스크립트가 찾지 못하는 경우가 있다고 합니다. 이 문제가 발생하면 올바른 위치를 나타내는 환경변수를 설정해주면 됩니다. 


Start 메뉴 > 컴퓨터 > 시스템 설정 > 고급 시스템 설정 > 고급 탭  > 환경 변수 를 클릭 하여 JDK 폴더 (예: c:\Program Files\Java\jdk1.8.1_21)를 가리키는 새 시스템 변수 JAVA_HOME 을 추가 하시면 됩니다. 


아래 동영상은 설치 방법입니다. 안드로이드 개발자 사이트에 있는 동영상입니다.


출처 : https://developer.android.com/studio/install.html



기존에는 Java 개발자들에게 아주 친숙한 eclipse 를 사용하여 안드로이드 개발이 가능 하였지만 얼마전부터 eclipse 에 대한 ADT (Android Developer Tool) 지원을 끊어 버렸습니다. 

https://android-developers.googleblog.com/2016/11/support-ended-for-eclipse-android.html


위 링크를 확인 해보시면 2015년 연말에 이미 더이상의 지원을 하지 않을 것이라고 공지 했었음을 명시하고 현재는 지원을 하고 있지 않음을 이야기 하고 있습니다. 



그래서 이제는 더이상 eclipse 를 IDE 로 추천하지 않습니다. 

대신 구글에서 official IDE 로 Android Studio 를 내세우고 있습니다. 그만큼 강력한 개발 툴임은 확실합니다. 물론 eclipse 를 사용하시던 분들에게는 Android Studio 의 단축키가 정말 어렵게만 느껴 질수 있지만 eclipse 단축키를 그대로 사용 하는 방법도 있습니다. 


Android Studio 단축키 및 eclipse 단축키 사용하기 포스트 내용 확인하러 가기



이제 개발 준비가 끝나셨습니다. 

시작이 반이라고 이미 안드로이드 개발자라고 하실수... 있었으면 좋겠지만, 아직 갈 길이 멀게 느껴집니다. 


혼자서 멋드러진 앱을 만들수 있는 그날까지 열심히 강좌를 올리도록 하겠습니다. 

감사합니다. 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,
History of Android

안녕하세요. 제임스 입니다. 

이번 내용은 가볍게 안드로이드 버전별 역사에 대해 간략히 정리 하고자 합니다. 

쓸데 없이 왜 이런 내용을 다루느냐고 하시지 마시고 꼭 잘 봐두시길 바랍니다. 


안드로이드는 버전별로 지원하는 API 가 많이 다르고 버전에 따라 시스템 접근 권한도 다르기 때문에 응용프로그램(애플리케이션)을 개발 하실 때 어느 버전의 안드로이드 OS를 타겟으로 개발 할 것인지 정하는 것이 정말 중요 합니다. 


■ 안드로이드 버전별 역사 (History of Android OS)

많은 분들이 알고 계시겠지만 안드로이드 코드네임은 디저트 명으로 정해지고 있습니다. 

현재는 A 부터 N 까지 나와 있는 상태이며 아래와 같이 나열할 수 있습니다. 

Aestro, Blender, Cupcake, Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwitch, Jelly Bean, KitKat, Lollipop, Marshamallow 그리고 마지막으로 Nougat 까지 발매된 상태 입니다. 





■ 안드로이드 버전 정보 

 Platform Version

API Level 

VERSION_CODES

 Android 7.0 Nougat

24 

 N 

 Android 6.0 Marshmallow

23 

 M

 Android 5.1 Lollipop

22 

 LOLLIPOP_MR1 

 Android 5.0 Lollipop

21 

 LOLLIPOP 

 Android 4.4W Kitkat Watch

20 

 KITKAT_WATCH 

 Android 4.4 Kitkat

19 

 KITKAT 

 Android 4.3 Jellybean

18 

 JELLY_BEAN_MR2 

 Android 4.2 Jellybean

17 

 JELLY_BEAN_MR1 

 Android 4.1 Jellybean

16

 JELLY_BEAN 

 Android 4.0.3 

 Ice Cream Sandwich

15

 ICE_CREAM_SANDWICH_MR1 

 Android 4.0

 Ice Cream Sandwich

14 

 ICE_CREAM_SANDWICH

 Android 3.2 Honeycomb

13 

 HONEYCOMB_MR2 

 Android 3.1.x Honeycomb

12 

 HONEYCOMB_MR1 

 Android 3.0.x Honeycomb

11 

 HONEYCOMB 

 Android 2.3.3 Gingerbread

10 

 GINGERBREAD_MR1 

 Android 2.3 Gingerbread

 GINGERBREAD 

 Android 2.2 Froyo

 FROYO 

 Android 2.1 Eclair

 ECLAIR_MR1 

 Android 2.0.1 Eclair

 ECLAIR_0_1 

 Android 2.0 Eclair

 ECLAIR 

 Android 1.6 Donut

 DONUT 

 Android 1.5 Cupcake

 CUPCAKE 

 Android 1.1 Petit Four

 BASE_1_1 

 Android 1.0 (No Code Name)

 BASE 


※ Platform Version : 일반적으로 이야기 할때 쓰는 버전정보


※ API Level : 숫자 값으로 정해진 버전별 ID 값이라고 생각 하면 됩니다. Android 코드로 뽑아 낼때는 아래와 같이 사용 합니다. 

android.os.Build.VERSION.SDK_INT


※ VERSION_CODES : 숫자 값으로 맵핑 된 enum 값입니다. 사용 방법은 아래와 같습니다. 

android.os.Build.VERION_CODES



각 함수 및 코드 사용법은 추후 관련 내용을 다룰때 자세히 언급 하도록 하겠습니다. 



■ 앱 개발 시 유의 사항

안드로이드 앱 빌드시 꼭 체크 하셔야 하는것들이 바로 아래 두가지 입니다. 


minSdkVersion : 최소 API 레벨을 지정 하는 것으로 만약 9 로 적용 할 경우 진저브레드 2.3 이상 단말에서만 해당 앱을 설치 실행 할 수 있음을 의미 합니다. 


targetSdkVersion : 대상 API 를 설정 하는 것으로 설정하지 않을 경우 minSdkVersion 의 값과 동일한 값을 사용하게 됩니다. 

향후 상위 버전 OS 가 출시 되더라도 지정된 버전과의 호환성을 유지 하도록 호환성 동작을 활성화 하지 않도록 시스템에 알리는 역할을 합니다. 


위 두가지 값을 설정 하는 이유는 앱의 성격에 따라, 대상 연령층에 따라 그리고 개발 앱의 특성에 따라 최소 SDK 설정을 해주어야 합니다. 


예를 들자면, 주거래 고객의 연령층이 높은 금융권 앱이라면 minSdkVerion 을 최소로 낮춰 보통 9 이상으로 잡습니다. 이럴 경우 8 이전 버전의 OS 가 설치된 단말 사용자는 구글 플레이에서 해당 앱을 검색할 수 없게 됩니다. 




지금까지 간단히 안드로이드 버전에 따른 히스토리를 정리 했습니다. 

좀더 디테일한 사용 법은 추후 관련 내용 작성 시 추가 하도록 하겠습니다. 


아래 링크는 안드로이드 히스토리 관련내용을 재미있게 만들어 둔 android official site 입니다. 한번 놀러 가보세요 ^^

https://www.android.com/history/#/donut

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

Android Development Guide




■ 안드로이드란 무엇인가? (What is Android?)

Android는 오프소스로 모바일(스마트폰등)과 태블릿 PC 등의 기기를 위한 Linux 기반 운영체제 입니다. Android는 리눅스 기반 운영체제 이나 응용 프로그램은 Java 를 사용 하여 작성 할 있도록 개발 하였으며 소프트웨어 개발키트 (SDK - Software Development Kit)를 통해 응용 프로그램을 개발하기 위해 필요한 각종 도구들과 API 를 제공하고 있습니다. 



■ 대상 (Target Audience)

앞으로 필자가 작성해 나갈 내용은 안드로이드 개발 초보자들을 위한 내용이며 중간중간 심화 과정도 포함할 예정입니다. 

이 가이드가 끝나는 시점에는 훌륭한 안드로이드 개발 기술을 보유한 상태일 것입니다. 

 


■ 전제조건 (Prerequisites)

안드로이드가 무엇인가라는 섹션에서도 언급했지만 안드로이드는 Java 프로그래밍 언어로 응요프로그램을 개발 할 수 있습니다. 즉, 기본적으로 Java 를 이해 하시고 계셔야 필자가 작성하는 개발 가이드를 이해 하고 따라 오실수 있으며, 더 재미있게 안드로이드 개발을 하실 수 있습니다. 






안녕하세요. 제임스 입니다. 


앞으로 장기간에 걸쳐 안드로이드 개발 가이드를 포스팅 하고자 합니다. 

이와 더불어 시간이 나면 다른 언어들도 하고 싶은 생각이 있지만 너무 의욕만 앞세우다 이도 저도 아닌 어정쩡한 상황이 될수 있겠죠? 

우선은 안드로이드 부터 시작 하겠습니다. 앞으로 잘 준비 해서 많은 분들이 안드로이드 개발에 입문 하고 나아가 좋은 앱을 개발 할 수 있는 초석이 될 수 있도록 좋은 글, 좋은 예제를 준비 하도록 하겠습니다. 


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안드로이드 앱 개발 중 꼭 한번 정도씩은 필요한 기능 중 한가지가 바로 내 폰이 부팅 되는 시점에 내가 만든 앱을 실행 시키는 것입니다. 


Android 앱의 Life Cycle 을 아시는 개발자라면 잘 아시겠지만 내가 만든 앱이 동작을 하기 위해서는 사용자가 직접 실행을 시켜 줘야만 합니다. 

하지만 경우에 따라서는 사용자 승인 하에 앱이 단 한번이라도 실행 되게 되면 그 이후에는 사용자가 신경 쓰지 않아도 단말이 재부팅 되더라도 실행 되어야 하는 경우가 있습니다. 


예를 들자면 헬스 보조 앱이나 알람 같은 경우가 있습니다.


이와 같은 경우를 위해 Android 폰 부팅 시 내가 만들 App을 실행 시키는 방법에 대한 내용을 정리 합니다. 



1. 우선 BroadcastReceiver 를 상속 받는 MyReceiver 클라스를 하나 생성하여 모바일 단말의 부팅이 완료된 경우의 액션을 정의 합니다. 


여기서 android.intent.action.BOOT_COMPLETED 메세지는 모바일 단말의 부팅이 완료 되었다는 메세지 이며 이 메세지를 받았을 경우 MainActivity 를 실행 시켜 주는 기능을 합니다. 


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals("android.intent.action.BOOT_COMPLETED")){
Intent i = new Intent(context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}

}


2. AndroidManifest.xml 에 RECEIVE_BOOT_COMPLETED 권한을 추가 합니다.

 receiver 에는 생성한 클라스명인 MyReceiver 를 등록 하고, intent-filter 에 우리가 사용할 BOOT_COMPLETED 메세지를 추가 해줍니다. 

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>


3. MainActivity 클라스에 본인이 원하는 동작을 구현하고 앱을 빌드하면 개발 완료입니다. 



이제 앱을 실행 하면 리시버가 등록이 되고 앱을 종료 하더라도 단말이 재부팅 되면 broadcast receiver 가 BOOT_COMPLETED 메세지를 받아 내 app 의 MainActivity 를 실행 하게 되면 정의한 동작을 수행하게 됩니다. 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

안드로이드 마시멜로 이상 단말에서는 앱을 사용하기 전, 해당앱에서 사용 하는 기능들에 대한 사용자의 승인을 받아야 한다. 


만약 앱에서 사용하는 기능들이 여러가지 있으나 그중 한가지 이상의 사용자 승인을 받지 않거나 사용자가 승인 거부를 했을 경우 해당 기능을 사용하려 할 경우 오류 발생으로 인한 강제 종료 현상이 발생 할 수도 있다. 물론, 승인 거부를 한 경우 해당 기능을 앱 내부에서 사용하지 못하도록 막을 경우 오류로 인한 강제 종료 현상이 발생 하지 않는다.


그러므로 앱에서 사용 하고자 하는 모든 권한에 대한 정의 및 사용자에게 해당 기능의 사용 승인을 꼭 받아야 한다. 






사용방법


1. AndroidManifest.xml 에 아래와 같은 uses-permission 설정

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.CAMERA" />


2. 퍼미션 요청

private void requestPermissions(){
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_CONTACTS)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
}
}

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.RECEIVE_SMS)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.RECEIVE_SMS}, MY_PERMISSIONS_REQUEST_PROCESS_RECEIVE_SMS);
}
}

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA)) {

} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_PROCESS_CAMERA);
}
}

}


3. 요청한 퍼미션의 결과 처리 (onRequestPermissionResult 호출)

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
case MY_PERMISSIONS_REQUEST_PROCESS_RECEIVE_SMS: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
case MY_PERMISSIONS_REQUEST_PROCESS_CAMERA: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
requestPermissions();
} else {
// 이 퍼미션과 관련된 기능 사용하지 못하도록 처리 (그렇지 않을 경우 강제 종료 현상 발생)
}
return;
}
}
}



위와 같이 처리 하는 방식도 있지만 그렇지 않고 permission 들을 array 에 담아서 처리 하는 방식도 있다. 


Runtime Permission 관련하여 아래 링크에서 자세히 설명하고 있다.

https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,