조건 


 Url에서 특정 패턴을 추출해서 시스템 브라우저를 호출한다. 



Webview에  WebViewClient 를 설정하고


webView.setWebViewClient(new TestWebViewClient());



해당 패턴이 포함되어 있을경우 시스템 브라우저를 호출한다.


private class TestWebViewClient extends WebViewClient {

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

if(url.indexOf("___target=_blank") > -1){

Intent i = new Intent(Intent.ACTION_VIEW);

i.setData(Uri.parse(url));

context.startActivity(i);

return true;

}

return super.shouldOverrideUrlLoading(view, url);

}

}






Kitkat이전까지 이 방법으로 호출하였으나 문제는 킷캣 ( 4.4 kitkat ) 이상에서는 이 방법이 통하지 않습니다...


4.4부터 구글의 크롬엔진이 변경되어서 그렇다는 글을 검색을 통해서 확인하였고


여기저기 뒤져보다가 해결책을 발견...



webView에 웹 크롬 클라이언트를 설정..


webView.setWebChromeClient(new TestWebChromeClient());




새 창이 열리는 액션을 잡아서  해당 패턴일경우  새창에 띄워줍니다.


private class TestWebChromeClient extends WebChromeClient {

@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {

// Url 문자열을 가져옴.
WebView.HitTestResult result = view.getHitTestResult();
String url = result.getExtra();

if (url != null && url.indexOf("___target=_blank") > -1) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
context.startActivity(i);
return true;
}
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}


}



상기 두부분을 그대로 유지를 해둬야 4.4 이상에서도 동작하고 4.4 미만에서도 동작을 합니다.




사용중인 갤럭시 S3 의 개발자 도구가 환경설정에서 사라졌다..


숨김 처리가 되있는 ...


서두는 짧게.


홈화면 -> 메뉴버튼 -> 환경설정 -> 더보기


-> 디바이스 정보 

-> 빌드번호를 터치터치터치... 연속으로 하다보면.   3 2 1 . 하고 떨어지면서 Toast가 노출된다...


개발자도구가 활성화 되었습니다.. 라는 문구가 나오고 


Back 버튼... 


더보기 메뉴 아래에  개발자 도구가 활성화 되어있다..


우야건 Success...






안드로이드 에서 메시지 기반으로 이리저리 통통 기기 제어를 하려 하는데....


Permission Deny 상황이 자꾸 떨어진다.


뭘까 ...


http://www.android-permissions.org/permissionmap.html


오늘 (2012 10 09 ) 까지는 잘 접속되는데 나중에 될진 모르겠다..


중한 내용은 아래 내용... Broadcast Message 로 아래 내역은 허락되지 않는다. 시스템딴에서만 전송 가능하다는 이야기.. 다른 방법으로 메시지 날리는게 정답인듯?!?!?


android.app.action.ENTER_CAR_MODE, android.app.action.ENTER_DESK_MODE, android.app.action.EXIT_CAR_MODE, android.app.action.EXIT_DESK_MODE, android.backup.intent.CLEAR, android.backup.intent.INIT, android.backup.intent.RUN, android.bluetooth.adapter.action.DISCOVERY_FINISHED, android.bluetooth.adapter.action.DISCOVERY_STARTED, android.bluetooth.adapter.action.LOCAL_NAME_CHANGED, android.bluetooth.adapter.action.SCAN_MODE_CHANGED, android.bluetooth.adapter.action.STATE_CHANGED, android.bluetooth.device.action.ACL_CONNECTED, android.bluetooth.device.action.ACL_DISCONNECTED, android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED, android.bluetooth.device.action.BOND_STATE_CHANGED, android.bluetooth.device.action.CLASS_CHANGED, android.bluetooth.device.action.DISAPPEARED, android.bluetooth.device.action.FOUND, android.bluetooth.device.action.NAME_CHANGED, android.bluetooth.device.action.NAME_FAILED, android.bluetooth.device.action.PAIRING_CANCEL, android.bluetooth.device.action.PAIRING_REQUEST, android.intent.action.ACTION_MDN_STATE_CHANGED, android.intent.action.ACTION_POWER_CONNECTED, android.intent.action.ACTION_POWER_DISCONNECTED, android.intent.action.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, android.intent.action.ACTION_SHUTDOWN, android.intent.action.ANY_DATA_STATE, android.intent.action.BATTERY_CHANGED, android.intent.action.BATTERY_LOW, android.intent.action.BATTERY_OKAY, android.intent.action.BOOT_COMPLETED, android.intent.action.CONFIGURATION_CHANGED, android.intent.action.DATA_CONNECTION_FAILED, android.intent.action.DEVICE_STORAGE_LOW, android.intent.action.DEVICE_STORAGE_OK, android.intent.action.DOCK_EVENT, android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED, android.intent.action.LOCALE_CHANGED, android.intent.action.NETWORK_SET_TIME, android.intent.action.NETWORK_SET_TIMEZONE, android.intent.action.NEW_OUTGOING_CALL, android.intent.action.PACKAGE_ADDED, android.intent.action.PACKAGE_CHANGED, android.intent.action.PACKAGE_DATA_CLEARED, android.intent.action.PACKAGE_INSTALL, android.intent.action.PACKAGE_REMOVED, android.intent.action.PACKAGE_REPLACED, android.intent.action.PACKAGE_RESTARTED, android.intent.action.RADIO_TECHNOLOGY, android.intent.action.REBOOT, android.intent.action.SCREEN_OFF, android.intent.action.SCREEN_ON, android.intent.action.SERVICE_STATE, android.intent.action.SIG_STR, android.intent.action.SIM_STATE_CHANGED, android.intent.action.TIMEZONE_CHANGED, android.intent.action.TIME_TICK, android.intent.action.UID_REMOVED, android.intent.action.USER_PRESENT, and android.provider.Telephony.SPN_STRINGS_UPDATED. 





안드로이드의 가장 큰 문제점이라면

기기별로 해상도가 다르다는점..

 개발사에게는 기기의 다양화를 꾸릴수 있는 거지만


나같은 나약한(?) 개발자에게는 이거 어찌 해야하나.. 하는 탄식이 나오게 하는 큰 문제점이라면 문제점이다.


뭐 오늘도 두어시간 삽질을 통해(?) 수확한 즐거운 꺼리 하나를 투척한다. (얼마만의 블로깅인지 모르겠다.. )


테스트 대상은 가장 널리 퍼져 있는 대표 테스트 단말.

갤럭시 S ( 800 * 480  / hdpi )

갤럭시 탭 7 ( 1024 * 600 / hdpi) - 이하 탭7

갤럭시 탭 10.1 ( 1280 * 800 / mdpi ) - 이하 탭10 / 널리 퍼져 있는 단말은 아닌가? -_- ;;;



1. 전제 조건으로 단일 APK를 뱉어내야할것

2. 갤럭시S기반으로 앱은 개발 되었고

3. 탭7 탭10을 지원해야한다.

4. 이미지 리소스는 확대를 허용한다. 


결론부터 얘기하면 이전 포스팅에서 사용한 방법으로는 구분이 불가하다.

layout
layout-1024x600
layout-1280x800 

요 방법..

이상하게 탭10에서 구동시에는 탭7의 레이아웃을 참조해버린다.. (다른 별도 설정이 있는지는 모르겠다.. )

이래저래 안드로이드 개발자 사이트좀 뒤적거리다가  테스트후에 찾은 결론
(참고 링크 : http://developer.android.com/guide/practices/screens_support.html )


layout
layout-large
layout-xlarge

순서대로 갤S
탭7 탭10을 참조한다.. 짜잔...
갤S랑 갤탭은 해상도가 유사하니 hdpi에 때려넣고 그냥 참조 하여 일부 수정.

탭10은 해상도가 어마어마하게 차이나지만 -_- mdpi 니깐 별도로 이미지를 mdpi폴더에 넣어도 되고

아니면 무식하게 hdpi에 있는 녀석을 복사해서 넣어주면, 그럴싸하게 보여진다.

...... mdpi에 파일이 없으면? 절반 크기 정도로 화면에 노출되는것을 알수 있다.

결과로 뱉어내는 APK 용량이 문제라면 문제지만.. (당연한것이다. 고밀도 이미지와 중밀도 이미지를 복수로 저장하고 있으니.. )

단일 APK로 뱉어내야만 하는 상황이라면

충분 고려해 볼만한 개발방법.. (폴더관리? )

이상 .







 
안드로이드 리소스 사용에 대해

다양한 해상도 및 DPI지원에 대해


layout-1024x600
drawable-hdpi-1024x600

이런식으로 폴더 작성후 레이아웃이나 이미지를 넣어줄시에

해당 사항에 맞는 리소스를 불러들인다..

코드 삽질을 줄여주는 중요한 요소중 하나 :)

 


그렇다면 언어 설정은?

drawable-ko
drawable-en
 
공통요소는 drawable 에 :)




  ------------------

댓글에 욕설(?) 이 없는걸로 보아 참고하신 분이 없는거 같군요. (은근 다행입니다 ;; )

과거 .1024*600 에서 1024x600 으로 오타 수정하였습니다. 


http://gtko.springnote.com/pages/5254593.xhtml


검색중에 솔깃한 URL 발견..

Intent FLAG  정리

TextView 에 URL을 낑궈 넣을수 있는

Linkfy 설정 등.

유용한 기술들이 기록되어있다...



통화

#758353266#646#

입력이후 리붓되고나서

USIM 다운로드가 진행되면 완료 :)






안드로이드에서 제공하는 

스택의 크기는.

8KB..

아 작다 ( --);;; 모바일 환경이니 그러려니.. 하지만서도

Recursive좀 굴리다보면

훌쩍 초과하는게 8kb...


8kb이상을 사용할려면 쓰레드 그룹을 만들어서

최대 스택 크기를 늘리는 방법!

아래 코드 참조 ( --);

Runnable r = new Runnable(){
@Override
public void run() {
// Do SomeThing
}
};
ThreadGroup tGrp1 = new ThreadGroup("ThreadGrp00001");
Thread a = new Thread(tGrp1,r, "Thread Name", 1024*256) ;
a.start();


최대 크기는 256kb.

개발자 포럼에 가보니..

그 이상은 어떻게 사용이 가능하냐는 질의에...

최적화 해라 -_- 라는 아름다운 답변..



그럼 즐 코딩~ 


요즘 검색해보니 원클릭 루팅이 있더군요..

아래 과정을 한방에(?) 진행해주는 녀석 같습니다.

+ 사용에 대한 책임은 모두 본인이 지고 가는겁니다..


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

간략하고 텍스트 위주의 모토로이 루팅 방법에 대해 기록하겠습니다.

기존 전제조건은

1. 모토로이  USB 드라이버가 설치된 상황 [ 요거 하나; ]



널리고 널린 첨부 파일

다음을 다운받아서 압축을 풀고


1. USB연결
2. 상단 USB 연결 메뉴에서 "모토로라 휴대전화도구" 선택
3. 바탕 -> 메뉴버튼 -> 설정 -> 응용프로그램 -> 알수없는 소스 ON 
4. 3에 이어 개발 메뉴 -> USB 디버깅 ON 켜진상태로 유지 ON
5. 설정 -> Wifi OFF BlueTooth Off
6. 계정및 동기화 -> 백그다운드 데이터 OFF (자동으로 자동 동기화 OFF)

Console 을 열어 (Win + R : cmd [enter] )
adb push Superuser.apk /sdcard/superuser.apk
adb push su /sdcard/su
adb push busybox /sdcard/busybox
adb push exploid /sqlite_stmt_journals/exploid
adb shell

cd sqlite_stmt_journals
chmod 755 exploid
./exploid
rootshell 


여기 rootshell 을 실행하기 까지 여분의 시간이 소요됩니다.(기다렸다가 입력하세요)

패스워드를 묻는 곳에서

secretlol 

cp /sdcard/superuser.apk /system/app/superuser.apk
cp /sdcard/su /system/bin/su
cp /sdcard/busybox /system/bin/busybox
chmod 4775 /system/bin/su
chmod 4775 /system/bin/busybox
rm /system/bin/rootshell

exit
exit

adb shell
su

모토로이 화면에서 Allow 선택
이상루팅끝

기타 설치 추천(?) 어플.

Estrongs File Explorer : 무료 파일 매니저

My Market : 해외 무료 게임 마켓 접근 가능

MilestoneOverclock12 : 오버클러킹 
Launcher Pro : 빠른 홈 런처

Mini Info : 배터리, 내장 매모리, SD 용량  위젯

APNDroid : 3G차단 위젯

Advanced Task Killer : 작업관리자 ( 위젯 강추 )



즐거운 안드로이드 생활이 되시길!

Enjoy!

프로젝트를 진행하던중


수많은 리소스로 골머리가 솔솔 아파왔는데!

어라? 폴더에 폴더 추가해서 쓰면 

그래도 좀 보기는 편하겠네?



.. 일단 결론은 안됩니다...

@drawable/lv2/img블라블라..


값 자체를 

해석하지를 못하는건지 어쩐건지






위 이미지와 같은 구조에 대해 지원을 해주지 않으므로(혹시 가능한 방법을 알고 계시면 알려주세요 ㅠ.ㅠ. )

file명을 잘 지어서 임시로 회피하세요...

뭔가.. 다른곳에 문의를 해봐야겠습니다.




View v;

LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);

TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);

return v;


뭔가 미묘하게 문제 스럽지만

중요한 코드들은 다 잘 들어가있는 Layout Inflater...

return v 대신에 setContentView(v)식으로 선언해주면 

Activity내 onCreate에서 바로 화면에 설정도 가능하다는점...

참고하세요 :)






5/7일 실시한 안드로이드펍 개발자 컨퍼런스에 다녀왔습니다.


개발자 팁 위주의 강연이 

꽤나 마음에 들었습니다.


물론 중간에 -_- 거침없는 취침폭풍을 취해서 미친듯이 아쉬운 부분도 있습니다. (이놈의 저질 체력... )




아래는 간략한 설명. + 강의중에 몇 기록한것들


세션1 - 안드로이드 다양한 스크린 디바이스를 위한 UI처리 : 박성서 ( 회색님 )
- Pixel을 사용하지 말아라, DIP를 사용하라.
- Abs Layout을 사용하지 말아라 (1.5부터 Deprecated 되었다고는 하는데 -_- 실제 사용해보면 작동은 하죠? ;; )
- 이미지는 고해상도 이미지를 사용해라 (res/HDPI 경로 이용 )

세션2 - 안드로이드 인터넷 서비스 연동 애플리케이션 개발 ( 강순권 )
 - 인터넷 작업이 들어간 애들은... 전부 
 Cache, Async를 유지하라 + 음영지역에 대한 대비를 하라.


HVGA - 16MB
WVGA - 24MB 의 어플 할당 공간..


NDK 세션에서는 -_-; 빠른 속도를 보장한다는게 주였습니다.
여기서 고민했었던것이...

어플 개발하라고.. SDK가 있는 것인데. 속도를 위해서 NDK로 가야한다그러면.. 전부 NDK로 가야하는것 아닌가?

하는 생각이 들었습니다.

발표자(이제현)님이 말씀하신대로.. 안드로이드 베이스에서 300p이상의 PDF리더는 NDK로 작성한 애들뿐이다.. 라고 말씀하시는게..

앞으로 NDK도 공부좀 해둬야되겠더군요 ㅠ.ㅠ..

+ 강조하신 포인트는...

일반 어플 UI의 구현에..

가속을 받아서 구동해야하는 부분만 NDK로 구현하는 구조로 가야한다고 말씀하시더군요..

좋은 정보 인거 같아 기록에 남깁니다 :) - 다시한번 감사의 말씀 드립니다. 



OK JSP 의 허광남님은... 말투가.. 완전 유쾌하시더군요.

이클립스 사용에 Short Cut위주의 설명이라 ..

쉬운 주제였으나, 알면알수록 개발속도 향상에 큰 도움을 주는 것들?

저역시 단축키 매니아라서;;

저보다 많이 알고 계시더군요 ( --);



세션 6의 AR부분은 SurfaceView 에 대한 설명 부분이 유독 기억에 남는군요.. 
배터리 잡아먹는 귀신! 사용은 해라 그렇지면 UX에 긍정적인 결과를 미치지는 않을것이다.. 라는 놀라운 발언과 함꼐...



이상 대략적인 후기였습니다.


아래는 
컨퍼런스 전리품(?) 응?








내 PC를 서버로 둔 상태에서

안드로이드 에뮬로 작업을 하는도중..



URL targetUrl = new URL("http://127.0.0.1:8888/test.jsp");


이런 URL로 Request 를 날렸더니

접근이 거절되었습니다.

라고 나오길래;


뭔가 문제 인가.. 하고..

뒤적거려보니..

잘 생각해보니..

에뮬 자체로 저 방향(Localhost or 127.0.0.1)이 설정됨을 알수가 있었습니다...

Localhost나 127.0.0.1 같은 녀석은.

안드로이드 AVD자신을 가리키므로..

내 PC의 IP를 직접 기록해주어야


원할한 테스트를 진행할수가 있습니다.



Coming Soon..


On March 2010.

+ Recent posts