펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO




웹뷰(Javascript)와 안드로이드간 메소드를 호출하려고 하는데 ,


안드로이드 > 자바스크립트로는 메소드 호출이 되지만


자바스크립트 > 안드로이드로는 메소드 호출이 안되는 경우가 있다.



오늘 이 현상때문에 개고생을 하다가 결국 원인을 찾아냈다.



수없이 올라오는 로그를 자세히 보니 웹뷰에서 안드로이드의 메소드를 호출 할 때


Writing exception to parcel

java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL

at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13192)

at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2044)

at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:615)

at android.content.ContentProvider$Transport.call(ContentProvider.java:279)

at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)

at android.os.Binder.execTransact(Binder.java:388)

at dalvik.system.NativeStart.run(Native Method)



이런 에러코드가 발생한다는걸 알았고,


소스코드를 아무리 변경해봐도 안되고, 퍼미션에 찾아봐도 저런 퍼미션은 없었다.


원인은 AndroidManifest.xml 파일의 android:targetSdkVersion="18" 이 문제였다.


웹뷰 > 안드로이드는 4.2버전부터 호출이 막혔다고 한다.


(http://ttorr.blogspot.kr/2014/03/kitkat44-loadurl.html)



android:targetSdkVersion16 이하로 설정하거나, 아예 없어버린 뒤 해결되었다.


==================================================================================


14/10/14 추가 : import android.webkit.JavascriptInterface; + 메소드에 @JavascriptInterface 어노테이션을 추가하면 api level 17 이상에서도 작동한다.

(http://stackoverflow.com/questions/16353430/appview-addjavascriptinterface-does-not-work-on-api-17)


펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO





Handlermsgint값을 보낼 수 있다는것은 알것이다.

(http://biig.tistory.com/34  -  핸들러 사용법 포스팅)



그렇다면, 메시지로 객체를 전달할 수는 없을까 ??


할 수 있다.


기존에는


handler.sendEmptyMessage(int);


형식으로 메시지를 전송했다면,



같은 위치에서


Message msg = handler.obtainMessage();


으로 선언 해 주면


msg.what(int);

msg.obj(Object);

msg.arg1(int);

msg.arg2(int);


이런식으로 메시지에 객체를 담을 수 도 있고, 인트값도 저렇게 넣어 줄 수 있다.


잘 활용한다면 매우 유용하다.


예를들어 다른 액티비티에 객체를 전달해야 하는 경우, parcelable를 상속받고 기타 과정이 복잡한데


Handler를 통해 Object를 넘겨주면 매우 간단하게 해결이 가능하다.


그리고 sendEmptyMessage 대신


handler.sendMessage(msg);


로 해주면 전달이 완료된다.




펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

토스트메시지



이미지에 보이는 "토스트메시지입니다." 라는 문구가 적힌 저 네모난 박스가 토스트메시지이다.


주로 사용자에게 정보를 알려주는 용도로 사용되며, 잠시 나타났다 사라지기 때문에


직접적인 입력을 받지 않았을때 띄워주면 사용자가 보지 못할 가능성이 있어 


상황에 맞게 잘 사용하여야한다.


소스코드는 단 한줄로 매우 간단하다.


구성은 Toast.makeText (Context context, CharSequence text, int duration).show();


예제는 Toast.makeText(getApplicationContext(), "토스트메시지입니다.", int duration).show();

int duration에는 Toast.LENGTH_SHORT와 Toast.LENGTH_LONG가 있으며

SHORT는 2초, LONG는 4초간 출력한다.

직접 int값을 넣을 경우 밀리세컨드로 적용된다. (1000= 1초)