티스토리 뷰

MJAndroid 시작 코드와 리소스들

MapView에 Google map api를 통해 현 GPS 위치를 표시하고, job search를 통해

  • Google Map api 사용

    • Google map에 임시직 위치 표시
  • GPS 통한 현 위치 정보 갱신
  • 다양한 메뉴, 버튼, 목록, 이벤트 처리

    • Layout, Button event, Spinner, SQLite

 

AndroidManifest.xml 이 시작점

  • app 컴포넌트(activity, service, intents, content provider, broadcast Receivers, notification, resource manager)의 구조 및 메타데이터를 정의
  • Intent filter와 permissions을 사용해 다른 컴포넌트와 application과 어떻게 상호 작용

 

application package와 version
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.microjobsinc.mjandroid"
  2. android:versionCode="1"
  3. android:versionName="1.0">
  • xmlns: AndroidManifest.xml 을 구성하는 xml의 tag element 정의
  • package: <application...> 이 참조하는 기본 source package 시작점
  • versionCode : 마켓/인스톨러/런처 등에서 app이 최신인지를 판단해서, upgrade 하는 기준이되는 revision code . 정수 1로 시작.
  • versionName: app 의 통상적인 version 이름. m.n.o 형식이 일반적.(major, minor, point )

 

<uses-permission ...>

app이 동작하는 device 의 components 사용을 허가함.

  1. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- location information from GPS -->
    <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- Dialer로 전화 걸기 -->
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <!-- Test할 수 있는 GPS좌표 가능, ddms -->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 어떤 추가 기능인지 명시되어있지 않다 -->
    <uses-permission android:name="android.permission.INTERNET" />

 

Application components

application 콤포넌트들에 대한 선언으로 <application...> tag 사용. 각 sub element로 activity, service, intent, provider, receiver, 등이 존재함.

Google Map api library는 안드로이드 기본 api가 아니기 때문에 아래와 같아 AndroidManifest.xml 에 사용을 허락해야 한다. <uses-library /> 태그를 application, acitivy 사이의 어느곳에서든 선언을 해서 포함해야 한다.

  1.     <application android:icon="@drawable/icon2" android:debuggable="true">
            <uses-library android:name="com.google.android.maps" /> <!-- Google maps library, 외부 라이브러리 추가 -->
  • android:icon="@drawable/icon2" : 외부 자원중 아이콘 (res/drawable/icon2.png)으로 PNG 파일을 읽어 들임.

 

Activity 및 Intent filter

 

  1.         <activity android:name=".MicroJobs" android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" /> <!-- Action이 main entry point -->
                    <category android:name="android.intent.category.LAUNCHER" /><!-- 가장 상위 레벨 launcher에 보여짐 -->
                </intent-filter>
            </activity>
  • android:name : Activity class. 선언된 package에 따른 상대경로와 절대경로 가능.
  • intent-filter : 이 activity 가 시작하게 하는 선언.

    • action : Launcher가 activity 를 시작하게 하는 진입점

      • android.intent.action.MAIN : android app은 MAIN 으로 선언된 activity를 시작점으로 본다.
    • category: intent resolver

 

 

  1.         <activity android:name="MicroJobsList" android:label="@string/list_name">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" /><!-- Action이 view, edit, pick 행위를 가짐 -->
                    <action android:name="android.intent.action.EDIT" />
                    <action android:name="android.intent.action.PICK" /><!-- intent로 넘겨진 activity class -->
                    <category android:name="android.intent.category.DEFAULT" /> <!-- 가장 상위 레벨 launcher에 보여짐 -->
                    <data android:name="vnd.android.cursor.dir/vnd.microjobs.jobs" /> <!-- database -->
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.GET_CONTENT" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <data android:name="vnd.android.cursor.item/vnd.microjobs.jobs" />
                </intent-filter>
            </activity>
            <activity android:name="MicroJobsDetail" android:label="@string/jobs_detail_name">
            ...
            </activity>
            <activity android:name="MicroJobsEmpDetail" android:label="@string/emp_detail_name">
            ...
            </activity>
            <activity android:name="AddJob" android:label="@string/add_job_name">
            ...
            </activity>
            <activity android:name="EditJob" android:label="@string/edit_job_name">
  2.         ...
            </activity>
        </application>

 

 

Layout

 

안드로이드 치수
     px: pixel 10px는 정확히 10픽셀. 스크린 픽셀의 실제 크기와 밀도와 상관없다
           QVGA (320x240)에서 10px는 높이의 1/24를 차지. VGA(640x480)은 10px는 1/64를 차지.
     dip, dp: device-independent pixel. 실제 픽셀 크기와 밀도에 따른 변활르 막기 위한 단위.
          이는 dip dot independent pixel이라고도 부른다. 안드로이드는 160dpi 화면에 나타나는 것과
          똑같은 크기로 그 개체의 크기를 확대/축소 할 수 있다.
          예로 해상도가 640x480, 크기 4x3인치라면 픽셀 밀도는 160dpi므로 10dp 객체는 10px 그대로 보인다.
          그러나 640x480이고 8x6화면은 밀도가 80dpi므로 10dp 개체가 10px짜리 객체보다 두배크다.
          안드로이드가 dp를 확대하거나 축소하는 스케일은 정확친 않고 대략 맞출 뿐이다.
      sp: sclaed pixcel. dp와 비슷, 문자열과 같이 밀도 스케이이 정확해야 하는 개체의 크기를 정할 때 사용
      pts: points.텍스트 에디터 처럼 문자의 크기를 포인트로 정할 때 사용 포인트는 1포인트 1/72인치.
      in: inches
      mm: millimeters

 

안드로이드 색 지정
    #으로 시작해 16진수로 표현한 네 개의 8비트 정수로 끝나는 값.
    Alpha: 투명도, FF는 불투명, 00은 100% 투명
    Red: 빨강의 강도. FF~00
    Green: FF~00
    Blue:

 

View ID

http://developer.android.com/guide/topics/ui/declaring-layout.html#id

id는 xml 에 'id' attribute로 정의되어 컴파일 후에 정수로서 R.java 에서 참조된다.

 

id 선언
  1. android:id="@+id/my_button"
    
  • @ : 파서는 이곳이 리소스 id를 선언하는 곳임을 알게 된다.
    
  • + : 이 id는 새로 작성되어 추가되는 리소스 이름임을 의미한다.(R.java)
    
  • android framework 에 정의된 많은 리소스 id도 있다. 
    
 
id 참조
  1. android:id="@android:id/empty"
    
  • 참조시에는 + 기호는 필요없지만 android package namespace 로 구성해야 한다.

  • @android 로 지정한 namespace는 android.R class 에서 id 정보를 획득하게 된다. 즉, {local package}.R 클래스가 아니다.
    

main.xml

RelativeLayout 을 사용. Layout 내의 뷰와 뷰 사이의 상대적 위치 또는 부모 뷰와의 상대적 위치로 정해진다.

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffc5d1d4" >

Google Map을 표현하는 MapView 를 사용해서 Google Map API를 사용할 수 있다. Map key에 대한 설명은 이어서, RelativeLayout 관련 속성 'android:layout_centerHorizontal...'등등의 설명은

  1. <com.google.android.maps.MapView <!-- uses-library로 지정한 외부 라이브러리인 MapView -->
    android:id="@+id/mapmain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="0P18K0TAE0dO06EiSUFV3K85OJrH6cC1uqSIEYg" /> <!-- google map api key -->
  2. <TextView <!-- 맨 위에 위치 -->
    android:id="@+id/lblMicroJobsToday"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="MicroJobs for You Today Near:"
    android:textSize="20dp"
    android:textColor="#FF000000"
    android:layout_centerHorizontal="true"
    android:gravity="top" /> <!-- 이 요소의 수직 배치를 정함: top, center_vertical, or bottom -->
    <Spinner
    android:id="@+id/spnLocations"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true" <!-- 부모 View(바로 위 수평선에 중앙에 위치함 -->
    android:layout_marginTop="2dp"
    android:layout_below="@+id/lblMicroJobsToday" /> <!-- 상대적으로 lblMicroJobsToday TextView 아래에 위치 -->
    <Button
    android:id="@+id/btnShowList"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:text="List Jobs"
    android:textSize="20sp"
    android:gravity="center_vertical"
    android:layout_centerInParent="true"
    android:layout_alignParentBottom="true" />
    </RelativeLayout>

google map api 관련

Google map api를 사용하기 위해서는 개인 인증 혹은 디버그 인증서를 사용해야만 한다.

Debug 인증서

윈도우즈 위치:

  1. "C:\Documents and Settings\<username>\Local Settings\Application Data\Android"
  2. or
  3. "C:\Documents and Settings\<username>\.android"

리눅스 위치:

  1. $USER_HOME/.android/

아래는 디버그 인증서의 finger print이다.

  1. keytool -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android
    androiddebugkey, 2009. 6. 4, PrivateKeyEntry,
    인증서 지문(MD5): 4E:6F:03:A9:70:C9:A1:A1:FE:19:F5:0C:6B:2F:77:D8

구글 맵 API 키 받기 절차

개인 서명 인증서 혹은 디버그 인증서의 지문(MD5)이 준비되었으면 구글 API 키를 요청할 수 있다.

API 키는 인증서와 동일한 서명을 한 애플리케이션에서만 사용할 수 있다.

1) 서명서의 MD5 finger print

  1. $ keytool -list -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android
    androiddebugkey, 2010. 1. 5, PrivateKeyEntry,
    인증서 지문(MD5): 2A:96:3D:CD:86:D3:D9:E2:45:A2:19:CD:91:1B:F6:AE

2) http://code.google.com/android/maps-api-signup.html

finger print를 붙이고 해당 서명서의 Map API 키를 발급 받는다

  1. 구글 계정이 없어도 발급이 가능하다

Enter the MD5 certificate fingerprint in the textbox and get the API Key (see below image)

apikey_1.png

"Generate API Key" Button 클릭 후 생성된 키를 얻는다.

apikey_2.png

Map API 키를 복사해서 Map activity의 레이아웃 파일에 apiKey의 값으로 입력한다. 아래는 MapView의 예제

  1. <com.google.android.maps.MapView
    android:id="@+id/mapmain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="0P18K0TAE0dO06EiSAFV3K85OJrH6cC1uqSIEYg"
    />

참고

http://www.androidpeople.com/android-google-map-application-example/

http://androidpeople.wordpress.com/2010/01/04/android-google-map-application-example/

Android APK signing 과 내보내기

개인 서명 인증서 만들기

안드로이드 마켓에 배포를 하기 위해서는 애플리케이션에 서명을 해주어야 한다. 자신이 인증하는 애플리케이션임을 서명을 통해서 알리는 것이다.

그러기 위해서는 개인 키를 포함하는 암호화된 서명 파일이 있는 keystore가 필요하고 이를 JDK에서 제공하는 jarsigner 로 공개키로 서명하게 된다.

이클립스에서 Android SDK를 통해서 애플리케이션을 실행할 때마다 자동으로 디버그 서명을 만들고 이 서명이 애플리케이션이 사용될 때마다 서명되기 때문에 눈에 보이지는 않지만 항상 애플리케이션을 서명되고 있다.

  • 디버그 서명 위치: ~/.android/debug.keystore

애플리케이션 서명과 구글API 키 인증 시나리오

keytool로 키 쌍을 생성하면 사용자 홈 디렉토리의 특정한 곳에 keystore로서 저장된다. 비밀 키는 키 저장소에 암호화 되어 보호되며 이 비밀 키로 애플리케이션을 서명하게 된다. - 특정 조직의 경우 공인 인증서 이용 -

구글 API를 이용하려면 API용 키가 필요한데 이 때 인증 서명서의 finger print(MD5)가 필요하다

안드로이드는 공개 키를 이용하여 서명 인증서를 해독하여 사용하는데 애플리케이션이 설치 될 때만 서명 인증서를 검사하기 때문에 설치 후에는 인증서나 키가 만료되도 실행이 가능하다.

개인 인증서의 효용

본인이 개발한 애플리케이션임을 알리고 관리를 위해서는 가능하면 하나의 인증서로 관리하는 것이 편리할 것이다.

  • 업그레이드 간편화
  • 여러 애플리케이션을 하나의 프로세스로 실행
  • 코드, 데이터 공유

서명 인증서 만들기
key store 생성
  1. keytool -genkey -v -keystore myandroid.keystore -alias mykeystore -keyalg RSA -validity 10000
  • 키 쌍을 만들며 myandroid.keystore에 저장 며 이 키는 mykeystore 라는 이름으로 접근이 가능하다. 키를 만드는 알고리즘은 RSA이고 10000일(27년)간 유효하다.

finger print 확인

keytool -list 로 SDK의 인증서의 MD5 지문을 확인 할 수 있다.

  1. keytool -list -alias mykeystore -keystore myandroid.keystore
  2. keystore 암호를 입력하십시오:

애플리케이션 서명

1_ 먼저 서명이 안된 애플리케이션(.apk)를 만든다: Eclipse에서 프로젝트 선택후 컨텍스트 메뉴(오른쪽 마우스 클릭)에서 Android Tools -> Export Unsigned Application Package..

2_ 개인키 저장소에 있는 키(비밀키)로 서명한다

  1. jarsigner -verbose -keystore mykey.keystore Myandroid.apk mykeyalias

Activity

MapView를 사용하기 위해 MapActivity를 제공.

  1. public class MicroJobs extends MapActivity {

Activity 의 첫 생애주기인 onCreate()에서 Activity가 생성. Bundle은 key/value 쌍의 액티비티 간의 데이터 전달 방법으로, 현재 Activity에서 사용 안하므로, super에서 초기화 한다. 그리고 실제 UI에

  1. @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

1_ 지도를 표현하기 위해 필요한 인텐트를 만든다

  1. new Intent(String action, Uri uri)

  • action: ACTION_VIEW로 정의
  • uri : 아래와 같은 구성표를 갖는다

    • geo:latitude, longitude
    • geo:latitude, longitude?z=zoom
    • geo:0,0?gmy_street_address
    • geo:0,0?qbusiness_near_city

2_ 새로운 인텐트로 startActivity()를 호출한다.

  1. Intent intent = new Intent(ACTION_VIEW, "geo:37.xxxxx, -120.xxxx");
  2. startActivity(intent);

MapView

Activity 에는 하나의 MapView를 가질 수 있고, 상속을 해야 한다. api에서 제공하는 MapAcitivy에서 이용...

MapView의 종류

  • 스트리트 뷰
    북미지역의 거리
  • 위성사진 뷰
  • 교통정보 뷰
댓글