'android'에 해당되는 글 36건

  1. 2013.03.12 [android:windowSoftInputMode] soft keyboard 설정 옵션들
  2. 2013.03.11 [android] GCM을 이용해서 push 구현및 browser로 동작하는 방법 5
  3. 2013.03.07 단말기에(주로 tablet) 설치된 library에 따라 동적으로 처리하기.
  4. 2013.03.07 Android Build Target 설정, AVD의 TargetName 설정 1
  5. 2013.03.06 [AndroidManifest.xml] uses-permission과 uses-feature의 관계 5
  6. 2013.02.01 안드로이드 json 속도 비교

[android:windowSoftInputMode] soft keyboard 설정 옵션들

android 2013. 3. 12. 16:41

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 2013-03-12

작성자 : hanburn

 

 

1. android:windowSoftInputMode 이란?

Activity main window soft keyboard와 어떻게 interact 하는지 설정 할 수 있다.

설정할 수 있는 것은 2가지 이다.

 

첫째, 소프트키보드의 visible 상태를 설정

둘째, activity의 윈도우 조절 옵션 ( resize 하거나 pan 하거나 등등 )

 

아래에서는 state 계열과 adjust 계열의 속성으로 구분하였는데, 그 이유는.. 각 계열마다 하나의 속성만 정의 해야 한다. 만약 stat 계열의 속성을 복수로 지정하면 그 동작은 undefined 되어 있다고 한다. 복수로 지정할 수 있는 것은 stat 계열 1개와 adjust 계열 1개의 조합만 가능하다.

 

올바른 예

<activity android:windowSoftInputMode="stateVisible|adjustResize" >

 

잘못된 예

<activity android:windowSoftInputMode="stateVisible|adjustResize|stateHidden" >

위의 예처럼 state 계열은 visible 에 대한 것이므로 상반된 2개의 속성을 표시하면 안드로이드는 랜덤하게 동작하게 된다.

 

 

2. state 계열 속성

 

Value

Description

"stateUnspecified"

soft keyboard 보일지 말지 정하지 않고, system theme 따라서 선택하도록 한다. 설정이 기본 설정값이다.

"stateUnchanged"

soft keyboard 마지막 상태를 유지하도록 한다.

"stateHidden"

soft keyboard hidden 상태가 되게 한다. 다른 activity에서 back 버튼으로 활성화 되는경우보다 forward 활성화 되는 경우( 새로 activity 뜨는 경우)

"stateAlwaysHidden"

soft keyboard 항상 hidden 상태로 ( Activity main window foucus될때 )

"stateVisible"

soft keyboard visible 상태로 ( navigateing forward to )

"stateAlwaysVisible"

soft keyboard visible 상태로 ( 뒤로가기 제외 )

 stateHidden은 다른 액티비티에서 뒤로가기 버튼으로 navigation 되었을때는 동작을 않하게 된다. 반면에 stateAlwaysHidden은 뒤로가기 버튼으로 해당 액티비티가 foreground 되어도 동작한다.

 

3. adjust 계열 속성

 

Value

Description

"adjustUnspecified"

Resize pan 정하지 않고 system 설정에 따라서 자동으로 선택하게 한다.

기본 설정값이다.

"adjustResize"

화면의 soft keyboard 맞춰서 항상 resize 되도록 한다. (EditText 안보일 수도 있음. )

"adjustPan"

EditText 창을 가리지 않고, EditText 부분이 화면에 보이도록 레이아웃이 위로 스크롤된다.

 

늘 그렇듯이 android의 developer page를 항상 참고해야 한다.

참고 : http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

 

추가로 Keyboard가 가로모드시 화면을 모두 덮어 버리면, EditText의 android:imeOptions="flagNoExtractUI" 를 설정



:

[android] GCM을 이용해서 push 구현및 browser로 동작하는 방법

android 2013. 3. 11. 19:10

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 2013-03-11

작성자 : hanburn

 

이 글은 아래의 page를 기초로 해서 작성 되었습니다.

http://developer.android.com/google/gcm/gcm.html

 

여기서는 간한하게 테스트를 위해서 third-party application server가 없이 진행 하도록 하겠습니다. 보통은 서버를 구성하여 push 메시지를 보내고, 전송 상태등을 조회할 수 있는 기능을 만들지만 여기는 GCM-client 위주로 기술하기 때문에 직접 web browser로 메시지를 보내도록 하겠습니다.

 

0. 용어정리  

Registration ID : 단말기를 GCM 서버에 등록하고 나서 받는 key . GCM 서버에서 단말기를 구분하는 값이다. Push 요청을 할 때 이 key를 보내서 특정 단말에만 push 가 가도록 할 수 있다.

Sender ID : 구글 API Console에서 프로젝트를 등록하고 나서 얻을수 있다. 의미상으로는 Sender ID는 메시지를 수신하는 안드로이드 앱을 구분하게 된다.  

Sender Auth Token : push 메시지 전송시(third-party 서버 또는 Browser) 메시지를 보내는 곳을 인증하기 위한 token.  아무나 GCM서버에 push를 보낼 수 없도록 하기 위한 인증장치

 

1. Enabling GCM

GCM을 사용하기 위해서는 Google API console에서 Sender ID를 발급 받아야 한다.

https://code.google.com/apis/console/

 

그림에서 주소창의 project 옆의 숫자가 project ID가 인데, GCM에서는 이 값을 Sender ID로 사용한다. 참고로 API console에서 여러 개의 Google API Project를 만들고 관리 할 수 있는데, 필자는 test_gcm 이라는 project를 만들어서 사용하였다. 복수의  project를 생성할 수 있고 project마다 ID가 독립적이 된다.

 

2. Android 클라이언트 - manifest.xml 파일

 

1. GCM은 안드로이드 2.2 이상에서 지원하므로 최소 버전을 설정해야 한다.

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>

2. GCM 메시지를 받기 위한 permission을 정의 한다. “my_app_package”는 자신의 package ..

<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />

3. 추가로 필요한 permisstion 추가

<!-- GCM messages 수신하기 위해서 -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- 인터넷 접속 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 구글계정 접근 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- 메시지 수신하려면 절전모드로 가면 안됨 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

4. Broadcast Receiver 등록 ( gcm.jar 파일에 GCMBroadcastReceiver 라는클래스가 있음. )

<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
 
<intent-filter>
   
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
   
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
   
<category android:name="my_app_package" />
 
</intent-filter>
</receiver>

5. Intent service 추가 ( gcm.jar 파일에 GCMIntentService 클래스 있음)

<service android:name=".GCMIntentService" />

 

4,5번에서 사용하는 클래스는 google에서 제공하는 gcm.jar 파일에 정의되어 있으므로 그냥 사용하는게 편하다. 기존 C2DM에서 GCM으로 마이그레이션하는 경우에는 그냥 Sender ID만 변경해 주면 된다.

 

 

3. Android 클라이언트 – GCM서버에 등록

단말기에서는 push를 받기 위해서 GCM서버에 단말기를 등록해야 한다. gcm.jar 파일을 이용하는 경우에는 아래처럼 간단하다.

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
 
GCMRegistrar.register(this, SENDER_ID);
} else {
 
Log.v(TAG, "Already registered");
}

 

여기서 GCMRegistrar.register(this, SENDER_ID) 는 실제로는 아래와 같은 동작을 한다.

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
// sets the app name in the intent
registrationIntent
.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent
.putExtra("sender", senderID);
startService
(registrationIntent);

위 코드는 C2DM에서 사용하던 방법과 같다. gcm.jar GCM을 구현하는 코드가 정형화 되어 있어서 간단한 library 파일로 제공하는 것이다. 그래서 신규 개발시는 gcm.jar를 이용하면 편리하다.

 

GCM에 등록이 되면 callback으로 GCMIntentService onRegistered() 가 호출된다. 여기에 registrationId가 넘어온다.

 

GCMIntentService class에서 제공하는 다양한 callback 함수들을 아래와 같다. 이름만 보면 대충 언제 호출되는지 알 수 있다.

protected void onRegistered(Context context, String registrationId)

protected void onUnregistered(Context context, String registrationId)

protected void onMessage(Context context, Intent intent)

protected void onDeletedMessages(Context context, int total)

public void onError(Context context, String errorId)

protected boolean onRecoverableError(Context context, String errorId)

 

 

이제, 클라이언트 개발이 완료 되었으므로 실제로 test를 해서 잘 동작하는지 확인해 봐야 한다. GCM 서버는 아래의 url을 통해서 Broswer로 간단하게 테스트 할 수 있다. Browser에서 테스트할때 필요한 Authorization Key google API console에서 얻을 수 있다.

 

 

사진 보면 알겠지만, third-party Server를 사용할 경우에는 “Create new Server Key”를 눌러서 생성할수 있다. 위에서 얻은 키를 이용해서 아래처럼 호출하면 된다.

그리고 registration_ids는 앞에서 String regId = GCMRegistrar.getRegistrationId(this); 을 호출해서 얻은 값이다.

 

URL : https://android.googleapis.com/gcm/send.

Method : POST

Authorization: Key=xxxxx

Content-Type:application/json  

)

Content-Type:application/json
Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA

{
 
"registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."],
 
"data" : {
   
...
 
},
}

 

POST로 호출해야 되므로 Chrome REST-CONSOLE 같은 것으로 전송을 테스트 해보면 된다.

 

보너스

GCM 샘플 소스 : 설치된 android SDK 경로에서 “Extras -> Google -> gcm->samples “ clientserver의 샘플 소스가 있다. Client 샘플은 registrationId를 서버로 전송하므로 해당 부분을 빼고 browser로 테스트 할 수 있도록 변경한 샘플을 첨부 하였다.

 gcm-demo-client.zip

 

 



:

단말기에(주로 tablet) 설치된 library에 따라 동적으로 처리하기.

android 2013. 3. 7. 13:46

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 2013-03-07

작성자 : hanburn

 

안드로이드의 단말기는 참 다양한걸 체감한다. 일본에서 판매되는 LuvPad 라는 안드로이드 타블렛이 있는데, 이 단말기는 google library 가 탑재되어 있지 않다. 모두 알고 있는 것이지만 구글에서 인증받지 않은 단말기는 구글 모듈( 구글 Play, 구글지도등)의 기본 앱들이 설치되어 있지 않다.

앱을 개발하다보면, 위처럼 여러 단말을 고려해서 개발을 해야 하므로 설치는 모두 가능하고 하하 실행할 때 동적으로 단말기에 해당 기능이 있는지 체크해서 처리하면 좋을 것이다.

 

간단한 구글지도를 예로 들어서 설명하겠다.

일단 모두 설치되도록 하려면 AndroidManifest.xml 파일에서 아래처럼 false로 되어 있는지 확인한다.

<uses-library android:name="com.google.android.maps" android:required="false"/>

 

다음으로는 실행되는 순간에 구글지도기능이 있는지 체크해야 한다.  간단하게 아래와 같은 함수를 하나 만들었다.

public boolean hasSystemSharedLibraryInstalled(Context ctx, String libraryName) {

           boolean hasLibraryInstalled = false;

           if (!TextUtils.isEmpty(libraryName)) {

               String[] installedLibraries = ctx.getPackageManager().getSystemSharedLibraryNames();

               if (installedLibraries != null) {

                   for (String s : installedLibraries) {

                       if (libraryName.equals(s)) {

                           hasLibraryInstalled = true;

                           break;

                       }

                   }

               }

           }

           return hasLibraryInstalled;

       }

 

구글지도는 MapActivity를 이용하므로 해당 Activity를 시작하기 전에 아래처럼 체크하면 된다.

hasSystemSharedLibraryInstalled(context, “com.google.android.maps”);

 

 

아래는 getSystemSharedLibraryNames 함수를 이용해서 AVD 개발폰에서 해당정보를 추출해봤다.

  

AVD에 설치된 목록 (android - 4.0 library  API level 14 )

android.test.runner

com.android.location.provider

javax.obex

정말 간단하다.

 

AVD에 설치된 목록 (Google APIs – 4.2 level 17 )

android.test.runner

javax.obex

com.google.android.media.effects

com.google.android.maps

com.android.future.usb.accessory

com.android.location.provider

 Map과 위치정보 제공자 모듈이 추가로 들어있는 것을 알수 있다.

 

HTC desire에 설치된 목록 ( android 2.3 )

com.ecrio.sip

com.htc.transcoder

javax.obex

com.android.future.usb.accessory

com.htc.htcSceneManager

com.htc.framework

android.test.runner

com.htc.android.pimlib

com.htc.lockscreen.fusion

com.scalado.util.ScaladoUtil  -> MWC 2012때 전시된 스칼라도의 라이브러리를 사용했나 ㅋ ?

com.htc.android.easopen

com.google.translate

com.htc.sunny2

com.htc.fusion.fx

com.orange.authentication.simcard

com.google.android.maps

com.android.location.provider

com.htc.android.rosie

~ 정말 많은 것들이 있네~ 

com.htc.xxx 모듈은 제조사에서 android를 커스터마이징하면서 추가한 기능들 같아 보이고,

그외 third-party 의 모듈로 추정되는 것들도 보이네요.

 

 



:

Android Build Target 설정, AVD의 TargetName 설정

android 2013. 3. 7. 13:02

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 날짜 : 2013-03-07

작성자 : hanburn

AVD manager에서 AVD를 생성할 때 Target Name을 설정하게 되는데 이것은 무엇을 선택하는 것일까?

 

아래의 그림처럼 API level 별로 2가지 계열로 구분된다 

 

하나는 “Android 4.0 – API level 14”처럼 순수하게 안드로이드 라이브러리(anroid.jar) 파일만 포함된 AVD를 생성하는 것이고, 다른 하나는 “Google APIs(Google Inc.) – API leve 14” 처럼 안드로이드( android.jar ) + 구글 ( maps.jar, usb.jar ) 을 선택할수 있다. 즉 구글계열을 선택하면 구글에서 제공하는 기능들이 포함되게 된다. 구글에서 제공하는 Add-on 기능의 대표적인 기능은 구글 지도가 있다.

 

구글계열을 선택해서 아래 그림처럼 추가로 Maps앱이 추가되어 있다.

  

안드로이드를 개발할 때 프로젝트의 properties에서도 선택할수 있다. 구글 지도기능을 넣을때는 꼭 구글계열의 선택하야 한다. 만약 빌드해서 실행시킬 때 “INSTALL_FAILED_MISSING_SHARED_LIBRARY” 메시지가 뜯다면 프로젝트의 라이브러리와 AVD의 라이브러리가 맞지 않기 때문이다. 이때는 잘 맞춰주면 된다.

이것 말고 또 다른 것은 뭐가 있을까?

 

 



:

[AndroidManifest.xml] uses-permission과 uses-feature의 관계

android 2013. 3. 6. 16:55

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 2013-03-06

작성자 : hanburn

 

안드로이드는 단말기가 다양해도 너무~ 다양해서 개발 환경에서 잘되다가 market에 올리면 안된다는 피드백이 자주 있다. 그중에 하나가 설치 issue 이다. 설치 문제는 문제가 발생하는 단말을 확보해서 테스트 해보면 좋을텐데 대부분이 단말을 구할수 없는 상태에서 확인을 해야 하기에 종종 탐정놀이에 빠지게 된다.

 

오늘도 이런 탐정놀이를 하다가 users-permission uses-feature에 대해서 정리해 본다.

 

1. uses-permission 이란?

(Application)이 실행될때가 아니라 설치되는 시점에 사용자에게 허가를 받는 권한을 기술하는 것이다. "android.permission.CAMERA" 은 카메라를 사용한다는 권한을 표시한다.

Permission의 종류는 아래 page를 참고 하면 된다.

http://developer.android.com/reference/android/Manifest.permission.html

 

2. uses-feature ?

syntax:

<uses-feature 
  android:name="string
  android:required=["true" | "false"] 
  android:glEsVersion="integer" />

 

(application)이 사용하는 하드웨어 또는 소프트웨어 특성(feature)를 정의 한다. 요즘 카메라는 대부분 달려있는데, 보급형 같은 경우는 카메라의 자동 초점기능이 없는 단말기도 존재한다.

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

위에처럼 required=false로 하면 카메라에 자동초점 기능이 없더라도 앱을 실행 할 수 있게 된다.

 

3. uses-permissionuses-feature의 관계

앞에서 언급한 것처럼 permission을 요구하고 있는데, feature에서 require=false를 정의하지 않으면 해당 feature가 없는 단말에서는 앱을 실행할 수가 없게 된다. CAMERA permission은 물리적인 CAMEAR가 있을 때만 사용가능하기 때문에 하드웨어에 관계된 몇몇 permission에 대해서는 필요로하는 feature가 포함된다. 

이러한 관계에 대해서 아래에 정리되어 있으니 permission을 추가할 때, feature도 같이 신경써서 정의해야 한다.

 

 

Category

This Permission...

Implies This Feature Requirement

Bluetooth

BLUETOOTH

android.hardware.bluetooth

(See Special handling for Bluetooth feature for details.)

BLUETOOTH_ADMIN

android.hardware.bluetooth

Camera

CAMERA

android.hardware.camera and 
android.hardware.camera.autofocus

Location

ACCESS_MOCK_LOCATION

android.hardware.location

ACCESS_LOCATION_EXTRA_COMMANDS

android.hardware.location

INSTALL_LOCATION_PROVIDER

android.hardware.location

ACCESS_COARSE_LOCATION

android.hardware.location.network and 
android.hardware.location

ACCESS_FINE_LOCATION

android.hardware.location.gps and 
android.hardware.location

Microphone

RECORD_AUDIO

android.hardware.microphone

Telephony

CALL_PHONE

android.hardware.telephony

CALL_PRIVILEGED

android.hardware.telephony

MODIFY_PHONE_STATE

android.hardware.telephony

PROCESS_OUTGOING_CALLS

android.hardware.telephony

READ_SMS

android.hardware.telephony

RECEIVE_SMS

android.hardware.telephony

RECEIVE_MMS

android.hardware.telephony

RECEIVE_WAP_PUSH

android.hardware.telephony

SEND_SMS

android.hardware.telephony

WRITE_APN_SETTINGS

android.hardware.telephony

WRITE_SMS

android.hardware.telephony

Wifi

ACCESS_WIFI_STATE

android.hardware.wifi

CHANGE_WIFI_STATE

android.hardware.wifi

CHANGE_WIFI_MULTICAST_STATE

android.hardware.wifi

 참고 : http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions-features



:

안드로이드 json 속도 비교

android 2013. 2. 1. 19:21

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

원본 : http://www.martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/

 

간략한 내용 요약

 

속도는 jackson이 가장 빠른것으로..  ( 사용된 버전이 jackson 1.7.x 이었다. 참고로 jackson 2.x 버전부터는 속도 향이 더 되었다고 한다. )

자세한 test 소스는 아래를 참고하면 된다.

소스 : https://github.com/martinadamek/json-android-compare

 

 [결론]

1)Android Built-in JSON 파서는 별로 빠르지 않지만, 개발 편이성은 괜찮다.
2)JSON.simple이 패키지 구조만 다르고 거의 클래스명이 동일하기 때문에 쉽게 대체 가능한 옵션이다.
3)Jackson이 가장 속도가 빠르지만, 이벤트기반의 파싱 작업은 Built-in 파서에 비해서 개발 편이성이 차이가 난다.
4)Gson은 이벤트기반 파싱은 Jackson과 유사하다.

 

This is Android demo project used to compare performance of various JSON parser implementations in my blog post.

Right now it includes:
- Android built-in: http://developer.android.com/reference/org/json/package-summary.html
- JSON.simple: http://code.google.com/p/json-simple/
- Jackson: http://jackson.codehaus.org/
- Gson: http://code.google.com/p/google-gson/

Results on my Nexus One and more information is available in my blog post at http://martinadamek.com


: