Android2011. 1. 6. 09:20


구글이 안드로이드 3.0 허니컴의 소개 동영상을 공개하였다고 한다.

동영상을 살펴보니 폰을 위한 운영체제였던 안드로이드가 이제 태블릿을 넘어서 노트북을 대체하려고 하는게 아닌가 싶다.

이건 머 그냥 PC용 운영체제인듯 보인다.


Posted by 삼스
Android/App개발2010. 12. 18. 23:45


안드로이드 Strings 리소스로 format string작업을 하고자 할경우가 있다.


한국어와 영어로 '나는 안드로이드이다'를 resource로 처리하고자 할 경우를 예를 들면..


한국어 = '나는 android 이다'

영어 = 'I am an android'


가 된다...

이를 다국어 작업을 하기 위해서는 C code의 printf의 입력문처럼 아래와 같이 처리하고자 할것이다.


한국어 printf("나는 %s 이다", "android")

영어 printf("I am an %s", "android")


위와 같이 하기 위해서는 


1. strings.xml에resources태그에  xmlns:xliff 속성을 아래와 같이 추가하고...


<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">


2. string item을 아래의 형식으로 정의한다.

한국어 <string name="im_android">"나는 <xliff:g id="NAME">%s</xliff:g> 이다."</string>

영어 <string name="im_android">"I am an <xliff:g id="NAME">%s</xliff:g>"</string>


3. 코드상에서는 getString(..)함수를 사용해서 다국어처리가 된 문자열을 얻을 수 있다.

getString(R.string.im_android, "android");



Posted by 삼스
HTML52010. 12. 15. 20:04

Mac OS X에서 
개발 툴 설치
1. Xcode tool package 설치
2. Subversion client설치
3. Python 2.5이후 버전 설치
 http://www.python.org/download/  
4. Java for Mac OS X developer package설치
  http://connect.apple.com -> Downloads -> Java

5. GTK 
 http://trac.webkit.org/wiki/BuildingGtk

6. QT
 http://trac.webkit.org/wiki/QtWebKit 

웹킷 소스 얻기
svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit
subversion아니라 아래 링크로 다운받을 수 있다. 이 링크는 매 6시간마다 업데이트 된다.



Posted by 삼스
Android/App개발2010. 12. 9. 19:04


간혹 암호화가 필요할 때가 있다. 이 경우 사용가능한 대칭키 암호화에 사용되는 자바 유틸이다.

javax패키지를 사용하며 안드로이드에서 그대로 사용이 가능하다.

Base64는 안드로이드 오픈소스에서 가져다가 사용하였다.


import java.io.UnsupportedEncodingException;


import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.SecretKey;


public class CryptoUtil {

Cipher ecipher;

    Cipher dcipher;


    public CryptoUtil(SecretKey key, String algorithm) {

        try {

            ecipher = Cipher.getInstance(algorithm);

            dcipher = Cipher.getInstance(algorithm);

            ecipher.init(Cipher.ENCRYPT_MODE, key);

            dcipher.init(Cipher.DECRYPT_MODE, key);


        } catch (javax.crypto.NoSuchPaddingException e) {

        } catch (java.security.NoSuchAlgorithmException e) {

        } catch (java.security.InvalidKeyException e) {

        }

    }


public String encrypt(String str) {

try {

// Encode the string into bytes using utf-8

byte[] utf8 = str.getBytes("UTF8");

// Encrypt

byte[] enc = ecipher.doFinal(utf8);

// Encode bytes to base64 to get a string

return Base64.encodeToString(enc, Base64.URL_SAFE|Base64.NO_WRAP);

//return String.valueOf(enc);

} catch (javax.crypto.BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (java.io.IOException e) {

e.printStackTrace();

}

return null;

}


public String decrypt(String str) {

try {

    // Decode base64 to get bytes

byte[] dec = Base64.decode(str, Base64.URL_SAFE|Base64.NO_WRAP);

// Decrypt

byte[] utf8 = dcipher.doFinal(dec);

// Decode using utf-8

return new String(utf8, "UTF8");

} catch (javax.crypto.BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (java.io.IOException e) {

e.printStackTrace();

}

return null;

}

    public static void main(String[] args) throws Exception {

        // Generate a temporary key. In practice, you would save this key.

        SecretKey key = KeyGenerator.getInstance("DES").generateKey();

        

        // Create encrypter/decrypter class

        CryptoUtil c = new CryptoUtil(key, "DES");

        

        // Encrypt

        String encrypted = c.encrypt("안녕하세요 이요삼입니다...");

        System.out.println(encrypted);

       

        // Decrypt

        String decrypted = c.decrypt(encrypted);

        System.out.println(decrypted);       

    }


}

Posted by 삼스
Android2010. 12. 2. 15:59
Faster and native event dispatching and processing
    Native event dispatching pipeline.
    Faster event dispatching using shared memory.
    WindowManager optimizations to take advantage of native event paths

Dalvik VM and Core library improvements
    Concurrent Garbage Collector (target sub-3msec pauses)
    Additional JIT code generation optimizations
    Improved code verification
    SSL and general networking overhaul
    Expanded I18N support (full worldwide encodings, more locales)
Audio and Graphics improvements
OpenSL ES implementation (audio API)
Low latency audio rendering
OpenAL support
Graphics stack refactoring
GPU resource management improvements
RTSP, webm, VP8 support in StageFright
Authoring support for StageFright
SIP stack
  Basic SIP stack as an optional platform add-on (build time config)
Linux : 2.6.35 Linux kernel
Bluetooth : BlueZ 4.69

* StageFright는 OpenCore의 대체입니다. OpenCore가 OHA에 기여하면서 실제 단말사들에게 지나치게 많은 라이선스를 요구하면서 구글하고 사이가 안좋아졌다고 하네요. 그래서 다른 멀티미디어프레임워크를 올린것입니다. 이것도 OpenMax IL을 이용한 프레임웍입니다.
** SIP stack이 들어간것에 대해서 말이 많죠. 기존의 SIP stack사업을 하던 업체들에겐 청천벽력일거구요. 어쨌든 구글이 나중에는 음성통화부분까지 잡아먹을것 같다는 ... 그 기반을 조성하고 있다는 느낌을 지울수 없습니다. 구글토크가 지금은 많이 이용되고 있진 않지만 구글 토크의 기술은 안드로이드의 근간으로 자리잡고 있거든요.
*** 터치입력같은 입력장치의 처리 프로세스를 개선하고 VM을 더 개선하여 속도를 더 향상시키고 그 외 Audio기술이나 멀티미디어, SIP등에 대한 개선된 내용들이 GingerBread에서 우리가 느낄수 있는 변화라고 생각됩니다. 에초에 루머로 돌았던  UI의 개선과 홈스크린의 획기적이 변경등은 없다고 하는군요.

Posted by 삼스
Android/App개발2010. 11. 29. 17:49

Package의 Add와 Remove시를 알고 싶다면 아래와 같이 한다.

1. Manifest에 receiver등록

<receiver android:name=".IntentReceiver">

<intent-filter>

<action android:name="android.intent.action.PACKAGE_ADDED" />

<action android:name="android.intent.action.PACKAGE_REMOVED" />

<data android:scheme="package" />

</intent-filter>

</receiver>


2. Receiver class구현


public class IntentReceiver extends BroadcastReceiver {


@Override

public void onReceive(Context context, Intent intent) {

Log.d("_PACKAGE_OBSERVER_", "intent : ");

Log.d("_PACKAGE_OBSERVER_", "  action = " + intent.getAction());

Log.d("_PACKAGE_OBSERVER_", "  data = " + intent.getData());

}


}


위와 같이 하면 data에 package명을 확인하여 어떤 패키지가 추가되거나 삭제되었는지 알 수 있다.




Posted by 삼스
Android/App개발2010. 11. 15. 17:40

하마터면 삽질할 뻔 했는데.. HashMap은 Parcelable을 implement하려고 하면 런타임에 에러가 남.
이에 대한 대안은 그냥  Bundle을 사용하면 되는데 Bundle은 내부에 hashmap을 데이터구조로 사용중임.

따라서 hashmap형태의 데이터를 다른 프로세스와 공유하고자 할 때는 Bundle을 사용할것~!

Posted by 삼스
Android2010. 11. 3. 09:52


kandroid와 여기저기서 주워들은 이야기를 모아봄.

Native Activity와 Native event dispatching

 - 이벤트처리 단계를 축소하여 반응속도를 획기적으로높였다고 한다. 진정으로 아이폰을 능가하는 반응속도를 볼 수 있을듯하다.

OpenSL ES - The Standard for Enhanced Audio

http://www.khronos.org/opensles/
 
OpenAL (Open Audio Library)
http://en.wikipedia.org/wiki/OpenAL

 - native에서 오디오를 조작할수 있다고 한다.
 
SIP (Session Initiation Protocol)
http://en.wikipedia.org/wiki/Session_Initiation_Protocol
- 구글의 전략적인 선택 


stagefright supports
- RTSP, 
WebM, VP8 (http://dreamgoer.net/175)

- PacketVideo의 OpenCore를 버리는 단계이다. PacketVideo는 높은 라이선스료를 요구한것으로 알려져 있다.



Posted by 삼스
기타/BONDI2010. 11. 2. 17:04



BONDI Feature Access


Features의 인식과 구성에 관한것과 웹애플리케이션에서 그 정보에 어떻게 억세스하는지에 대한 요구사항에 대해 설명한다.


요구사항 요약과 원리

BONDI Web app의 의존성은 하나 이상의 features의 구성에 의해 결정된다.

하나의 Feature는 웹런타임에서 제공하는 연관된 기능에 대응된다. 이는 자바스크립트 인터페이스와 웹런타임의 동작에 대한 집합으로 정의된다.

하나의 feature는 유일한 IRI로 구분되며 BONDI web app에 의해서 의존성을 표현하는 하나의 유닛이다.

BONDI는 하나의 feature를 정의하거나 몇개의 feature를 정의하기도 한다. 각각은 인터페이스를 정의한다. BONDI framework에서 JavaScript API를 확장하고 싶다면 대응되는 feature를 반드시 정의해야 한다. JavaScript API와 feature를 추가하였다면 feature-set도 또한 정의해야 한다. IRI로 구분이 되며 feature들의 집합이다. 


framework과 연관된 요구사항들은 아래의 원칙들로 규합된다.

1. Feature 추가 : JavaScript API의 집합은 고정되어 있지 않다. 그리고 나중에 확장되기를 기대하고 있다. 

2. Feature 혁신 : 각 JavaScript API들은 스스로 시간이 지남에 따라 진화한다. 새로운 디바이스의 능력을 반영하기도 하고 새로운 유스케이스 또는 에러 수정, 이전 버전의 JavaScript의 결점을 보완하는것등을 통해서 진화한다. 

3. feature 정의의 분산 : feature의 정의는 어느 집단에 의해 제한되지 않는다. 누구나 정의가능하다(다만 다른디바이스와 호환은 포기).  feature의 정의는 단말생산자, 네트워운영자, 특별히 관심있는자, 각 서비스제공자나 퍼블리셔들에 의해 정의가능하다. 

프레임웍은 또한 동적으로 feature를 제공하기 위한 방안을 고려하여 설계 되었다.

4. 동적 feature 제공 : 확장메커니즘을 통해서 필드에 존재하는 디바이스에 새로운 feature를 추가할 수 있는 기능. 이 기능은 일반적으로 디바이스 플래싱을 다시하는 방법이 아니다. 확장메커니즘은 OS에서 제공가능한 방법이 되며 ActiveX나 브라우져의 플러그인등이 그방법이 될수 있다. 하지만 이 메커니즘은 반드시 제공되어야 하는 것은 아니며 feature 제공을 위해 표준화가 완전히 이루어진것도 아니다.

이런 원리가 의미하는것은 아래에 설명된다.

5. Feature들(interface와 구현을 포함하는)는 IRI로 구분이 가능하다.

6. 모든 Web App(website or widget)은 feature를 사용하기 위해 반드시 feature를 정의해야 한다.  이 정보는 Widget Recource의 Widget Configuration Document에 선언되어 있거나 또는 BONDI-defined API를 이용하여 프로그램으로 선언한수도 있다.

이 선언은 다음을 허용한다.

  - 웹런타임이 그 feature를 제공하는지 확인한다.

  - feature의 동적 제공을 허용한다.

  - 웹어플리케이션이 그 feature를 사용할 수 있는지 확인하는 억세스컨트롤을 허용한다.

  - 웹런타임이 어떤 feature를 로드하고 바인드해야 하는지 결정하는데 필요.

  - Widget User Agent가 위젯을 설치하기 전에 웹런타임에서 동작가능한 위젯인지 결정하는데 필요.


BONDI는 자체적으로 두종류의 feature를 정의한다.

1. BONDI JavaScript APIs : 이 feature는  BONDI-defined API와 직접적으로 연관된다. http://bondi.omtp.org/api/로부터 정의되어진다.

2. BONDI processing assertions : metadata와 assertions그리고 웹어플리케이션을 처리하기 위해 관련된 다른 directive들로 구성된다. http://bondi.omtp.org/meta/로부터 정의되어 진다.


위젯을 위해서 BONDI는 Widget Configuration Document에서 <feature> 태그로 위젯의 feature의존성을 기술할 수 있다.


의존성의 표현

BONDI는 다음 4가지를 정의한다.

1. Device Capability

2. JavaScript API

3. Feature

4. Feature Set


WebApplicaiton은 feature 의존성을 반드시 명시적으로 기술해야 한다. 웹런타임은 해당 feature가 명시적으로 요구되지 않은 상태에서는 유효한 feature가 없고 Security Policy에 의해 허용되면 접근가능지는 것을 보장해야 한다.

활성화된 접근성은 허용된 Web Application에 대해서만 유효하다.


요구사항

AS-0351 : 웹런타임은 반드시 명시적으로 연관된 feature를 기술하고 그 권한을 획득한 경우에만 JavaScript API를 사용할수 있게 해주어야 한다.

AS-0552 : 이미 유효한 feature가 있는지 결정할 수 있어야 함.


의존성의 정적 선언

Widget Configuration Document에 <widget> tag의 <feature> tag에 name과 required 속성으로 기술한다.

ex)

<widget xmlns="http://www.w3.org/ns/widgets" version="5602:5719M"id="http://tests.bondi.omtp.org/widgets/appconfig.wgt" width="640" height="480">

<name>BONDI appconfig compliance</name>

<author email="hendry@aplix.co.jp">Kai Hendry</author>

<feature name="http://bondi.omtp.org/api/bondi.requestfeature" />

</widget>

존성의 프로그래밍 표현

BONDI-defined APIrequestFeature를 통해서 표현 가능하다.

PendingOperation requestFeature(

      in RequestFeatureSuccessCallback successCallback,

      in ErrorCallback   errorCallback,

      in DOMString       name);


이 함수는 명명된 feature를 비동기로 요청을 하며 리턴값으로 pending operation object를 받는다. 성공하면 successCallback이 호출되며 실패하면 errorCallback에 DeviceAPIError가 발생한다. 


요청된 feature와 연관된 JavaScript API가 존재하면 모든 API들의 global property들이 successCallback이 호출되기 전에 접근가능해진다. 보통 해당 API set의 root object를 생성하며 생성이 성공하면 successCallback에 인자로 넘겨진다. 

Posted by 삼스
Android/XMPP2010. 10. 28. 21:11


http://blog.jayway.com/2008/11/21/give-back-my-xmpp-in-android/

SASL 관련 XMPPConnection클래스의 버그를 수정한 패치가 올려져 있다.

아래와 같은 에러 발생시 이 패치가 유용할 것이다.

10-28 19:40:09.640: ERROR/AndroidRuntime(2342): java.lang.VerifyError: org.jivesoftware.smack.sasl.SASLMechanism
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at java.lang.Class.getDeclaredConstructors(Native Method)
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at java.lang.Class.getConstructor(Class.java:477)
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:303)

10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at
org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:395)
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at
org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:349)
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at com.yamaia.mobilebridge.delivery.PushService$LoginThread.run(PushService.java:404)
10-28 19:40:09.640: ERROR/AndroidRuntime(2342):     at java.lang.Thread.run(Thread.java:1102)



Posted by 삼스