<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Go3.co.kr MintState BBS &amp;gt; Tech &amp;gt; Android</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android</link>
<description>테스트 버전 0.2 (2004-04-26)</description>
<language>ko</language>


<item>
<title>apktool을 이용하여 APK 파일 다루기</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=19</link>
<description><![CDATA[[U]apktool을 이용하여 APK 파일 다루기[/U]<br/><br/>apk 파일에 어떤것을 추가 수정 삭제를 할 경우가 있습니다.<br/>원 소스가 있다면 이클립스에서 다시 빌드 하면 되겠지만 그렇지 않은 경우도 있죠.<br/>이때 사용하는 것이 apktool 입니다. <A HREF="http://code.google.com/p/android-apktool/" TARGET="_blank"  rel="nofollow">http://code.google.com/p/android-apktool/</A> <br/>윈도우, 리눅스, osx 까지 있으니 위 사이트에서 입맛에 맞게 다운 받으시며 됩니다.<br/><br/>[B]1. Decode[/B] <br/>$ apktool d sample.apk decode_sample <br/>위와 같이 하면 sample.apk 파일을 풀어 decode_sample 폴더에 저장하게 됩니다.<br/>그럼 풀어지 파일을 수정, 삭제를 하시면 되겠죠.<br/><br/>[B]2. Build[/B]<br/>$apktool b decode_sample build_sample.apk <br/>위 커멘드는 decode_sample 디렉토리의 파일을 build_sample.apk로 빌드하라는 내용입니다.<br/><br/>[B]3. Sign[/B]<br/>빌드만 하고 설치하면 설치 오류가 뜹니다. 이때 Sign을 해줘야 합니다.<br/>motizen에 포스팅된 파일을 첨부합니다. [ATTACH]765[/ATTACH]<br/>java -jar motizen-sign\signapk.jar motizen-sign\testkey.x509.pem motizen-sign\testkey.pk8 test\dist\test_icon.apk test_icon_signed.apk<br/><br/>현재 apktool을 이용하여 서버에서 자동으로 사용자마다 맞게끔 다시 재빌드 해서 배포하는데 쓰고 있습니다.]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 01 Nov 2012 16:02:49 +0900</dc:date>
</item>


<item>
<title>BitmapDrawable과 Bitmap</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=17</link>
<description><![CDATA[[U]BitmapDrawable과 Bitmap[/U]<br/><br/>[B][Intro][/B]<br/><br/>보통 [COLOR=blue]BitmapFactory[/COLOR]의 decode 함수들은 메모리 [COLOR=blue]Leak[/COLOR]이 존재한다고 알려져 있습니다.<br/>(2.1에서 수정이 되었는지 아직도 그대로인지는 잘 모르겠습니다.)<br/><br/>실제로 안그럴지 몰라도,<br/>decode를 하면 할 수록 메모리 Leak의 위험부담은 더 커지기 마련이죠.<br/>제가 처음에 Drawable을 Bitmap으로 바꿀 때 BitmapFactory를 사용 했었습니다. <br/><br/>정확히 말하면 Drawable을 Bitmap으로 바꾼 것이 아니라<br/>[COLOR=blue]RawResource[/COLOR]를 [COLOR=blue]InputStream[/COLOR]으로 얻어와서 [COLOR=blue]BitmapFactory[/COLOR]로 decode한 것이었죠.<br/><br/>[CODE java]Bitmap bitmap;<br/>InputStream stream;<br/>stream = context.getResources().openRawResource(resource);<br/>try {<br/>&nbsp; &nbsp; bitmap = BitmapFactory.decodeStream(stream);<br/>} <br/>finally {<br/>&nbsp; &nbsp; try { stream.close(); } <br/>&nbsp; &nbsp; catch(IOException e) {}<br/>} [/CODE]<br/><br/>하지만 위의 코드는 계속 BitmapFactory를 호출 하기 때문에<br/>잠재적인 위험을 가지고 있습니다.<br/><br/>그렇다면 리소스로 부터 Bitmap을 얻어내고 싶다면 어떻게 해야 할까요?<br/><br/><br/>[B][Googling...][/B] <br/><br/>일단 포스팅 하기전에 구글링을 좀 해봤습니다.<br/>상위 몇개의 검색 결과를 살펴보니...&nbsp; <br/><br/>구글링으로 살펴본 결과들은 대부분 아래와 같이 되어있었습니다.<br/><br/>[CODE java]Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);<br/>Canvas canvas = new Canvas(bitmap);<br/>drawable.setBounds(0, 0, w, h);<br/>drawable.draw(canvas); [/CODE]<br/><br/>1. 빈 Bitmap을 만들고<br/>2. Canvas를 연결 한 뒤<br/>3. Drawable의 draw메소드를 통해 Bitmap과 연결된 Canvas에 Drawable의 내용을 그립니다.<br/><br/>물론 이 방법이 틀린 것은 아닙니다.<br/>하지만 만들어 줘야 하는것이,<br/><br/>1. Drawable 크기만한 빈 Bitmap<br/>2. Bitmap에 연결할 Canvas<br/>3. 크기를 가지는 Width, Height 변수<br/><br/>Drawable 객체를 제외하고 [COLOR=blue]두개의 객체[/COLOR]와 [COLOR=blue]두개의 변수[/COLOR]를 더 만들어야 합니다.<br/>중간에 [COLOR=blue]setBounds()[/COLOR] 메소드도 호출 해야 겠죠.<br/><br/>근데 여기서 한가지 잘 생각해 봐야 할 것이 있습니다.<br/>[COLOR=blue]View[/COLOR]안에서는 [COLOR=blue]Drawable[/COLOR]을 잘 사용해서 이미지를 표시해 주고 있다는 점입니다.<br/>Layout XML 파일 안에서 [COLOR=blue]ImageView[/COLOR]의 이미지를 지정해 줄 때<br/>Drawable을 잘~ 사용해왔다는 것이 하나의 예가 될 수 있겠네요.<br/><br/>그렇다면 Drawable이 당연히 Bitmap을 가지고 있어야 하지 않을까요?<br/><br/><br/>[B][BitmapDrawable][/B] <br/><br/>질문에 대한 답은 바로 [COLOR=blue]BitmapDrawable[/COLOR]에 담겨있습니다.<br/>아래의 코드를 보시죠!<br/><br/>[COLOR=blue]BitmapDrawable drawable = <br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (BitmapDrawable) getResources().getDrawable(R.drawable.icon);<br/>Bitmap bitmap = drawable.getBitmap(); [/COLOR]<br/><br/>읭...? 이게 끝입니다. <br/>[COLOR=blue]BitmapDrawable[/COLOR]을 사용하면 Bitmap을 손쉽게 얻어 올 수 있습니다.<br/>위의 길고 긴 코드가 단 두 줄로 줄어 들었습니다.<br/><br/>따로 Bitmap을 만들지 않아도 됩니다.<br/>그냥 Drawable안에 있는 Bitmap을 사용하기만 하면 됩니다.<br/>&nbsp;<br/><br/>[B][주의사항!][/B] <br/><br/>BitmapDrawable을 사용하면 손쉽게 Bitmap을 얻을 수는 있지만,<br/>Drawable이 꼭 [COLOR=blue]BitmapDrawable[/COLOR]만 존재 하는 것은 아닙니다.<br/>대표적인 예로 [COLOR=blue]ShapeDrawable[/COLOR]이 있을 수 있겠네요.<br/>[COLOR=blue]ShapeDrawable[/COLOR]을 사용하면 원하는 도형(Shape 객체)을 Drawable로 사용 할 수 있습니다.<br/><br/>하지만 getBitmap() 메소드가 없기 때문에<br/>ShapeDrawable로 부터 Bitmap을 얻어 올 수는 없습니다.<br/>굳이 도형을 Bitmap으로 바꾸고 싶다면 위에서 봤던 빈 Bitmap과 Canvas를 만들어서<br/>draw() 메소드를 통해 그리는 방법 밖에는 없습니다.<br/><br/>아마도 대부분의 경우 drawable 디렉토리에 있는 이미지들을 Bitmap으로 사용하려고 하지,<br/>Shape을 Bitmap으로 사용하려고 하지는 않을 거라 생각합니다.<br/>네네... 그럴겁니다...<br/><br/><br/>[B][BitmapDrawable Bitmap의 특징][/B]<br/><br/>BitmapDrawable에서 얻어온 Bitmap 객체는 보통녀석이 아닙니다.<br/>특징을 한번 살펴 봅시다.<br/><br/>[COLOR=blue]1. 우선, Bitmap을 얻어 올 때는 final 입니다.[/COLOR]<br/>&nbsp;레퍼런스에 보면 final로 선언되어 있습니다.<br/>즉, 변경하지 않겠다는 의지를 표현 한 것이죠.<br/>사실 리턴에 final을 붙여봤자 대입되는 변수와는 아무 상관이 없습니다... 네... 넘어가죠.<br/><br/>[COLOR=blue]2. Immutable 입니다.[/COLOR]<br/>좀 더 강력한 녀석이 나왔습니다. [COLOR=blue]Immutable[/COLOR], 즉, [COLOR=blue]변경 불가[/COLOR]입니다.<br/>[CODE java]Canvas canvas = new Canvas(bitmap); [/CODE]<br/>만약 위와 같은 시도를 한다면, 아래와 같은 Exception이 발생 할겁니다.<br/>[CODE]Caused by: java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor[/CODE]<br/><br/>[COLOR=blue]3. 절대 recycle() 메소드를 호출 해서는 안됩니다![/COLOR]<br/>Bitmap을 얻어와서 그릴거 다 그렸다고 무의식적으로 recycle() 메소드를 호출 했다...<br/>그럼 아래와 같은 메세지를 볼 수 있습니다.<br/>[CODE]java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.<a href="mailto:Bitmap@43774438"  rel="nofollow">Bitmap@43774438</a>[/CODE]<br/>위의 상황은 ImageView 같은데서 사용하고 있던 Drawable의 Bitmap 객체를 얻어와서<br/>그 Bitmap 객체에 recycle() 메소드를 호출 한 상황입니다.<br/>한마디로 Bitmap 객체를 공유해서 사용한다고 볼 수 있겠죠.<br/><br/><br/>[B][One more Tip - Bitmap copy][/B]<br/><br/>그렇다면 BitmapDrawable로 부터 얻어낸 Bitmap 객체를<br/>마음대로 바꾸고, 쓰고, 버리고 싶다면 어떻게 해야 할까요?<br/><br/>그냥 [COLOR=blue]copy()[/COLOR] 하면 됩니다.<br/><br/>[CODE java]Bitmap bitmap = drawable.getBitmap().copy(Config.ARGB_8888, true);[/CODE] <br/><br/>Mutable로 복사하면 마음대로 변경해서 사용 할 수 있습니다!<br/><br/><br/>[B][Outro][/B]<br/><br/>이번에는 BitmapDrawable과 Bitmap에 대해서 살짝 살펴보았습니다.<br/>앞에서는 BitmapDrawable을 Bitmap으로 바꾸는 이야기만 했었지만,<br/>반대로 Bimap을 Drawable로 바꾸고 싶다면<br/>BitmapDrawable의 생성자를 사용하면 간단히 Drawable로 만들 수 있습니다.<br/><br/>물론 구글링해서 찾은 방법이 틀린 방법은 아닙니다.<br/>이미지와 관련이 없는 Drawable을 다루고자 할 때는<br/>번거롭게도 draw() 메소드를 이용 해야 하는것이 맞지만,<br/>이미지와 관련된 Drawable을 다루고자 할 때는 분명 BitmapDrawable을 사용하는 것이 더 편합니다.<br/><br/>네... 제가 하고 싶은말은 그겁니다.<br/>이미지 파일 힘들게 바꾸지 맙시다!<br/><br/><br/>URL : <A HREF="http://blog.vizpei.kr/105116344" TARGET="_blank"  rel="nofollow">http://blog.vizpei.kr/105116344</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 09 Jun 2011 10:26:38 +0900</dc:date>
</item>


<item>
<title>Android Bitmap Object Resizing Tip</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=16</link>
<description><![CDATA[[U]Android Bitmap Object Resizing Tip[/U]<br/><br/>[B][Intro][/B]<br/><br/>Android에서 사용하는 이미지는 [COLOR=blue]Bitmap[/COLOR]이라는 클래스에서 다~ 알아서 해줍니다.<br/>그리고 이런 Bitmap Object를 쉽게 만들 수 있도록 도와주는 <br/>[COLOR=blue]BitmapFactory[/COLOR] 클래스 라는 것도 있습니다.<br/><br/>BitmapFactory는 여러가지 소스로 부터 Bitmap Object를 만들어 주는 일을 하는데,<br/>전부 [COLOR=blue]static[/COLOR]이며 [COLOR=blue]decodeXXX[/COLOR] 라는 이름을 가진 메소드들로 이루어져 있습니다.<br/>XXX에는 어떤 것으로 부터 decode를 하여 <br/>Bitmap Object를 만들어 낼지에 대한 말들이 들어 가겠죠.<br/><br/><br/>[B][Decoding Methods][/B]<br/><br/>[COLOR=blue]BitmapFactory.decodeByteArray()[/COLOR] 메소드는 [COLOR=blue]Camera.PictureCallback[/COLOR] 으로 부터 받은<br/>Jpeg 사진 데이터를 가지고 Bitmap으로 만들어 줄 때 많이 사용 합니다.<br/>Camera.PictureCallback에서 들어오는 데이터가 [COLOR=blue]byte[][/COLOR] 형식이기 때문에<br/>저 메소드를 사용 해야 하는 것이죠.<br/><br/>[COLOR=blue]BitmapFactory.decodeFile()[/COLOR] 메소드는 파일을 그대로 읽어 옵니다.<br/>내부적으로는 파일 경로를 가지고 [COLOR=blue]FileInputStream[/COLOR]을 만들어서 [COLOR=blue]decodeStream[/COLOR]을 합니다.<br/>그냥 파일 경로만 쓰면 다 해주는게 편리 한 것이죠.<br/><br/>[COLOR=blue]BitmapFactory.decodeResource()[/COLOR] 메소드는 [COLOR=blue]Resource[/COLOR]로 부터 Bitmap을 만들어 내며<br/>[COLOR=blue]BitmapFactory.decodeStream()[/COLOR] 메소드는 [COLOR=blue]InputStream[/COLOR]으로 부터 Bitmap을 만들어 냅니다.<br/>뭐 그냥 이름만 봐도 알 수 있는 것들이지요.<br/><br/><br/>[B][OutOfMemoryError??][/B]<br/><br/>보통 이미지 파일을 읽어서 Resizing을 해야 할 때가 있는데, <br/>그럴때는 [COLOR=blue]BitmapFactory[/COLOR]로 읽어서 [COLOR=blue]Bitmap.createScaledBitmap()[/COLOR] 메소드를 사용하여 줄이면 간단하게 처리 할 수 있습니다.<br/><br/>그런데 BitmapFactory를 사용할 때 주의해야 할 점이 있습니다.<br/>아래의 예를 한번 보시죠.<br/><br/>[CODE java]Bitmap src = BitmapFactory.decodeFile(&#034;/sdcard/image.jpg&#034;);<br/>Bitmap resized = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, true);[/CODE]<br/><br/>이미지 파일로부터 Bitmap을 만든 다음에 <br/>다시 dstWidth, dstHeight 만큼 줄여서 resized 라는 Bitmap을 만들어 냈습니다.<br/>보통이라면 저렇게 하는게 맞습니다.<br/><br/>읽어서, 줄인다.<br/><br/>그런데 만약 이미지 파일의 크기가 아주 크다면 어떻게 될까요?<br/>지금 Dev Phone에서 카메라로 촬영하면<br/>기본적으로 2048 x 1536 크기의 Jpeg 이미지가 촬영된 데이터로 넘어옵니다.<br/>이것을 decode 하려면 3MB 정도의 메모리가 필요 할 텐데, <br/>과연 어떤 모바일 디바이스에서 얼마나 처리 할 수 있을까요?<br/><br/>실제로 촬영된 Jpeg 이미지를 여러번 decoding 하다보면 <br/>아래와 같은 황당한 메세지를 발견 할 수 있습니다.<br/><br/>[CODE]java.lang.OutOfMemoryError: bitmap size exceeds VM budget[/CODE]<br/><br/>네... [COLOR=blue]OutOfMemory[/COLOR] 입니다.<br/>더 이상 무슨 말이 필요 하겠습니까...<br/>메모리가 딸려서 처리를 제대로 못합니다.<br/><br/>이것이 실제로 decoding 후 메모리 해제가 제대로 되지 않아서 그런 것인지, <br/>하더라도 어디서 Leak이 발생 하는지에 대한 정확한 원인은 알 수 없습니다.<br/>이것은 엔지니어들이 해결해야 할 문제 겠죠...<br/><br/>하지만 메모리 에러를 피할 수 있는 방법이 있습니다.<br/><br/><br/>[B][BitmapFactory.Options.inSampleSize][/B]<br/><br/>[COLOR=blue]BitmapFactory.decodeXXX[/COLOR] 시리즈는 똑같은 메소드가 두 개씩 오버로딩 되어 있습니다.<br/>같은 이름이지만 Signature가 다른 메소드의 차이점은<br/>[COLOR=blue]BitmapFactory.Options[/COLOR]를 파라메터로 받느냐 안받느냐의 차이죠.<br/>BitmapFactory.Options를 사용하게 되면 decode 할 때 여러가지 옵션을 줄 수 있습니다.<br/><br/>여러가지 많지만 저희가 지금 사용할 것은 inSampleSize 옵션 입니다.<br/><br/>[COLOR=blue]inSampleSize[/COLOR] 옵션은,<br/>애초에 decode를 할 때 얼마만큼 줄여서 decoding을 할 지 정하는 옵션 입니다.<br/><br/>inSampleSize 옵션은 1보다 작은 값일때는 무조건 1로 세팅이 되며,<br/>1보다 큰 값, N일때는 [COLOR=blue]1/N[/COLOR] 만큼 이미지를 줄여서 decoding 하게 됩니다.<br/>즉 inSampleSize가 4라면 1/4 만큼 이미지를 줄여서 decoding 해서 Bitmap으로 만들게 되는 것이죠.<br/><br/>2의 지수만큼 비례할 때 가장 빠르다고 합니다.<br/>2, 4, 8, 16... 정도 되겠죠?<br/><br/>그래서 만약 내가 줄이고자 하는 이미지가 1/4보다는 작고 1/8보다는 클 때,<br/>inSampleSize 옵션에 4를 주어서 decoding 한 다음에, <br/><br/>Bitmap.createScaledBitmap() 메소드를 사용하여 한번 더 줄이면 됩니다.<br/><br/>[CODE java]BitmapFactory.Options options = new BitmapFactory.Options();<br/>options.inSampleSize = 4;<br/>Bitmap src = BitmapFactory.decodeFile(&#034;/sdcard/image.jpg&#034;, options);<br/>Bitmap resized = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, true);[/CODE]<br/><br/>당연한 이야기 이겠지만,<br/>내가 원하고자 하는 사이즈가 딱 1/4 크기라면 <br/>Bitmap.createScaledBitmap() 메소드를 쓸 필요가 없지요.<br/><br/>inSampleSize 옵션을 잘 활용하면 메모리 부족 현상을 대략적으로 해소 할 수 있습니다.<br/>참고로 제가 저 옵션을 사용한 뒤로는 메모리 에러를 본적이 한~번도 없답니다.<br/><br/><br/>[B][Appendix][/B]<br/><br/>[COLOR=blue]inSampleSize[/COLOR] 옵션을 사용하면<br/>SkScaledBitmapSampler Object (Library Level) 를 생성 하게 되는데,<br/>Object를 만들때 정해진 SampleSize 만큼 축소하여 width와 height를 정한 뒤에 만들게 됩니다.<br/>그러니까 애초에 축소된 사이즈로 이미지를 decoding 하는 것이죠.<br/><br/><br/>[B][Outro][/B]<br/><br/>Android의 기본 어플리케이션 소스를 분석 하다보면<br/>상당히 테크니컬한 기법들을 많이 얻을 수 있습니다.<br/>어떻게 이런 방법으로 만들었나 싶을 정도로 매우 정교하고 복잡하게 만들어져 있지요.<br/>참 대단한 것 같습니다.<br/><br/><br/>아 그리고 왜 dstWidth와 dstHeight 변수 선언이 없냐고 따지시는 분들 설마 없겠죠?<br/><br/>URL : <A HREF="http://blog.vizpei.kr/79874750" TARGET="_blank"  rel="nofollow">http://blog.vizpei.kr/79874750</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 09 Jun 2011 10:13:55 +0900</dc:date>
</item>


<item>
<title>Android XML Parsing Tutorial - Using SAXParser</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=15</link>
<description><![CDATA[[U]Android XML Parsing Tutorial - Using SAXParser[/U]<br/><br/>SAX 파서를 이용한 XML 파싱 예제입니다.<br/><br/>[ATTACH]716[/ATTACH]<br/><br/>[I]첨부파일 설명[/I]<br/>XMLParsingExample.java ( Main Activity )<br/>SitesList.java ( Getter & Setter Method )<br/>MyXMLHandler.java ( XML Handling )<br/>example.xml ( XML file from net )<br/><br/>[B]example.xml[/B] <br/>[CODE xml]&lt;maintag&gt;<br/>&nbsp;  &lt;item&gt;<br/>	&lt;name&gt;AndroidPeople&lt;/name&gt;<br/>	&lt;website category=&#034;android&#034;&gt;<A HREF="http://www.androidpeople.com" TARGET="_blank"  rel="nofollow">www.androidpeople.com</A>&lt;/website&gt;<br/>	&lt;/item&gt;<br/>	&lt;item&gt;<br/>	&lt;name&gt;iPhoneAppDeveloper&lt;/name&gt;<br/>	&lt;website category=&#034;iPhone&#034;&gt;<A HREF="http://www.iphone-app-developer.com" TARGET="_blank"  rel="nofollow">www.iphone-app-developer.com</A>&lt;/website&gt;<br/>	&lt;/item&gt;<br/>&lt;/maintag&gt;[/CODE]<br/><br/>XMLParsingExample.java<br/>[CODE java]public class XMLParsingExample extends Activity {<br/>	/** Create Object For SiteList Class */<br/>	SitesList sitesList = null;<br/><br/>&nbsp; &nbsp; /** Called when the activity is first created. */<br/>&nbsp; &nbsp; @Override<br/>&nbsp; &nbsp; public void onCreate(Bundle savedInstanceState) {<br/>&nbsp; &nbsp; &nbsp; &nbsp; super.onCreate(savedInstanceState);<br/>&nbsp; &nbsp; &nbsp; &nbsp; setContentView(R.layout.main);<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; /** Create a new layout to display the view */<br/>		LinearLayout layout = new LinearLayout(this);<br/>		layout.setOrientation(1);<br/><br/>		/** Create a new textview array to display the results */<br/>		TextView name[];<br/>		TextView website[];<br/>		TextView category[];<br/><br/>		try {<br/>			<br/>			/** Handling XML */<br/>			SAXParserFactory spf = SAXParserFactory.newInstance();<br/>			SAXParser sp = spf.newSAXParser();<br/>			XMLReader xr = sp.getXMLReader();<br/><br/>			/** Send URL to parse XML Tags */<br/>			URL sourceUrl = new URL(&#034;<A HREF="http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml&#034;);" TARGET="_blank"  rel="nofollow">http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml&#034;);</A><br/><br/>			/** Create handler to handle XML Tags ( extends DefaultHandler ) */<br/>			MyXMLHandler myXMLHandler = new MyXMLHandler();<br/>			xr.setContentHandler(myXMLHandler);<br/>			xr.parse(new InputSource(sourceUrl.openStream()));<br/>			<br/>		} catch (Exception e) {<br/>			System.out.println(&#034;XML Pasing Excpetion = &#034; + e);<br/>		}<br/><br/>		/** Get result from MyXMLHandler SitlesList Object */<br/>		sitesList = MyXMLHandler.sitesList;<br/><br/>		/** Assign textview array lenght by arraylist size */<br/>		name = new TextView[sitesList.getName().size()];<br/>		website = new TextView[sitesList.getName().size()];<br/>		category = new TextView[sitesList.getName().size()];<br/><br/>		/** Set the result text in textview and add it to layout */<br/>		for (int i = 0; i &lt; sitesList.getName().size(); i++) {<br/>			name[i] = new TextView(this);<br/>			name[i].setText(&#034;Name = &#034;+sitesList.getName().get(i));<br/>			website[i] = new TextView(this);<br/>			website[i].setText(&#034;Website = &#034;+sitesList.getWebsite().get(i));<br/>			category[i] = new TextView(this);<br/>			category[i].setText(&#034;Website Category = &#034;+sitesList.getCategory().get(i));<br/><br/>			layout.addView(name[i]);<br/>			layout.addView(website[i]);<br/>			layout.addView(category[i]);<br/>		}<br/><br/>		/** Set the layout view to display */<br/>		setContentView(layout);<br/>&nbsp; &nbsp; }<br/>}[/CODE]<br/><br/>[B]MyXMLHandler.java[/B]<br/>[CODE java]public class MyXMLHandler extends DefaultHandler {<br/>	Boolean currentElement = false;<br/>	String currentValue = null;<br/>	public static SitesList sitesList = null;<br/><br/>	public static SitesList getSitesList() {<br/>		return sitesList;<br/>	}<br/><br/>	public static void setSitesList(SitesList sitesList) {<br/>		MyXMLHandler.sitesList = sitesList;<br/>	}<br/><br/>	/** Called when tag starts ( ex:- &lt;name&gt;AndroidPeople&lt;/name&gt; <br/>	 * -- &lt;name&gt; )*/<br/>	@Override<br/>	public void startElement(String uri, String localName, String qName,<br/>			Attributes attributes) throws SAXException {<br/><br/>		currentElement = true;<br/><br/>		if (localName.equals(&#034;maintag&#034;))<br/>		{<br/>			/** Start */ <br/>			sitesList = new SitesList();<br/>		} else if (localName.equals(&#034;website&#034;)) {<br/>			/** Get attribute value */<br/>			String attr = attributes.getValue(&#034;category&#034;);<br/>			sitesList.setCategory(attr);<br/>		}<br/>	}<br/><br/>	/** Called when tag closing ( ex:- &lt;name&gt;AndroidPeople&lt;/name&gt; <br/>	 * -- &lt;/name&gt; )*/<br/>	@Override<br/>	public void endElement(String uri, String localName, String qName)<br/>			throws SAXException {<br/><br/>		currentElement = false;<br/><br/>		/** set value */ <br/>		if (localName.equalsIgnoreCase(&#034;name&#034;))<br/>			sitesList.setName(currentValue);<br/>		else if (localName.equalsIgnoreCase(&#034;website&#034;))<br/>			sitesList.setWebsite(currentValue);<br/>	}<br/><br/>	/** Called to get tag characters ( ex:- &lt;name&gt;AndroidPeople&lt;/name&gt; <br/>	 * -- to get AndroidPeople Character ) */<br/>	@Override<br/>	public void characters(char[] ch, int start, int length)<br/>			throws SAXException {<br/><br/>		if (currentElement) {<br/>			currentValue = new String(ch, start, length);<br/>			currentElement = false;<br/>		}<br/>	}<br/>}[/CODE]<br/><br/>[B]SitesList.java[/B]<br/>[CODE java]public class SitesList {<br/>	/** Variables */<br/>	private ArrayList&lt;String&gt; name = new ArrayList&lt;String&gt;();<br/>	private ArrayList&lt;String&gt; website = new ArrayList&lt;String&gt;();<br/>	private ArrayList&lt;String&gt; category = new ArrayList&lt;String&gt;();<br/><br/>	<br/>	/** In Setter method default it will return arraylist <br/>	 *&nbsp; change that to add&nbsp; */<br/>	<br/>	public ArrayList&lt;String&gt; getName() {<br/>		return name;<br/>	}<br/><br/>	public void setName(String name) {<br/>		this.name.add(name);<br/>	}<br/><br/>	public ArrayList&lt;String&gt; getWebsite() {<br/>		return website;<br/>	}<br/><br/>	public void setWebsite(String website) {<br/>		this.website.add(website);<br/>	}<br/><br/>	public ArrayList&lt;String&gt; getCategory() {<br/>		return category;<br/>	}<br/><br/>	public void setCategory(String category) {<br/>		this.category.add(category);<br/>	}<br/>}[/CODE]<br/><br/>URL : <A HREF="http://www.androidpeople.com/android-xml-parsing-tutorial-using-saxparser" TARGET="_blank"  rel="nofollow">http://www.androidpeople.com/android-xml-parsing-tutorial-using-saxparser</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Tue, 07 Jun 2011 22:30:16 +0900</dc:date>
</item>


<item>
<title>Android XML Parsing Tutorial – Using DOMParser</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=14</link>
<description><![CDATA[[U]Android XML Parsing Tutorial – Using DOMParser[/U]<br/><br/>XML 파싱예제입니다. DOM파서를 이용한 방법입니다.<br/><br/>[ATTACH]714[/ATTACH]<br/><br/>[B]XML[/B]<br/>[CODE xml]&lt;?xml version=&#034;1.0&#034;?&gt;<br/>&lt;maintag&gt;<br/>&nbsp;  &lt;item&gt;<br/>	&lt;name&gt;AndroidPeople&lt;/name&gt;<br/>	&lt;website category=&#034;android&#034;&gt;<A HREF="http://www.androidpeople.com" TARGET="_blank"  rel="nofollow">www.androidpeople.com</A>&lt;/website&gt;<br/>	&lt;/item&gt;<br/>	&lt;item&gt;<br/>	&lt;name&gt;iPhoneAppDeveloper&lt;/name&gt;<br/>	&lt;website category=&#034;iPhone&#034;&gt;<A HREF="http://www.iphone-app-developer.com" TARGET="_blank"  rel="nofollow">www.iphone-app-developer.com</A>&lt;/website&gt;<br/>	&lt;/item&gt;<br/>&lt;/maintag&gt;[/CODE]<br/><br/>[B]Main Java[/B]<br/>[CODE java]public class XMLParsingDOMExample extends Activity {<br/>&nbsp; &nbsp; /** Called when the activity is first created. */<br/>&nbsp; &nbsp; @Override<br/>&nbsp; &nbsp; public void onCreate(Bundle savedInstanceState) {<br/>&nbsp; &nbsp; &nbsp; &nbsp; super.onCreate(savedInstanceState);<br/>&nbsp; &nbsp; &nbsp; &nbsp; <br/>		/** Create a new layout to display the view */<br/>		LinearLayout layout = new LinearLayout(this);<br/>		layout.setOrientation(1);<br/><br/>		/** Create a new textview array to display the results */<br/>		TextView name[];<br/>		TextView website[];<br/>		TextView category[];<br/><br/>		try {<br/><br/>			URL url = new URL(&#034;<A HREF="http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml&#034;);" TARGET="_blank"  rel="nofollow">http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml&#034;);</A><br/>			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br/>			DocumentBuilder db = dbf.newDocumentBuilder();<br/>			Document doc = db.parse(new InputSource(url.openStream()));<br/>			doc.getDocumentElement().normalize();<br/><br/>			NodeList nodeList = doc.getElementsByTagName(&#034;item&#034;);<br/><br/>			/** Assign textview array lenght by arraylist size */<br/>			name = new TextView[nodeList.getLength()];<br/>			website = new TextView[nodeList.getLength()];<br/>			category = new TextView[nodeList.getLength()];<br/><br/>			for (int i = 0; i &lt; nodeList.getLength(); i++) {<br/><br/>				Node node = nodeList.item(i);<br/><br/>				name[i] = new TextView(this);<br/>				website[i] = new TextView(this);<br/>				category[i] = new TextView(this);<br/><br/>				Element fstElmnt = (Element) node;<br/>				NodeList nameList = fstElmnt.getElementsByTagName(&#034;name&#034;);<br/>				Element nameElement = (Element) nameList.item(0);<br/>				nameList = nameElement.getChildNodes();<br/>				name[i].setText(&#034;Name = &#034;<br/>						+ ((Node) nameList.item(0)).getNodeValue());<br/><br/>				NodeList websiteList = fstElmnt.getElementsByTagName(&#034;website&#034;);<br/>				Element websiteElement = (Element) websiteList.item(0);<br/>				websiteList = websiteElement.getChildNodes();<br/>				website[i].setText(&#034;Website = &#034;<br/>						+ ((Node) websiteList.item(0)).getNodeValue());<br/><br/>				category[i].setText(&#034;Website Category = &#034;<br/>						+ websiteElement.getAttribute(&#034;category&#034;));<br/><br/>				layout.addView(name[i]);<br/>				layout.addView(website[i]);<br/>				layout.addView(category[i]);<br/><br/>			}<br/>		} catch (Exception e) {<br/>			System.out.println(&#034;XML Pasing Excpetion = &#034; + e);<br/>		}<br/><br/>		/** Set the layout view to display */<br/>		setContentView(layout);<br/>&nbsp; &nbsp; }<br/>}[/CODE]<br/><br/>URL : <A HREF="http://www.androidpeople.com/android-xml-parsing-tutorial-%E2%80%93-using-domparser" TARGET="_blank"  rel="nofollow">http://www.androidpeople.com/android-xml-parsing-tutorial-%E2%80%93-using-domparser</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Tue, 07 Jun 2011 22:23:36 +0900</dc:date>
</item>


<item>
<title>Splash(로딩) 화면 표시</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=13</link>
<description><![CDATA[[U]Splash(로딩) 화면 표시[/U]<br/><br/>APP 처음 로딩시 많이 보는 로딩 화면 구현이다.<br/><br/>1. AndroidManifest.xml<br/>[CODE xml]	&lt;application android:icon=&#034;@drawable/icon&#034; android:label=&#034;@string/app_name&#034;&gt;<br/>		&lt;activity android:name=&#034;.test1&#034;<br/>			android:label=&#034;@string/app_name&#034;<br/>			android:theme=&#034;@android:style/Theme.NoTitleBar&#034;<br/>			android:screenOrientation=&#034;portrait&#034;<br/>			android:configChanges=&#034;keyboardHidden|orientation&#034;<br/>		&gt;<br/>			&lt;intent-filter&gt;<br/>				&lt;action android:name=&#034;android.intent.action.MAIN&#034; /&gt;<br/>				&lt;category android:name=&#034;android.intent.category.LAUNCHER&#034; /&gt;<br/>			&lt;/intent-filter&gt;<br/>		&lt;/activity&gt;<br/>		&lt;!-- Splash(로딩) 액티비티 --&gt;<br/>		&lt;activity android:name=&#034;SplashActivity&#034; <br/>			android:theme=&#034;@android:style/Theme.NoTitleBar&#034;<br/>			android:screenOrientation=&#034;portrait&#034;<br/>		/&gt;<br/><br/>	&lt;/application&gt;[/CODE]<br/>화면을 가로/세로 모드로 전환할 경우 스플래쉬 액티비티가 보이는 문제가 발생할 경우을 대비하여 android:configChanges=&#034;keyboardHidden|orientation&#034; 을 주었다.<br/><br/>2. splash.xml<br/>[CODE xml]&lt;LinearLayout<br/>&nbsp; xmlns:android=&#034;<A HREF="http://schemas.android.com/apk/res/android&#034;" TARGET="_blank"  rel="nofollow">http://schemas.android.com/apk/res/android&#034;</A><br/>&nbsp; android:layout_width=&#034;fill_parent&#034;<br/>&nbsp; android:layout_height=&#034;fill_parent&#034;&gt;<br/>&nbsp; &nbsp; &lt;ImageView android:id=&#034;@+id/imageView1&#034; android:src=&#034;@drawable/a14&#034; android:layout_width=&#034;fill_parent&#034; android:layout_height=&#034;fill_parent&#034; android:scaleType=&#034;fitXY&#034;&gt;&lt;/ImageView&gt;<br/>&lt;/LinearLayout&gt;[/CODE]<br/>이미지를 화면에 꽉 채우기 위해.. scaleType=&#034;fitXY&#034; 을 주었다.<br/><br/>3. Main Activity<br/>[CODE java]public class test1 extends Activity {<br/>	@Override<br/>	public void onCreate(Bundle savedInstanceState) {<br/>		super.onCreate(savedInstanceState);<br/>		setContentView(R.layout.main);<br/>&nbsp; &nbsp; &nbsp; &nbsp; <br/>		startActivity(new Intent(this, SplashActivity.class));<br/>&nbsp; &nbsp; &nbsp; &nbsp; <br/>		// 다음 실행할 구문<br/>	}<br/>}[/CODE]<br/><br/>4. SplashActivity.class<br/>[CODE java]public class SplashActivity extends Activity<br/>{<br/>	@Override<br/>	public void onCreate(Bundle savedInstanceState)<br/>	{<br/>		super.onCreate(savedInstanceState);<br/>		setContentView(R.layout.splash);<br/><br/>		initialize();<br/>	}<br/><br/>	private void initialize()<br/>	{<br/>		Handler handler = new Handler()<br/>						{<br/>							@Override<br/>							public void handleMessage(Message msg)<br/>							{<br/>								finish();&nbsp; &nbsp; // 액티비티 종료<br/>							}<br/>						};<br/><br/>		handler.sendEmptyMessageDelayed(0, 3000);&nbsp; &nbsp; // ms, 3초후 종료시킴<br/>	}<br/>}[/CODE]]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Tue, 31 May 2011 11:50:47 +0900</dc:date>
</item>


<item>
<title>WebView 로딩중 에만 ProgressBar 진행상태 표시</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=12</link>
<description><![CDATA[[U]WebView 로딩중 에만 ProgressBar 진행상태 표시[/U]<br/><br/>웹페이지 로딩시 프로그레스바를 보이고 로딩이 끝나면 사라지게하는 방법<br/><br/>[ATTACH]691[/ATTACH]<br/><br/>[B]Layout[/B]<br/>[CODE xml]&lt;FrameLayout<br/>	android:layout_width=&#034;fill_parent&#034;<br/>	android:layout_height=&#034;wrap_content&#034;<br/>	android:layout_weight=&#034;1&#034;&gt;<br/>	&lt;WebView android:id=&#034;@+id/webView&#034;<br/>		android:layout_width=&#034;fill_parent&#034;<br/>		android:layout_height=&#034;fill_parent&#034; /&gt;<br/>	&lt;ProgressBar android:id=&#034;@+id/progress_horizontal&#034;<br/>		style=&#034;?android:attr/progressBarStyleHorizontal&#034;<br/>		android:layout_width=&#034;fill_parent&#034;<br/>		android:layout_height=&#034;5dp&#034;<br/>		android:max=&#034;100&#034;<br/>		android:visibility=&#034;gone&#034; /&gt;<br/>&lt;/FrameLayout&gt;[/CODE]<br/><br/>[B]Class[/B]<br/>[CODE java]ProgressBar mProgressHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal);<br/>WebView mWebView = (WebView)this.findViewById(R.id.webView);<br/>mWebView.getSettings().setJavaScriptEnabled(true);<br/><br/>mWebView.setWebViewClient(new MyWebViewClient(){<br/>	@Override<br/>	public boolean shouldOverrideUrlLoading(WebView view, String url) {<br/>		view.loadUrl(url);<br/>		return true;<br/>	}<br/><br/>	@Override<br/>	public void onPageStarted(WebView view, String url, Bitmap favicon) {<br/>		super.onPageStarted(view, url, favicon);<br/>		mProgressHorizontal.setVisibility(View.VISIBLE);<br/>	}<br/><br/>	@Override<br/>	public void onPageFinished(WebView view, String url) {<br/>		super.onPageFinished(view, url);<br/>		mProgressHorizontal.setVisibility(View.INVISIBLE );<br/>	}<br/><br/>	@Override<br/>	public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {<br/>		super.onReceivedError(view, errorCode, description, failingUrl);<br/>		Toast.makeText(Flipper_Activity.this, &#034;로딩오류&#034; + description, Toast.LENGTH_SHORT );<br/>	}<br/>});<br/><br/><br/>mWebView.setWebChromeClient(new WebChromeClient(){<br/>	@Override<br/>	public void onProgressChanged(WebView view, int newProgress) {<br/>		mProgressHorizontal.setProgress(newProgress);<br/>	}<br/>}); [/CODE]<br/><br/>참고<br/><A HREF="http://blog.outsider.ne.kr/464" TARGET="_blank"  rel="nofollow">http://blog.outsider.ne.kr/464</A><br/><A HREF="http://developer.android.com/reference/android/webkit/WebView.html" TARGET="_blank"  rel="nofollow">http://developer.android.com/reference/android/webkit/WebView.html</A><br/><br/>출처 : <A HREF="http://blog.naver.com/free2824/60123140115" TARGET="_blank"  rel="nofollow">http://blog.naver.com/free2824/60123140115</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Mon, 16 May 2011 10:58:34 +0900</dc:date>
</item>


<item>
<title>화면 회전 (Rotation)</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=11</link>
<description><![CDATA[[U]화면 회전 (Rotation)[/U]<br/><br/>안드로이드 앱을 개발할 때, 가장 복잡하고 까다로운 것은 화면의 회전에 따른 데이터 처리일 것이다.<br/>모바일 앱을 개발하면서 조금씩 정리해 둔 것을 풀어 본다.<br/><br/>[B]Resource에서 화면(layout) 정의[/B]<br/>세로 화면 : /res/layout-port/~.xml <br/>가로 화면 : /res/layout-land/~.xml <br/><br/>[B]회전 상태 확인[/B]<br/>* Android 2.1 <br/>[CODE]WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);<br/>Display display = wm.getDefaultDisplay();<br/><br/>//--- orientation : 0. 세로, 1. 가로<br/>int orientation = display.getOrientation();[/CODE]<br/>* Android 2.2 <br/>[CODE]WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);<br/>Display display = wm.getDefaultDisplay();<br/><br/>//--- Surface.ROTATION_0&nbsp;  : 세로<br/>//--- Surface.ROTATION_90&nbsp; : 가로<br/>//--- Surface.ROTATION_180 : 세로<br/>//--- Surface.ROTATION_270 : 가로<br/>int rotation = display.getRotation();[/CODE]<br/><br/>[B]화면 회전 금지 방법 1[/B]<br/>AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다. <br/>[CODE]android:screenOrientation=&#034;portrait&#034;	//--- 세로 화면 고정<br/>android:screenOrientation=&#034;landscape&#034;	//--- 가로 화면 고정[/CODE]<br/><br/>[B]화면 회전 금지 방법 2[/B]<br/>[CODE]//--- public void onCreate(Bundle savedInstanceState) 함수에서<br/>//--- setContentView(~); 다음에 아래 라인을 추가 한다.<br/>//--- 세로 화면 고정setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);<br/>//--- 가로 화면 고정setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);[/CODE]<br/>&nbsp;<br/>[B]화면이 회전해도 Activity가 다시 로딩되지 않도록 하는 방법[/B]<br/>* Activity가 다시 로딩되지 않으므로 화면의 크기는 변하지 않는다. 따라서 수작업으로 화면을 조정해 주어야 한다. <br/>* AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다. <br/>[CODE html]android:configChanges=&#034;keyboardHidden|orientation&#034;[/CODE]<br/>* 모든 Activity에 다음을 추가 한다. <br/>[CODE java]@Override<br/>public void onConfigurationChanged(Configuration newConfig) {<br/>	super.onConfigurationChanged(newConfig);<br/><br/>	switch(newConfig.orientation) {<br/>		case Configuration.ORIENTATION_PORTRAIT:	//--- 수작업으로 세로 화면 생성<br/>			break;<br/>		case Configuration.ORIENTATION_LANDSCAPE:	//--- 수작업으로 가로 화면 생성<br/>			break;<br/>	}<br/>}[/CODE]<br/><br/>[B]화면 회전시 정보를 저장한 후 복구하는 방법[/B]<br/>* public void onCreate(Bundle savedInstanceState)에 복구와 관련된 코딩을 한다. <br/>[CODE java]Object obj = getLastNonConfigurationInstance()<br/>if (obj != null) {<br/>	HashMap&lt;String, Object&gt; map = (HashMap&lt;String, Object&gt;) obj;<br/>	//--- 저장된 복구 데이터로 화면 또는 Thread를 복구 한다.<br/>}[/CODE]<br/>* public void onDestroy()에 화면 종료와 관련된 코딩을 한다. <br/>[CODE java]public void onDestroy() {<br/>	if (isFinishing()) {<br/>		//--- 화면이 종료될 때, Thread 처리 등을 한다.<br/>		//--- worker.interrupt();<br/>		//--- worker = null;<br/>	} else {<br/>		//--- 화면이 회전할 때<br/>	}<br/>	super.onDestroy();<br/>}[/CODE]<br/>* public Object onRetainNonConfigurationInstance()에 화면 회전시 데이터를 저장하는 코딩을 한다. <br/>[CODE java]public Object onRetainNonConfigurationInstance() {<br/>	HashMap&lt;String, Object&gt; map = null;<br/><br/>	map = new HashMap&lt;String, Object&gt;();<br/>	//--- 화면 또는 Thread에서 복구할 데이터를 저장 한다.<br/>	return map;<br/>}[/CODE]<br/><br/>[B]참고 문헌[/B] <br/>[URL=http://sites.google.com/site/endihom/home/google-i-o-2010/android/android-ui-design-patterns/android-android-ui-design-patterns.pdf?attredirects=0]안드로이드 UI 디자인 패턴, 2010.5.19 by Google[/URL] <br/>[URL=http://developer.android.com/guide/practices/ui_guidelines/icon_design.html]Icon Design Guidelines, Android 2.0[/URL] <br/>[URL=http://www.materer.pe.kr/98]Supporting Multiple Screens, 2010.5[/URL] <br/>[URL=http://silence2.tistory.com/entry/Faster-Screen-Orientation-Change]화면 회전을 빠르게 처리하기 (Faster Screen Orientation Change), 2010.6[/URL] <br/>[URL=http://www.jopenbusiness.com/mediawiki/index.php/Android]오픈소스 비즈니스 컨설팅 - Android[/URL]<br/>[URL=http://www.jopenbusiness.com/mediawiki/index.php/Android_SDK]오픈소스 비즈니스 컨설팅 - Android SDK[/URL]<br/><br/>출처 : <A HREF="http://www.jopenbusiness.com/tc/oss/282" TARGET="_blank"  rel="nofollow">http://www.jopenbusiness.com/tc/oss/282</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Sun, 15 May 2011 20:31:45 +0900</dc:date>
</item>


<item>
<title>WebView 로딩 메시지 표시</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=10</link>
<description><![CDATA[[U]WebView 로딩 메시지 표시[/U]<br/><br/>WebView에서 페이지를 완전히 부르기 전까지 로딩 메시지 표시하는 방법<br/><br/>[CODE java]private class WebViewClient1 extends WebViewClient { <br/>	@Override <br/>	public boolean shouldOverrideUrlLoading(WebView view, String url) { <br/>		if(url.startsWith(&#034;tel:&#034;)) {<br/>			Intent call_phone = new Intent(Intent.ACTION_VIEW , Uri.parse(url)) ;<br/>			// 현재의 activity 에 대해 startActivity 호출<br/>			startActivity(call_phone);<br/>			return true;<br/>		}<br/>		else<br/>		{<br/>			view.loadUrl(url); <br/>			return true;<br/>		}<br/>	} <br/><br/>	/**<br/>	 * 웹페이지 로딩이 시작할 때 처리<br/>	 */<br/>	@Override<br/>	public void onPageStarted(WebView view, String url, Bitmap favicon) {<br/>		if (mProgress == null) {<br/>			mProgress = new ProgressDialog(activity);<br/>			mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);<br/>			mProgress.setTitle(&#034;Loading...&#034;);<br/>			mProgress.setMessage(&#034;Please wait for few second...&#034;);<br/>			mProgress.setCancelable(false);<br/>			mProgress.setButton(&#034;Close&#034;, new DialogInterface.OnClickListener() {<br/>				@Override<br/>				public void onClick(DialogInterface dialog, int whichButton) {<br/>					mProgress.dismiss();<br/>				}<br/>			});<br/>			mProgress.show();<br/>		}<br/>	}<br/>		&nbsp; <br/>	/**<br/>	* 웹페이지 로딩중 에러가 발생했을때 처리<br/>	*/<br/>	@Override<br/>	public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {<br/>		Toast.makeText(activity, &#034;Loading Error&#034; + description, Toast.LENGTH_SHORT).show();<br/>		if (mProgress.isShowing()) {<br/>			mProgress.dismiss();<br/>		}<br/>	}<br/>		&nbsp; <br/>	/**<br/>	* 웹페이지 로딩이 끝났을 때 처리<br/>	*/<br/>	@Override<br/>	public void onPageFinished(WebView view, String url) {<br/>		if (mProgress.isShowing()) {<br/>			mProgress.dismiss();<br/>		}<br/>	}<br/>}[/CODE]<br/><br/><br/>[I]# 아래는 다른 자료 입니다.[/I]<br/><br/>[U]Android의 WebView 구현시 화면에 ProgressDialog로 로딩화면 구현하기[/U] <br/><br/>[ATTACH]636[/ATTACH]<br/>WebView 는 안드로이드에서 브라우저의 역할을 하게 된다. 보여주고자 하는 웹페이지를 넣어서 실행만 하면 된다. 그런데 데스크탑 PC 가 아닌 관계로 네트웍 상황이 여의치 않아 끊겨 있을수도 있고 속도가 안나와서 로딩시간이 오래 걸릴수도 있다. 이럴때 웹페이지에 현재 로딩중이니 조금 기달려 달라는 메시지를 띄워주면 한결 완성도 높은 어플이 될 것이다. <br/><br/>이것을 구현하기 위해서는 상단 상태바에 값을 주고 진행하는 방법이 있고 Activity 에서 쓰는 ProgressDialog 를 화면시작과 함께 띄워주고 로딩이 끝났다면 종료하는 방법 두가지가 있다. <br/><br/>이번 아티클에서는 두번째 방법인 화면상에 로딩화면을 띄워주는 걸로 한다. <br/>로딩화면을 제대로 표현하기 위해서는 WebView 의 이벤트 함수들을 알아야 한다.<br/>이벤트 함수라 함은 WebView 에서 웹페이지를 로딩할 때 로딩시작, 로딩끝, 로딩중 에러 등등의 상태를 알수 있는 함수 들이다. 이 부분에 진행중 다이얼로그를 표현 하면된다.<br/>그럼 이것을 처리하는 클래스는 무엇일까? 바로 WebViewClient 이다. 이 함수내부를 보게 되면 페이지 로딩 과정에서 처리되는 다양한 함수들이 있는 것을 알수 있다. <br/><br/>[CODE java]WebView webView = (WebView)findViewById(R.id.webView);<br/>webView.getSettings().setJavaScriptEnabled(true);<br/>webView.setWebChromeClient(new WebChromeClient() {<br/>	public void onProgressChanged(WebView view, int progress) {<br/>		ctx.setProgress(progress * 1000);<br/>	}<br/>});<br/>webView.setWebViewClient(new WebViewExtendSample);<br/>webView.loadUrl(&#034;<A HREF="http://www.google.com&#034;);" TARGET="_blank"  rel="nofollow">http://www.google.com&#034;);</A><br/><br/>private class WebViewExtendSample extends WebViewClient{<br/>	@Override<br/>	public boolean shouldOverrideUrlLoading(WebView view, String url) {<br/>		// url 주소에 해당하는 웹페이지를 로딩<br/>		view.loadUrl(url);<br/>&nbsp; &nbsp; &nbsp; &nbsp; return true;<br/>	}<br/>	<br/>	@Override<br/>	public void onLoadResource(WebView view, String url) {<br/>		// 웹 페이지 리소스들을 로딩하면서 계속해서 호출된다.<br/>		super.onLoadResource(view, url);<br/>	}<br/>	<br/>	@Override<br/>	public void onPageFinished(WebView view, String url) {<br/>		// 페이지 로딩시 호출된다.<br/>		super.onPageFinished(view, url);<br/>	}<br/>	<br/>	@Override<br/>	public void onPageStarted(WebView view, String url, Bitmap favicon) {<br/>		// 페이지 요청이 시작될 경우 호출된다.<br/>		super.onPageStarted(view, url, favicon);<br/>	}<br/>	<br/>	@Override<br/>	public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {<br/>		// TODO Auto-generated method stub<br/>		super.doUpdateVisitedHistory(view, url, isReload);<br/>	}<br/><br/>	@Override<br/>	public void onFormResubmission(WebView view, Message dontResend, Message resend) {<br/>		// TODO Auto-generated method stub<br/>		super.onFormResubmission(view, dontResend, resend);<br/>	}<br/><br/><br/>	@Override<br/>	public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {<br/>		// TODO Auto-generated method stub<br/>		super.onReceivedHttpAuthRequest(view, handler, host, realm);<br/>	}<br/><br/>	@Override<br/>	public void onScaleChanged(WebView view, float oldScale, float newScale) {<br/>		// TODO Auto-generated method stub<br/>		super.onScaleChanged(view, oldScale, newScale);<br/>	}<br/><br/>	@Override<br/>	public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {<br/>		// TODO Auto-generated method stub<br/>		super.onTooManyRedirects(view, cancelMsg, continueMsg);<br/>	}<br/><br/>	@Override<br/>	public void onUnhandledKeyEvent(WebView view, KeyEvent event) {<br/>		// TODO Auto-generated method stub<br/>		super.onUnhandledKeyEvent(view, event);<br/>	}<br/><br/>	@Override<br/>	public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {<br/>		// 키를 오버로딩한것인데 주로 웹페이지를 뒤,앞 등으로 이동하게 한다.<br/>		// 왼쪽키를 누르게 되면 뒤로, 오른쪽 키는 앞으로 가게 한다.<br/>		/*int keyCode = event.getKeyCode();<br/>		if ((keyCode == KeyEvent.KEYCODE_DPAD_LEFT) && webview.canGoBack()) {<br/>			webview.goBack();<br/>		return true;<br/>		}else if ((keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) && webview.canGoForward()) {<br/>			webview.goForward();<br/>		&nbsp; &nbsp; return true;<br/>		}<br/>		return false;*/<br/>		return super.shouldOverrideKeyEvent(view, event);<br/>	}<br/><br/>	public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {<br/>		// 웹페이지 로딩중 에러가 발생했을때 처리 <br/>	}<br/>}[/CODE]<br/>여기서 이용할 함수는 이름으로 쉽게 파악할수 있다. 페이지 시작시 onPageStarted, 페이지 로딩이 종료 되었을 때 onPageFinished, 로딩중 에러 났을 때 onReceivedError 이다. <br/>이곳에 진행중 다이얼로그를 구현한다. <br/>[CODE java]// 페이지 시작<br/>public void onPageStarted(WebView view, String url, Bitmap favicon) {<br/>	dialog = new ProgressDialog(activity);<br/>	dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);<br/>	dialog.setTitle(&#034;Updating&#034;);<br/>	dialog.setMessage(activity.getText(R.string.web_conn));<br/>	dialog.setProgress(0);<br/>	dialog.setMax(100);<br/>	dialog.setButton(&#034;취소&#034;, new DialogInterface.OnClickListener() {<br/>		public void onClick(DialogInterface dialog, int which) {<br/>			dialog.cancel();<br/>		}<br/>	});<br/>	dialog.show();<br/>	super.onPageStarted(view, url, favicon);<br/>}<br/>// 페이지 로딩시 <br/>public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {<br/>	Toast.makeText(activity, activity.getText(R.string.web_error) + description, Toast.LENGTH_SHORT).show();<br/>	if (dialog.isShowing()) {<br/>		dialog.cancel();<br/>	}<br/>}<br/>// 페이지 종료 <br/>public void onPageFinished(WebView view, String url) {<br/>	if (dialog.isShowing()) {<br/>		dialog.cancel();<br/>	}<br/>}[/CODE]<br/><br/>출처 : <A HREF="http://mainia.tistory.com/595" TARGET="_blank"  rel="nofollow">http://mainia.tistory.com/595</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Fri, 13 May 2011 09:05:42 +0900</dc:date>
</item>


<item>
<title>WebView 사용시 Javascript Alert, Confirm 출력</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=9</link>
<description><![CDATA[[U]WebView 사용시 Javascript Alert, Confirm 출력[/U]<br/><br/>WebView에서는 자바스크립트의 Alert가 작동 하지 않는다 때문에 아래와 같이 설정하여 주면 Alert가 작동한다.<br/><br/>[CODE java]public class test3 extends Activity {<br/>&nbsp; &nbsp; /** Called when the activity is first created. */<br/>&nbsp; &nbsp; @Override<br/>&nbsp; &nbsp; public void onCreate(Bundle savedInstanceState) {<br/>&nbsp; &nbsp; &nbsp; &nbsp; super.onCreate(savedInstanceState);<br/>&nbsp; &nbsp; &nbsp; &nbsp; setContentView(R.layout.main);<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; final WebView browser = (WebView)findViewById(R.id.webView1);<br/>&nbsp; &nbsp; &nbsp; &nbsp; browser.getSettings().setJavaScriptEnabled(true);&nbsp; //javascript 사용 가능하게 한다<br/>&nbsp; &nbsp; &nbsp; &nbsp; final Context myApp = this;<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; browser.setWebChromeClient(new WebChromeClient() {<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new AlertDialog.Builder(myApp)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setTitle(&#034;AlertDialog&#034;)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setMessage(message)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setPositiveButton(android.R.string.ok,<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new AlertDialog.OnClickListener()<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public void onClick(DialogInterface dialog, int which)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.confirm();<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setCancelable(false)<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .create()<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .show();<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };<br/>&nbsp; &nbsp; &nbsp; &nbsp; });<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; browser.loadUrl(&#034;<A HREF="http://yesyo.com&#034;);" TARGET="_blank"  rel="nofollow">http://yesyo.com&#034;);</A><br/>&nbsp; &nbsp; }<br/>}[/CODE]]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Wed, 11 May 2011 16:02:21 +0900</dc:date>
</item>


<item>
<title>WebView 에서 tel: 인식</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=8</link>
<description><![CDATA[[U]WebView 에서 tel: 인식[/U]<br/><br/>WebView 안에 Html에 tel: 을 써 넣는다고 다이얼로 연결 되지 않는다.<br/><br/>우선 <br/>AndroidManifest.xml 에 아래와 같은 유저 퍼미션이 필요하다.<br/>[CODE html]&lt;uses-permission android:name=&#034;android.permission.INTERNET&#034; /&gt;<br/>&lt;uses-permission android:name=&#034;android.permission.CALL_PHONE&#034; /&gt;[/CODE]<br/><br/>그리고 아래와 같은 클래스 정의가 필요하다.<br/>tel: 로 시작 하는 URL은 새로은 엑티브를 띄운다. 그럼 tel:을 자동 인식해 다이얼이 로드된다.<br/>[CODE java]private class WebViewClient1 extends WebViewClient { <br/>	@Override <br/>	public boolean shouldOverrideUrlLoading(WebView view, String url) { <br/>		if(url.startsWith(&#034;tel:&#034;)) {<br/>			Intent call_phone = new Intent(Intent.ACTION_VIEW , Uri.parse(url)) ;<br/>			// 현재의 activity 에 대해 startActivity 호출<br/>			startActivity(call_phone);<br/>			return true;<br/>		}<br/>		else<br/>		{<br/>			view.loadUrl(url); <br/>			return true;<br/>		}<br/>	} <br/>}[/CODE]]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Wed, 11 May 2011 15:31:32 +0900</dc:date>
</item>


<item>
<title>구글 맵 API Key 발급</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=7</link>
<description><![CDATA[[U]구글 맵 API Key 발급[/U]<br/><br/>우선 MD5 Fingerprint 를 만들어야 합니다.<br/>JDK가 설치된 폴더안에 bin 폴더가 있습니다.<br/>이 폴더 안에 있는 keytool.exe 프로그램을 이용하여야 합니다.<br/><br/>우선 bin 폴더를 환경변수중 Path에 추가 합니다.<br/>그런 다음 C:\Users\사용자 계정명\.android 폴더로 이동한후<br/>keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android<br/>라고 실행 시키면 MD5 Fingerprint 가 표시됩니다.<br/><br/>이 MD5를 복사하시고<br/>[URL]<A HREF="http://code.google.com/android/maps-api-signup.html" TARGET="_blank"  rel="nofollow">http://code.google.com/android/maps-api-signup.html</A>[/URL] 페이지로 이동합니다.<br/>동의하시고 생성된 MD5를 입력하시면 API Key 가 발급됩니다.<br/><br/>layout 의 xml 파일에 생성된 키를 넣으시면 됩니다.<br/>[CODE xml]&lt;?xml version=&#034;1.0&#034; encoding=&#034;utf-8&#034;?&gt;<br/>&lt;com.google.android.maps.MapView&nbsp; &nbsp; <br/>	xmlns:android=&#034;<A HREF="http://schemas.android.com/apk/res/android&#034;" TARGET="_blank"  rel="nofollow">http://schemas.android.com/apk/res/android&#034;</A>&nbsp; &nbsp; <br/>	android:id=&#034;@+id/mapview&#034;&nbsp; &nbsp; <br/>	android:layout_width=&#034;fill_parent&#034;&nbsp; &nbsp; <br/>	android:layout_height=&#034;fill_parent&#034;&nbsp; &nbsp; 	<br/>	android:clickable=&#034;true&#034;&nbsp; &nbsp; <br/>	android:apiKey=&#034;API Key&#034;/&gt;[/CODE]<br/><br/>AndroidManifest.xml 파일에<br/>[CODE xml]&lt;uses-permission android:name=&#034;android.permission.INTERNET&#034; /&gt;<br/>&lt;uses-library android:name=&#034;com.google.android.maps&#034; android:required=&#034;true&#034;/&gt;[/CODE]<br/>도 추가 해주셔야 합니다.<br/><br/><br/>[debug용]<br/>MD5 :<br/>keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android<br/><br/>[배포용]<br/>MD5 : <br/>keytool -list -keystore ./생성한키파일명.keystore -storepass 생성한키파일비밀번호 -keypass 생성한키파일비밀번호]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Wed, 27 Apr 2011 11:06:42 +0900</dc:date>
</item>


<item>
<title>Android &lt;-&gt; WebView 간 호출하기</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=6</link>
<description><![CDATA[[U]Android &lt;-&gt; WebView 간 호출하기[/U]<br/><br/>[B]Android쪽[/B]<br/>[CODE java]public class LocalBrowser extends Activity {<br/><br/>	private static final String TAG = &#034;LocalBrowser&#034;;<br/>	private final Handler handler = new Handler();<br/>	private WebView webView;<br/>	private TextView textView;<br/>	private Button button;<br/><br/>	/** Called when the activity is first created. */<br/>	@Override<br/>	public void onCreate(Bundle savedInstanceState) {<br/>		super.onCreate(savedInstanceState);<br/>		setContentView(R.layout.main);<br/><br/>		// 화면에서 안드로이드 컨트롤 찾기<br/>		webView = (WebView) findViewById(R.id.web_view);<br/>		textView = (TextView) findViewById(R.id.text_view);<br/>		button = (Button) findViewById(R.id.button);<br/><br/>		// 임베딩된 브라우저-WebView-에 자바스크립트 활성화하기<br/>		webView.getSettings().setJavaScriptEnabled(true);<br/><br/>		// 자바 객체-AndroidBridge-를 브라우저의 자바 스크립트에 노출시키기<br/>		// 객체, 노출할 DOM명칭<br/>		webView.addJavascriptInterface(new AndroidBridge(), &#034;android&#034;);<br/><br/>		// 임의의 WebChromeClient 객체를 생성하여 WebView에 등록.<br/>		// 여기의 Chrome은 브라우저 창 주의를 정리하는 모든 작업을 일컬음. 즉, 브라우저 처리을 할 클라이언트를 등록<br/>		webView.setWebChromeClient(new WebChromeClient() {<br/><br/>		@Override<br/>		public boolean onJsAlert(WebView view, String url, String message, JsResult result) {<br/>			//return super.onJsAlert(view, url, message, result);<br/>			Log.d(TAG, &#034;onJsAlert(&#034; + view + &#034;, &#034; + url + &#034;, &#034; + message + &#034;, &#034; + result + &#034;)&#034;);<br/><br/>			Toast.makeText(LocalBrowser.this, message, 3000).show();<br/><br/>			result.confirm(); // 결과 처리됨<br/>			return true; // 여기서 처리했으므로 true 반환<br/>		}<br/>	});<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; // 로컬 assets에서 웹 페이지 로딩하기<br/>&nbsp; &nbsp; &nbsp; &nbsp; webView.loadUrl(&#034;file:///android_asset/index.html&#034;);<br/><br/>&nbsp; &nbsp; &nbsp; &nbsp; button.setOnClickListener(new View.OnClickListener() {<br/><br/>			@Override<br/>			public void onClick(View v) {<br/>				Log.d(TAG, &#034;onClick(&#034; + v + &#034;)&#034;);<br/><br/>				// 자바스크립트 호출<br/>				webView.loadUrl(&#034;javascript:callJS(&#039;Hello from Android&#039;)&#034;);<br/>			}<br/>		});<br/>	}<br/><br/><br/>	/**<br/>	* 자바 스크립트에 노출된 객체<br/>	*<br/>	*/<br/>	private class AndroidBridge {<br/>		public void callAndroid(final String arg) { // 반드시 final이어야 함<br/><br/>			handler.post(new Runnable() {<br/><br/>				@Override<br/>				public void run() {<br/>					Log.d(TAG, &#034;callAndroid(&#034; + arg + &#034;)&#034;);<br/><br/>					textView.setText(arg);<br/>				}<br/>			});<br/>		}<br/>	}<br/>}[/CODE]<br/><br/><br/>[B]WebView쪽[/B]<br/>[CODE html]&lt;html&gt;<br/>&lt;head&gt;<br/>&lt;script type=&#034;text/javascript&#034;&gt;<br/>function callJS(arg) {<br/>	document.getElementById(&#034;replaceme&#034;).innerHTML = arg;<br/>}<br/>&lt;/script&gt;<br/>&lt;/head&gt;<br/>&lt;body&gt;<br/>&lt;h1&gt;WebView&lt;/h1&gt;<br/>&lt;p&gt;<br/>	&lt;a href=&#034;#&#034; onclick=&#034;window.alert(&#039;Alert from JavaScript&#039;);&#034;&gt;Display JavaScript alert&lt;/a&gt;<br/>&lt;/p&gt;<br/>&lt;p&gt;<br/>	&lt;a href=&#034;#&#034; onclick=&#034;window.andriod.callAndroid(&#039;Hello from Browser&#039;);&#034;&gt;&lt;/a&gt;<br/>&lt;/p&gt;<br/>&lt;p id=&#034;replaceme&#034;&gt;&lt;/p&gt;<br/>&lt;/body&gt;<br/>&lt;/html&gt;[/CODE]<br/>addJavascriptInterface() 에서 설정한 DOM명칭 &#034;android&#034;로 WebView에서 호출가능하다.<br/>- final 매개변수를 잘 사용하자. -&gt; 메소드 내에서 변경하면 안되는 값(주소값)일 경우에 사용하면 유용할 듯<br/><br/><br/>출처 : <A HREF="http://lonelycat.tistory.com/447" TARGET="_blank"  rel="nofollow">http://lonelycat.tistory.com/447</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 21 Apr 2011 21:04:14 +0900</dc:date>
</item>


<item>
<title>여러 크기의 폰에 따른 레이아웃 설정</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=5</link>
<description><![CDATA[[U]여러 크기의 폰에 따른 레이아웃 설정[/U]<br/><br/>기존 레이아웃을 사용하여 갤럭시탭과 같은 큰 화면의 기기로 실행시키면<br/>레이아웃이 작아지거나 깨지는 경우가 있습니다.<br/><br/>이때는 여러개의 레이아웃을 만드는것이 좋습니다.<br/><br/>[B]AndroidManifest.xml[/B] 에 아래 코드를 삽입하여 주시고.<br/>[CODE]&lt;supports-screens android:largeScreens=&#034;true&#034; android:normalScreens=&#034;true&#034; android:anyDensity=&#034;true&#034; /&gt;[/CODE]<br/><br/>layout 을 몇가지 추가 하시면 됩니다.<br/>layout-1024x600 나 layout-large <br/><br/>drawable 도 drawable-hdpi-1024x600 와 같이 만들면 갤럭시탭에서 사용할 수 있습니다.<br/><br/>[CODE]res/layout/my_layout.xml&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // layout for normal screen size<br/>res/layout-small/my_layout.xml&nbsp; &nbsp; &nbsp; // layout for small screen size<br/>res/layout-large/my_layout.xml&nbsp; &nbsp; &nbsp; // layout for large screen size<br/>res/layout-large-land/my_layout.xml // layout for large screen size in landscape mode<br/>res/layout-xlarge/my_layout.xml&nbsp; &nbsp;  // layout for extra large screen size<br/><br/>res/drawable-lhdpi/my_icon.png&nbsp; &nbsp; &nbsp; // image for low density<br/>res/drawable-mdpi/dpi/my_icon.png&nbsp;  // image for medium density<br/>res/drawable-hdpi/my_icon.png&nbsp; &nbsp; &nbsp;  // image for high density<br/>res/drawable-nodpi/composite.xml&nbsp; &nbsp; // density independent resource[/CODE]<br/><br/>아래 URL을 참고 하세요<br/>[URL]<A HREF="http://developer.android.com/guide/practices/screens_support.html" TARGET="_blank"  rel="nofollow">http://developer.android.com/guide/practices/screens_support.html</A>[/URL]<br/>[URL]<A HREF="http://innovator.samsungmobile.com/galaxyTab.do" TARGET="_blank"  rel="nofollow">http://innovator.samsungmobile.com/galaxyTab.do</A>[/URL]]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Wed, 20 Apr 2011 15:23:20 +0900</dc:date>
</item>


<item>
<title>Http Post 방식으로 웹서버와 자료를 주고받는 예제</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=4</link>
<description><![CDATA[[U]Http Post 방식으로 웹서버와 자료를 주고받는 예제[/U]<br/><br/>다음 프로그램은 <A HREF="http://korea-com.org/foxmann/lesson01.php" TARGET="_blank"  rel="nofollow">http://korea-com.org/foxmann/lesson01.php</A> 와 자료를 주고받는 예제이다. <br/><br/>[주의 사항] <br/>1. <A HREF="http://korea-com.org/foxmann/lesson01.php" TARGET="_blank"  rel="nofollow">http://korea-com.org/foxmann/lesson01.php</A> 는 실습을 위해 임시로 만든 페이지이므로 언제든지 내 맘대로 삭제해 버릴 수 있다. <br/>2. 위의 사이트를 해킹하는 행위는 형사 처벌을 받게 되므로 주의해야 한다. <br/>3. 해킹 시도시 접속자의 ip를 추적해서 사용자의 컴퓨터를 포맷해 버리는 악랄한(?) 프로텍트를 사용하고 있으므로 특히 주의한다. <br/><br/>실행 결과 : 페이지1로 전송하고 페이지2로 결과 받음 <br/>[ATTACH]626[/ATTACH] [ATTACH]627[/ATTACH]<br/><br/>[B]main.xml [/B]<br/>[CODE xml]&lt;?xml version=&#034;1.0&#034; encoding=&#034;utf-8&#034;?&gt; <br/>&lt;TabHost <br/>	xmlns:android=&#034;<A HREF="http://schemas.android.com/apk/res/android&#034;" TARGET="_blank"  rel="nofollow">http://schemas.android.com/apk/res/android&#034;</A> <br/>	android:id=&#034;@android:id/tabhost&#034;&nbsp; <br/>	android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>	android:layout_height=&#034;fill_parent&#034;&gt; <br/><br/>	&lt;LinearLayout&nbsp; <br/>		android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>		android:layout_height=&#034;fill_parent&#034;&nbsp; <br/>		android:orientation=&#034;vertical&#034;&gt;&nbsp; <br/><br/>		&lt;TabWidget&nbsp; <br/>			android:id=&#034;@android:id/tabs&#034;&nbsp; <br/>			android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>			android:layout_height=&#034;wrap_content&#034;/&gt; <br/><br/>		&lt;TextView <br/>			android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>			android:layout_height=&#034;wrap_content&#034;/&gt; <br/>		&lt;FrameLayout&nbsp; <br/>			android:id=&#034;@android:id/tabcontent&#034;&nbsp; <br/>			android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>			android:layout_height=&#034;fill_parent&#034;&gt; <br/><br/>			&lt;TableLayout&nbsp; <br/>				android:id=&#034;@+id/page01&#034;&nbsp; <br/>				android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>				android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>				android:stretchColumns=&#034;1&#034;&gt; <br/><br/>				&lt;TableRow&gt; <br/>					&lt;TextView&nbsp; <br/>						android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034; <br/>						android:text=&#034;ID :&#034;/&gt; <br/>					&lt;EditText&nbsp; <br/>						android:id=&#034;@+id/edit_Id&#034;&nbsp; <br/>						android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;/&gt; <br/>				&lt;/TableRow&gt;<br/>				&lt;TableRow&gt; <br/>					&lt;TextView&nbsp; <br/>						android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>						android:text=&#034;PWord : &#034;/&gt; <br/>					&lt;EditText&nbsp; <br/>						android:id=&#034;@+id/edit_pword&#034;&nbsp; <br/>						android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>						android:password=&#034;true&#034;/&gt; <br/>				&lt;/TableRow&gt;<br/>				&lt;TableRow&gt; <br/>					&lt;TextView&nbsp; <br/>						android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>						android:text=&#034;개념 : &#034;/&gt; <br/>					&lt;EditText&nbsp; <br/>						android:id=&#034;@+id/edit_title&#034;&nbsp; <br/>						android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;/&gt; <br/>				&lt;/TableRow&gt;<br/>				&lt;TableRow&gt; <br/>					&lt;TextView&nbsp; <br/>						android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>						android:text=&#034;대책 : &#034;/&gt; <br/>					&lt;EditText&nbsp; <br/>						android:id=&#034;@+id/edit_subject&#034;&nbsp; <br/>						android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;&nbsp; <br/>						android:lines=&#034;4&#034;/&gt; <br/>				&lt;/TableRow&gt;<br/>				&lt;View&nbsp; <br/>					android:layout_height=&#034;2dip&#034;&nbsp; <br/>					android:background=&#034;#AAAAAA&#034;/&gt; <br/>				&lt;TableRow&gt; <br/>					&lt;Button&nbsp; <br/>						android:text=&#034;&nbsp;  전&nbsp; &nbsp; 송&nbsp; &nbsp; &#034;&nbsp; <br/>						android:id=&#034;@+id/button_submit&#034;&nbsp; <br/>						android:layout_column=&#034;1&#034; <br/>						android:layout_width=&#034;wrap_content&#034;&nbsp; <br/>						android:layout_height=&#034;wrap_content&#034;/&gt; <br/>				&lt;/TableRow&gt;<br/>			&lt;/TableLayout&gt;<br/><br/>			&lt;LinearLayout <br/>				android:id=&#034;@+id/page02&#034;&nbsp; <br/>				android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>				android:layout_height=&#034;wrap_content&#034;&gt; <br/>				&lt;TextView&nbsp; <br/>					android:id=&#034;@+id/text_result&#034;&nbsp; <br/>					android:layout_width=&#034;fill_parent&#034;&nbsp; <br/>					android:layout_height=&#034;wrap_content&#034;/&gt; <br/>			&lt;/LinearLayout&gt;<br/>		&lt;/FrameLayout&gt;<br/>	&lt;/LinearLayout&gt;<br/>&lt;/TabHost&gt;[/CODE]<br/><br/>[B]Manifest.xml[/B]에 다음과 같은 퍼미션을 줘야 한다.<br/>&lt;uses-permission android:name=&#034;android.permission.INTERNET&#034;&gt;&lt;/uses-permission&gt;<br/><br/>[B]project[/B]<br/>[CODE java]package com.http_post;<br/><br/>import java.io.*;<br/>import java.net.*;<br/><br/>import android.app.*;<br/>import android.os.*;<br/>import android.util.*;<br/>import android.view.*;<br/>import android.widget.*;<br/><br/>public class MainActivity extends TabActivity {<br/>	// 전역변수를 선언한다<br/>	TabHost mTabHost = null;<br/>	String myId, myPWord, myTitle, mySubject, myResult;<br/>&nbsp;<br/>	@Override<br/>	public void onCreate(Bundle savedInstanceState) {<br/>		super.onCreate(savedInstanceState);<br/>		setContentView(R.layout.main);<br/><br/>		mTabHost = getTabHost();	// Tab 만들기<br/>		mTabHost.addTab(mTabHost.newTabSpec(&#034;tab_1&#034;).setIndicator(&#034;서버로 전송&#034;).setContent(R.id.page01));<br/>		mTabHost.addTab(mTabHost.newTabSpec(&#034;tab_2&#034;).setIndicator(&#034;서버에서 받음&#034;).setContent(R.id.page02));<br/>		findViewById(R.id.button_submit).setOnClickListener(buttonClick); <br/>	}<br/><br/>	//------------------------------<br/>	//&nbsp; &nbsp; button Click<br/>	//------------------------------<br/>	Button.OnClickListener buttonClick = new Button.OnClickListener() {<br/>		public void onClick(View v) {<br/>			// 사용자가 입력한 내용을 전역변수에 저장한다<br/>			myId = ((EditText)(findViewById(R.id.edit_Id))).getText().toString(); <br/>			myPWord = ((EditText)(findViewById(R.id.edit_pword))).getText().toString(); <br/>			myTitle = ((EditText)(findViewById(R.id.edit_title))).getText().toString(); <br/>			mySubject = ((EditText)(findViewById(R.id.edit_subject))).getText().toString(); <br/><br/>			HttpPostData();	// 서버와 자료 주고받기<br/>		}<br/>	};<br/><br/>	//------------------------------<br/>	//&nbsp;  Http Post로 주고 받기<br/>	//------------------------------<br/>	public void HttpPostData() {<br/>		try {<br/>			//--------------------------<br/>			//&nbsp;  URL 설정하고 접속하기<br/>			//--------------------------<br/>			URL url = new URL(&#034;<A HREF="http://korea-com.org/foxmann/lesson01.php&#034;);" TARGET="_blank"  rel="nofollow">http://korea-com.org/foxmann/lesson01.php&#034;);</A>	// URL 설정<br/>			HttpURLConnection http = (HttpURLConnection) url.openConnection();	// 접속<br/>			//--------------------------<br/>			//&nbsp;  전송 모드 설정 - 기본적인 설정이다<br/>			//--------------------------<br/>			http.setDefaultUseCaches(false);<br/>			http.setDoInput(true);	// 서버에서 읽기 모드 지정<br/>			http.setDoOutput(true);	// 서버로 쓰기 모드 지정 <br/>			http.setRequestMethod(&#034;POST&#034;);	// 전송 방식은 POST<br/><br/>			// 서버에게 웹에서 &lt;Form&gt;으로 값이 넘어온 것과 같은 방식으로 처리하라는 걸 알려준다<br/>			http.setRequestProperty(&#034;content-type&#034;, &#034;application/x-www-form-urlencoded&#034;);<br/>			//--------------------------<br/>			//&nbsp;  서버로 값 전송<br/>			//--------------------------<br/>			StringBuffer buffer = new StringBuffer();<br/>			buffer.append(&#034;id&#034;).append(&#034;=&#034;).append(myId).append(&#034;&&#034;);	// php 변수에 값 대입<br/>			buffer.append(&#034;pword&#034;).append(&#034;=&#034;).append(myPWord).append(&#034;&&#034;);	// php 변수 앞에 &#039;$&#039; 붙이지 않는다<br/>			buffer.append(&#034;title&#034;).append(&#034;=&#034;).append(myTitle).append(&#034;&&#034;);	// 변수 구분은 &#039;&&#039; 사용 <br/>			buffer.append(&#034;subject&#034;).append(&#034;=&#034;).append(mySubject);<br/>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br/>			OutputStreamWriter outStream = new OutputStreamWriter(http.getOutputStream(), &#034;EUC-KR&#034;);<br/>			PrintWriter writer = new PrintWriter(outStream);<br/>			writer.write(buffer.toString());<br/>			writer.flush();<br/>			//--------------------------<br/>			//&nbsp;  서버에서 전송받기<br/>			//--------------------------<br/>			InputStreamReader tmp = new InputStreamReader(http.getInputStream(), &#034;EUC-KR&#034;); <br/>			BufferedReader reader = new BufferedReader(tmp);<br/>			StringBuilder builder = new StringBuilder();<br/>			String str;<br/>			while ((str = reader.readLine()) != null) {	// 서버에서 라인단위로 보내줄 것이므로 라인단위로 읽는다<br/>				builder.append(str + &#034;\n&#034;);	// View에 표시하기 위해 라인 구분자 추가<br/>			}<br/>			myResult = builder.toString();	// 전송결과를 전역 변수에 저장<br/>			((TextView)(findViewById(R.id.text_result))).setText(myResult);<br/>			Toast.makeText(MainActivity.this, &#034;전송 후 결과 받음&#034;, 0).show();<br/>		} catch (MalformedURLException e) {<br/>			//<br/>		} catch (IOException e) {<br/>			// <br/>		} // try<br/>	} // HttpPostData<br/>} // Activity[/CODE]<br/><br/>[B]lesson01.php[/B]<br/>[CODE php]&lt;?<br/>// 변수 내용 확인<br/>if ($id == &#034;&#034;) $id = &#034;너는 ID도 없냐?&#034;;<br/>if ($pword == &#034;&#034;) $pword = &#034;칠칠맞게 비밀번호도 잊어먹고 다니네...&#034;;<br/>if ($title == &#034;&#034;) $title = &#034;증말 개념없는 사람일세...&#034;;<br/>if ($subject == &#034;&#034;) $subject = &#034;에구~~ 대책이 없네...&#034;;<br/>// 변수 내용 출력<br/>echo (&#034;<br/>&nbsp;님께서 PHP로 전송한 내용입니다<br/>&nbsp;-----------------------------------------------------------------\r\n<br/>&nbsp;사용자 ID : $id \r\n<br/>&nbsp;비밀번호 : $pword \r\n<br/>&nbsp;개념 : $title \r\n<br/>&nbsp;대책 : $subject \r\n<br/>&nbsp;-----------------------------------------------------------------\r\n<br/>&nbsp;축하드립니다. lesson01.php 를 정삭적으로 호출하셨습니다!<br/>&#034;);<br/>?&gt;[/CODE]<br/><br/>출처 : <A HREF="http://www.androidside.com/bbs/board.php?bo_table=421&wr_id=137" TARGET="_blank"  rel="nofollow">http://www.androidside.com/bbs/board.php?bo_table=421&wr_id=137</A>]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Sun, 03 Apr 2011 14:21:01 +0900</dc:date>
</item>


<item>
<title>HttpPost (POST 방식으로 파라메터 넘기기)</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=3</link>
<description><![CDATA[[U]HttpPost (POST 방식으로 파라메터 넘기기)[/U]<br/><br/>[I]Executing a HTTP POST Request with HttpClient[/I] <br/><br/>[CODE java]public void postData() {<br/>	// Create a new HttpClient and Post Header<br/>	HttpClient httpclient = new DefaultHttpClient();<br/>	HttpPost httppost = new HttpPost(&#034;<A HREF="http://www.yoursite.com/script.php&#034;);" TARGET="_blank"  rel="nofollow">http://www.yoursite.com/script.php&#034;);</A><br/>	try {<br/>		// Add your data<br/>		List&lt;NameValuePair&gt; nameValuePairs = new ArrayList&lt;NameValuePair&gt;(2);<br/>		nameValuePairs.add(new BasicNameValuePair(&#034;id&#034;, &#034;12345&#034;));<br/>		nameValuePairs.add(new BasicNameValuePair(&#034;stringdata&#034;, &#034;AndDev is Cool!&#034;));<br/>		httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));<br/>		// Execute HTTP Post Request<br/>		HttpResponse response = httpclient.execute(httppost);<br/>	} catch (ClientProtocolException e) {<br/>		// TODO Auto-generated catch block<br/>	} catch (IOException e) {<br/>		// TODO Auto-generated catch block<br/>	}<br/>} [/CODE]]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 31 Mar 2011 11:57:19 +0900</dc:date>
</item>


<item>
<title>[PDF] Android UI Design Patterns</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=2</link>
<description><![CDATA[[U][PDF] Android UI Design Patterns[/U]<br/><br/>PDF문서입니다.<br/><br/>Richard Fulcher, Chris Nesladek,<br/>Jim Palmer, Christian Robertson<br/>May 19, 2010]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 31 Mar 2011 11:38:32 +0900</dc:date>
</item>


<item>
<title>android 웹서비스 구현하기 참조 문서</title>
<link>https://go3.co.kr/mintbbs/bbs/board.php?bo_table=android&amp;amp;wr_id=1</link>
<description><![CDATA[[U]android 웹서비스 구현하기 참조 문서[/U]<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/tutorial/j-dw-java-rest-i.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/tutorial/j-dw-java-rest-i.html</A>[/URL]<br/>RESTful한 웹 서비스 만들기<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-pojo-springcxf2/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-pojo-springcxf2/index.html</A>[/URL]<br/>스프링과 아파치 CXF를 이용해 POJO 웹 서비스를 디자인하고 구현하기, Part 2: RESTful 웹 서비스 만들기<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/j-jws12.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/j-jws12.html</A>[/URL]<br/>Java 웹 서비스: CXF 소개<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/j-jws9.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/j-jws9.html</A>[/URL]<br/>Java 웹 서비스: Metro 소개<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/tutorial/ws-dw-ws-eclipse-javase1.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/tutorial/ws-dw-ws-eclipse-javase1.html</A>[/URL]<br/>Eclipse와 Java SE 6을 사용하여 독립형 웹 서비스 개발하기, Part 1: 웹 서비스 서버 애플리케이션<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/tutorial/x-dw-x-restatompp.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/tutorial/x-dw-x-restatompp.html</A>[/URL]<br/>REST 서비스 작성하기<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-soa-axis2-1/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-soa-axis2-1/index.html</A>[/URL]<br/>Axis2에서의 SOA 개발, Part 1: Axis2 기초 이해하기 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-wsajax2/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-wsajax2/index.html</A>[/URL]<br/>Ajax로 SOAP 웹 서비스 호출하기, Part 2: 웹 서비스 클라이언트 확장하기 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-wsajax/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-wsajax/index.html</A>[/URL]<br/>Ajax로 SOAP 웹 서비스 호출하기, Part 1: 웹 서비스 클라이언트 구현하기 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/wa-ajaxarch/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/wa-ajaxarch/index.html</A>[/URL]<br/>Ajax와 REST, Part 1 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-soaphandler/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-soaphandler/index.html</A>[/URL]<br/>SOAP/HTTP 웹 서비스를 위해 신뢰성 있는 클라이언트 구현하기<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-sqzsoap.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-sqzsoap.html</A>[/URL]<br/>SOAP 압축하기 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-dw-ws-understand-web-services1.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-dw-ws-understand-web-services1.html</A>[/URL]<br/>웹 서비스 이해하기, Part 1: SOAP<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-whichwsdl/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-whichwsdl/index.html</A>[/URL]<br/>WSDL 고르기 (한글)<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/x-tippass.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/x-tippass.html</A>[/URL]<br/>Tip: 웹 서비스에 파일 전달하기<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-security.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-security.html</A>[/URL]<br/>WS-Security 구현<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-soapenc/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-soapenc/index.html</A>[/URL]<br/>SOAP 인코딩이 웹 서비스 퍼포먼스에 미치는 영향<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/ws-sec1.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/ws-sec1.html</A>[/URL]<br/>웹 서비스 보안, Part I 2010/06/23 20:15 2010/06/23 20:15<br/><br/>[URL]<A HREF="http://www.ibm.com/developerworks/kr/library/x-andbene1/index.html" TARGET="_blank"  rel="nofollow">http://www.ibm.com/developerworks/kr/library/x-andbene1/index.html</A>[/URL]<br/>Android에서 XML과 JSON 사용하기, Part 1: Android 애플리케이션에서 XML과 JSON을 사용함으로써 얻을 수 있는 혜택 탐구]]></description>
<dc:creator>MintState</dc:creator>
<dc:date>Thu, 31 Mar 2011 11:25:42 +0900</dc:date>
</item>

</channel>
</rss>
