Tag Archives: Android

keytool 문자 깨짐 현상 해결 방법

Android 빌드시에 사용되는 키스토어를 생성하려다 보면 문자열이 깨지는 현상이 발생할 경우가 있습니다. OS가 한글이거나 영문이거나 동일하게 발생하며 저의 경우에서는 맥에서 필수적으로 발생하는 문제였던것 같습니다.

실행시에 다음과 같이 문자열이 깨져보이는 문제가 발생합니다.

$ keytool -genkey -alias eye -keyalg RSA -validity 10000 -keystore eye.keystore
keystore ??ȣ?? ?Է??Ͻʽÿ?:

다음과 같이 alias로 keytool실행시에 언어설정을 추가로 해주도록 합시다.

$ alias keytool='java -Dfile.encoding=utf8 sun.security.tools.KeyTool'
$ keytool -genkey -alias eye -keyalg RSA -validity 10000 -keystore eye.keystore
keystore 암호를 입력하십시오:

문제 없이 잘 되는것을 확인할 수 있습니다.

[Android] Object [object Object] has no method 오류 해결하기

Android상에서 웹뷰를 사용하면서 Javascript 인터페이스를 사용하여 웹과 네이티브 코드간에 통신을 할 수 있습니다. 하지만 Android 4.2부터는 정상적으로 동작하지 않고 오류가 발생하는것을 발견하였습니다. 다음은 오류를 확인할 수 있는 간단한 코드입니다.

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
    public void handshake() {
        Log.d("JS", "handshake no params");
    }

    public void handshake(String json) {
        Log.d("JS", "handshake with params: " + json);
    }
}, "Android");

Javascript에서는 다음과 같이 위의 handshake()를 호출할 수 있습니다.

Android.handshake();

하지만 logcat에 다음과 같은 오류가 발생합니다.

E/Web Console: Uncaught TypeError: Object [object Object] has no method ‘handshake’

여기서 중요한점은 4.2 이전버전들에서는 매우 잘 동작하는 API라는것입니다. 확인해본 결과 4.2(API 17)부터 Javascript에서 접근하려는 메소드에는 어노테이션을 추가해주어야 하도록 변경되었습니다. [확인]

결과적으로 위의 코드는 다음과 같이 @JavascriptInterface를 추가해주면 정상적으로 동작합니다. 물론 빌드 타켓을 API 17이상으로 해줄 필요가 있습니다.

this.webView.getSettings().setJavaScriptEnabled(true);
this.webView.setWebChromeClient(new WebChromeClient());
this.webView.addJavascriptInterface(new Object() {
    public void handshake() {
        Log.d("JS", "handshake no params");
    }

    @JavascriptInterface
    public void handshake(String json) {
        Log.d("JS", "handshake with params: " + json);
    }
}, "Android");

참고 : http://stackoverflow.com/questions/14031635/android-4-2-1-webview-and-javascript-interface-breaks