반응형

 Android에서 WebView의 addJavascriptInterface 를 이용하면 Web에서 javascript를 통해서 보내는 명령들을 받아낼 수 있다. 그런데 해당 내용을 proguard를 적용하여 apk를 만들고 나면 잘 되던 것이 전혀 작동을 하지 않게 된다. 단순히 proguard를 적용하지 않으면 문제없지만, 그렇지 않으면 apk를 decompile 하게 되면 코드의 내용이 다 공개되니 proguard를 하지 않는 것은 더욱이나 좋은 방법이 아닌 것 같다.

 무엇이든 문제가 있으면 해결 방법도 있는 법. proguard의 설정파일에다가 아래와 같은 내용을 추가 해 주면 된다.

-keepclassmembers class * implements YOURPACKAGE$JavaScriptInterface {

    <methods>;

}

그리고 android API 17+ 부터는 JavascriptInterface 메소드 안에 "@JavascriptInterface" 의 annotation을 추가해 줘야만 한다고도 함. 그리고 annotation에 대해서 proguard를 적용할려면

-keepclassmembers class * {

    @android.webkit.JavascriptInterface <methods>;

}

와 같은 내용도 proguard 설정 스크립트 안에 추가해 줘야 한다.


이후 apk를 proguard 적용하여 만들어도 Web과 App간의 javascriptInterface간 통신에는 전혀 문제가 없게 된다.

반응형

'Android' 카테고리의 다른 글

[Android] RemoteControlClient 활용하기.  (0) 2014.05.23
[Android]ANDROID PERFORMANCE OPTIMIZATION  (0) 2014.02.25
[Android] ActionBarCompat  (0) 2013.08.14
[Android] Text shaodw style...  (2) 2013.07.25
[Android] 퀵터치(QuickTouch)  (1) 2013.07.18
반응형

Android에서 보통 support-v4 library를 많이 사용하죠. ViewPager와 Fragment등등 때문에...

그런데 이번에 ActionBar를 하위 버전에서 사용할 수 있도록 suppert-v7이 변경되어서 나왓습니다.

google에서 가면 갈수록 api가 상위버전에서만 사용할 수 있는 것들을 하위 버전에서 사용할 수 있도록 해주니 좋긴 좋군요. 그런데 하위버전에서 안되서 기존의 있는 sdk를 이용하여 custom하게 만들어서 사용하던 분들은 약간의 짜증?? 이 날 수도 있겠죠 ㅋㅋ 저같은 경우는 ViewPager가 안나왔을 때 ViewPager와 같은 기능을 만들어서 잘 사용하고 있더니 suppert-v4에 ViewPager를 넣어서 내놓더군요..... 욕심에 제가 만든걸 잘 사용하다가 결국엔 ViewPager로만 사용하게 되었던 ^^


자 그럼 ActionBar를 사용하기 위한 suppert-v7의 이용 방법 입니다.


전 eclipse 3.7 Indigo와 ADT 21을 이용합니다. 현재 eclipse는 4.3 kepler가 최신이고, ADT는 22입니다. 


1. Android SDK Manager를 이용하여 Android Suppert Library를 rev.18로 업데이트 한다.

2. Android Project from Existing Code

3. suppert-v4 하위에 있는 appcompat library 프로젝트 추가.

 - SDK가 설치된 하위 폴더의 extra->android->compatibility->v7->appcompat 추가.

   ex)/Volumes/Macintosh DATA/03.sdk/android-sdk-macosx/extras/android/compatibility/v7/appcompat


4. 추가된 부분 확인 - 아래 그림과 같이 support-v7-appcompat의 library프로젝트가 추가된 것을 확인할 수 있습니다.

5. Sample Project만들기.

 - 간단한 샘플 프로젝트를 만든 뒤 Properties->Android->Library에서 좀전에 추가한 support-v7-appcompat프로젝트를 추가합니다. 그리고 Project Build Target은 4.1.2 (API 16)이상으로 해야 합니다. suppoert-v7-appcompat이 4.1.2(API 16)으로 되어 있기 때문에...


6. AndroidManifest.xml의 Theme변경

android:theme="@style/AppTheme" -> android:theme="@style/Theme.AppCompat"

으로 변경합니다. 어떤 구조로 되어 있는지는 suppert-v7-appcompat의 resource인 themes.xml파일을 살펴보시면 됩니다.


7. ActionBarActivity 

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends Activity -> public class MainActivity extends ActionBarActivity

으로 변경


8. menu 추가

 - ActionBarCompat용 menu리소스를 추가 합니다. 기존과 틀린점이 있다면 xmlns:action_sample="http://schemas.android.com/apk/res-auto" 의 action_sample namespace입니다. 하위 아이템을 보면 [action_sample:showAsAction="always" ]의 추가된 namespace로된 속성값이 있습니다. ActionBarCompat의 namespace로 온 속성을 사용하기 위함입니다.

- action.menu.xml 내용




android:id="@+id/menu_sample"
android:title="@string/action_sample"
android:icon="@drawable/ic_launcher"
action_sample:showAsAction="always"/>



	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.action_menu, menu);
		return true;
	}

}


9. event 발생

 - 추가된 actionbar의 아이콘을 클릭했을 때 toast message를 보여주도록 했습니다.

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case R.id.menu_sample: {
			Toast.makeText(this, R.string.action_sample, Toast.LENGTH_SHORT)
					.show();
			break;
		}
		}

		return super.onOptionsItemSelected(item);
	}


반응형
반응형

Android 의 TextView에는 shadow 효과가 기본적으로 있습니다. shadow효과로 다양한 TextStyle을 만들 수 있는데 이번 포스트에서는 shadow효과의 다양한 value에 의해서 어떤 효과가 나오는지 확인해 볼려고 합니다.


우선 TextView에 있는 shadow 효과에 사용되는 xml attribute와 method를 확인해 보면

android:shadowColor

Place a shadow of the specified color behind the text.

Must be a color value, in the form of "#rgb", "#argb", "#rrggbb", or "#aarrggbb".

This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

This corresponds to the global attribute resource symbol shadowColor.

android:shadowDx

Horizontal offset of the shadow.

Must be a floating point value, such as "1.2".

This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

This corresponds to the global attribute resource symbol shadowDx.

android:shadowDy

Vertical offset of the shadow.

Must be a floating point value, such as "1.2".

This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

This corresponds to the global attribute resource symbol shadowDy.

android:shadowRadius

Radius of the shadow.

Must be a floating point value, such as "1.2".

This may also be a reference to a resource (in the form "@[package:]type:name") or theme attribute (in the form "?[package:][type:]name") containing a value of this type.

This corresponds to the global attribute resource symbol shadowRadius.

이와 같습니다. shadowColor는 shadow의 색상, shadowDx는 shadow의 X방향 offset, shadowDy는 shadow의 Y방향 offset, shadowRadius는 shadow의 반지름이 됩니다.

샘플코드를 확인해 보겠습니다.

<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:padding="10dip" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:shadowColor="#7F000000"
            android:shadowDx="3"
            android:shadowDy="3"
            android:shadowRadius="0.01"
            android:text="Shadow Style"
            android:textColor="#000000" />
</LinearLayout>

이와 같이 하면 결과는

이와 같습니다. 검은 Shodow Style 아래에 회색의 shadow가 있는 것을 확인할 수 있습니다. 그림자 위치를 더 멀리 하고 싶아면 shadowDx와 shadowDy값을 더 많이 주면 됩니다.

위의 결과에 shadowRadius값을 변경했을 때 코드는

<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:padding="10dip" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:shadowColor="#7F000000"
            android:shadowDx="3"
            android:shadowDy="3"
            android:shadowRadius="1.5"
            android:text="Shadow Style"
            android:textColor="#000000" />
</LinearLayout>

이와 같이 했을 경우 결과는

이렇게 됩니다. shadowRadius값에 따라서 shadow모양이 변경된 것을 볼 수 있습니다.

그럼 이번에는 shadow의 방향을 바꾸도록 하겠습니다.

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"

        android:padding="10dip" >
        <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:shadowColor="#7F000000"             android:shadowDx="3"             android:shadowDy="-3"             android:shadowRadius="1.5"             android:text="Shadow Style"             android:textColor="#000000" />     </LinearLayout>

이와 같이 했을 때 결과는

이와 같습니다.그림자가 오른쪽 위 방향으로 변경되었습니다. shadowDx와 shadowDy의 값의 +- 에 따라서 값이 shadow방향이 변경 됩니다. 소위 발하는 그림자가 45` 방향이면 shadowDx는 +, shadowDy는 -을 주고, 135`방향을 경우는 둘다 +의 값을 주면 됩니다.


이번에는 shoadow를 이용한 blur 효과 비슷하게 주는 방법입니다.

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:padding="10dip" >

        <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:shadowColor="#FFFFFF"             android:shadowDx="0"             android:shadowDy="0"             android:shadowRadius="3"             android:text="Shadow Style"             android:textColor="#FFFFFF" />     </LinearLayout>

이와 같이 shadowDx와 shadowDy의 값을 0.. shadowRadius값만 +로 주었을 때 결과는

이와 같습니다. 글자 주변으로 blur 효과가 나타는 것을 볼 수 있습니다.


이번에는 네온사인?? 같은 효과 입니다.

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:padding="10dip" >

        <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:shadowColor="#FFFFFF"             android:shadowDx="0"             android:shadowDy="0"             android:shadowRadius="2"             android:text="Shadow Style"             android:textColor="#000000" />     </LinearLayout>
    <LinearLayout         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:background="#000000"         android:padding="10dip" >
        <TextView             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:shadowColor="#00FF00"             android:shadowDx="0"             android:shadowDy="0"             android:shadowRadius="2"             android:text="Shadow Style"             android:textColor="#000000" />     </LinearLayout>

이와 같이 했을 때 결과는


이와 같습니다. 이건 단지 배경과 글자색을 같게 하고 그림자 색상만 다르게 했을 때 입니다. 


TextView의 shadowDx, shadowDy, shadowRadius값에 따라서 TextView의 효과를 확인해보았습니다. 그런데 저는 제일 많이 쓰는 것은 단지 ShadowDx=2 shadowDy=2 shadowRadius=2 인것 같습니다. 이건 단지 개인별로 차이가 있겟지만요 ^^




반응형
반응형

 오랜만에 제 블로그에 글을 써봅기 시작합니다 ^^

 안드로이드 개발을 시작한지... 좀 되었네요 ㅎㅎ... 관심있어서 공부한 시간은 빼고 앱을 처음 만들어서 런칭했을 때가 2010년이니 시간이 참 많이도 지났네요 ㅎㅎ 제 블로그에 제가 회사다니면서 만든 앱을 적어둔 것도 있지만 안그런 것도 많아서ㅋ

 그럼 제가 개인적으로 이번에 만들어본 어플을 정리해 볼까 합니다.

우선 마켓은 

https://play.google.com/store/apps/details?id=com.magimon.quicktouch

이곳입니다.

이름은 퀵터치(QuickTouch)입니다. 앱 이름을 정하는 것도 참 힘들더군요 ㅡㅡ...

 주된 기능은 다른 앱이 실행되더라도 항상 퀵터치 뷰가 보여지고, 뷰안에서 모바일 데이터, 배터리, 메모리 등을 모니터링 합니다. 그리고 항상 빨리 실행하고 싶은 앱을 추가해서 다른 앱을 실행하더라도 그 위치에서 바로 실행할 수 있습니다. 머 이게 주된 기능이라고 보면 될듯 하네요.

 모바일 데이터를 모니터링 해주는 앱은 많지만, 이것을 확인할려면 위젯이나 안드로이드의 notification bar에서 확인해야 합니다. 다른 앱이 실행중이면 위젯은 가려져서 확인할 수 없고, notification bar에서는 화면을 내려봐야 사용된 내용을 확인할 수 있죠. 이런것도 단순히 항상.. 실시간으로 확인해 보는 것입니다. 모바일 게임을 하면서 항상 데이터를 확인할 수 있죠.

 안드로이드느 백그라운드에서 앱이 많이 실행됩니다. 여러가지 서비스도 많이 돌고, 넥서스 시리즈가 아닌 국내 제조사의 폰들은 자체적으로 또 많은 추가적인 서비스를 넣죠. 요즘 최신 디바이스들이 메모리가 2기가 가까이 되지만 메모리를 기본적으로 많이 사용하고있죠. PC를 생각해도 메모리를 많이 사용하면 PC전체가 조금 느려지기도 하고 .. 그래서 메모리 사용량을 실시간으로 모니터링해 보여주고, 메모리를 사용자 설정보다 많이 사용하게 되면 메모리를 clear하라는 경고를 알려줍니다. 

 하상 퀵터치 뷰가 맨위에 존재하다 보니 이걸 통해서 언제든지 사용자가 등록해둔 앱을 빨리 실행해 볼 수도 있습니다. 기본적으로 하나의 앱을 실행하는 도중에 다른앱을 실행할려면 백키나 홈키를 통해서 빠져 나온 뒤 실행해야 하지만, 이것은 바로바로 실행할 수 있죠. 조금의 시간이라도 절약할 수 있는 겁니다 ^^


 

 

 

 

 

 


아직 수정하고 손봐야 할 곳들이 많습니다. 추가했으면 하는 기능은 댓글로 남겨주시거나 메일로 보내주셔도 됩니다 ^^ 소중한 의견은 앱의 발전에 큰 도움이 됩니다 ㅋ



반응형
반응형

상당히 오랜만에 블로그에 글을  쓴다.

그리고 이번 글은 정답이 없는 글이라고 생각한다. 그냥 개인적인 생각을 좀 적어보고 싶은 것 뿐.

난 아직 부족한 개발자다. 완벽하게 하고 싶지만 항상 2% 부족했고, 그리고 내 코드도 완벽하지 않다고 생각한다.  그 부족한 부분은 개발할 당시엔 모르고 한참 후에야 알게되곤 했으니까... 그리고 난 스스로 발전시킬려고 노력하고 있다. 


얼마전 프로젝트에서 디자이너가 나한테 이렇게 말했다. 

[디자이너가 나인패치를 하기 어렵고 하니 배경 관련된 부분을 pattern으로 가자고, 이전 개발자는 버튼 배경 이미지를 사용했을 대 1px짜리 버튼 이미지를 주면 코드로 알아서 모서리 부분도 라운드 처리해서 사용했다. 그러니 그렇게 가자고]

이 말을 들었을 대 순간적으로 든 생각은 이러했다.

왜!!! 편한길 놔두고 어려운길을 택했는가!!!

그래도 말로 잘 풀어서 나인패치로 했을 때의 좋은점을 설명하고 나인패치가 적용된 이미지로 받아서 프로젝트를 적용할 수 있었다. 그리고는 그 나인패치를 사용하지 않고 pattern으로만 사용하는 개발자가 누구일지 궁금하기만 했었다.


그런데...

내가 직접적으로 하는 프로젝트가 아닌 후임이 주도적으로 하고 내가 뒤에서 봐줘야 하는 프로젝트..

여기에서 다른 디자이너도 오더니 이전 개발자가 pattern으로 주면 사용했었다면서 또 같은말을 했다. 정말 답답한 마음으로 설명해줄 때... 나인패치를 사용하지 않는 개발자가 누군지 알게 되었고 왜 그렇게 하는지 물어보았을때 대답은 간단했다. 그 개발자는 pattern으로 배경 적용하고 모서리 라운딩을 코드로 처리하는게 편하다고... 

사실 개발자가 자기가 편한 방법으로 개발하면 머 틀리진 않는다. 하지만 개인적인 생각은 편하게 그리고 잘 사용하라고 만들어둔 것은 잘 활용하자는게 내 생각이다. 

나인패치로 이미지를 적용하면 정말 버튼과 같은 부분에 size만 정하고 배경에 해당 이미지만 적용하면 끝난다. 코드??? 몇줄 안되고 재활용도 잘 된다. 다른곳에서 size만 다른 버튼에 똑같은 이미지를 가져다 써도 문제가 되지 않으니까...

하지만 pattern으로 배경처리하고 code로 모서리 round처리했을때... pattern적용할 resource를 따로 만들고 round 버튼을 만들 custom layout을 만들어야 한다. 다른 방법이 있다면 shape resource를 만들어 줘야 한다는거.

음.. 과연 어떤 방법이 편할까..

개인적인 개발자 스타일이라고 생각을 해도 이건 정말 이해하기 힘들다. 그래서 두가지 방법으로 했을 때 Activity의 onCreate에서 화면이 다 만들어지는 시간을 보기로 했다... 화면이 다 만들어지는데 얼마나 시간이 걸리는지를 보고 싶어서

나인패치를 적용한 버튼이 6개 있는 화면이 만들어지는데 걸리는 시간.

07-23 15:45:21.968: D/Load Time(18945): Time NinePatch = 9

07-23 15:45:23.088: D/Load Time(18945): Time NinePatch = 9

07-23 15:45:24.013: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:24.948: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:25.928: D/Load Time(18945): Time NinePatch = 8

07-23 15:45:26.883: D/Load Time(18945): Time NinePatch = 8

07-23 15:45:27.758: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:28.588: D/Load Time(18945): Time NinePatch = 6

07-23 15:45:29.458: D/Load Time(18945): Time NinePatch = 5

07-23 15:45:30.708: D/Load Time(18945): Time NinePatch = 9


화면은 똑같고 pattern을 이용하여 custom button을 만들었을 때..
07-23 15:47:20.543: D/Load Time(18945): Time Pattern = 10
07-23 15:47:21.523: D/Load Time(18945): Time Pattern = 13
07-23 15:47:22.378: D/Load Time(18945): Time Pattern = 9
07-23 15:47:23.248: D/Load Time(18945): Time Pattern = 15
07-23 15:47:24.018: D/Load Time(18945): Time Pattern = 13
07-23 15:47:24.803: D/Load Time(18945): Time Pattern = 8
07-23 15:47:25.708: D/Load Time(18945): Time Pattern = 7
07-23 15:47:26.563: D/Load Time(18945): Time Pattern = 8
07-23 15:47:27.548: D/Load Time(18945): Time Pattern = 7
07-23 15:47:28.423: D/Load Time(18945): Time Pattern = 11

이런 결과가 무슨 비교 대상이 될지는 모르겠다. 하지만 약간의 차이라도 속도 차이도 있고, 편의성도 상당한 차이가 있다. 편의성이라고 해봐야 코드의 양이다. 코드가 많다고 좋은 개발자라고 생각하지 않는다. 요즘은 10줄자리 코드가 한두줄로도 끝날 수 있도록 잘 만들어진 api들이 많기도 하니까. 
그냥 개인 특성이라고 생각하고 싶지만, 그래도 이해하기가 정말 힘들다. 물론 나인패치를 몰라서 사용하진 않았을 거라고 생각하진 않는다. 그래.. 그냥 개인 개발 특성이라고 생각하자...

하지만!!!
나인패치!!! 사용하면 정말 편하고 좋다!!! 처음에 점찍는거 어려울지 몰라도 익숙해지면 정말 편하다!!!
그러니 좀 쉽게쉽게 가자~~~

반응형
반응형
MapView 에서 현재 화면의 중앙 latitude와 longitude 값을 얻는 것은 간단 합니다.

getMapCenter() 메소드를 통해서 GeoPoint를 얻기만 하면 되니까요...
그럼 화면의 최상단과 최하단의 latitude, longitude 값은 어떻게 얻을까요?
아래와 같이 하면 됩니다.

Projection proj = mMapView.getProjection();
GeoPoint topLeft = proj.fromPixels(0, 0);

GeoPoint bottomRight = proj.fromPixels(mMapView.getWidth() - 1, mMapView.getHeight() - 1);

double topLat = topLeft.getLatitudeE6() / 1E6;
double topLon = topLeft.getLongitudeE6() / 1E6;
double bottomLat = bottomRight.getLatitudeE6() / 1E6;
double bottomLon = bottomRight.getLongitudeE6() / 1E6;



이렇게 하면 현재 mapview 화면의 상단 하단의 latitude와 longitude 값을 구할 수 있습니다.
 
반응형
반응형

이직하고나서 첫 작품이 나왔습니다.
프로젝트에 뒤늦게 참여해서는 많은 부분을 담당하진 않았지만... 그래도 첫 출근부터 코딩과 야근을 했었던~
제 첫 직장이였던 소리바다에서 소리바다 안드로이드 앱 개발 했었는데... 이젠 mnet에 까지 와서 개발하게 되었네요 ㅎㅎ
mnet에서 나온 소셜 기능까지 들어간 mnet2.0...
릴리즈 하고 나니 멍~ 해지긴 하는데... 앞으로도 할일이 있으니...
우선 오자마자 하나 끝내고 잠시 있는 시간을 통해 블로그에 하나 글 남깁니다 ㅋ








 




반응형
반응형
길고도 길었던 네이트온톡 프로젝트가 끝!!
그리고 대망의 오픈!! ㅎㅎ
요즘 잘나가는 카톡과 마플이 있지만... 그래도 최대 메신저 회원을 갖고 있는 네이트온을 이용해서...
톡을 개발! ㅎ

 

 

이것은 인트로 화면!!

처음 시작할 때 잘 될 수 있을까 우려도 많았지만 오픈을 하고 나니까 너무 뿌듯함...
네이트온 PC버전과 같이 쪽지로 대화를 할 수 있고, 네이트온톡과는 무료통화도 할 수 있음.
나름 고생해서 만들었으니 좋은 결과가 있기를 바랄 뿐입니다.

       

 

대화는 기본!!
파일도 주고 받을 수 있음.. <- 이건 모 다른데도 다 하니까...
거기에 무료통화도 즐길 수 있음...
스마트폰요금제에서 무료 통화 다 썼으면 이제...네이트온톡에서의 무료통화로?? ㅎㅎ
이건 wifi로 잡아서도 할 수 있으니... 더 좋은건가? ^^
참고로 통화 화면에 있는 바람머리를 하고 있는 그림... 제 케릭터입니다 ㅋㅋ

개발중 다른팀과 마찰도 많았고, 커뮤니케이션도 잘 안될때도 많아서.. 지금까지 임했던 프로젝트 중에서
이번이 제일 힘들기도 했습니다. 그래도 개발자라는게 다 그렇듯... 힘들게 개발하고 내놓으면 그래도 뿌듯하지요
그런 다음 결과도 좋으면 기분도 좋겠는데... 네이트온톡을 사용할 사용자들은 어떻게 생각하실 지는 모르는거니까요... 좀 두렵기도 하네요... 왜냐 요즘 톡시리즈 앱들이 너무 잘나와서 ㅜ.ㅜ
거기에 사용자들의 의식도 많이 높아졌으니까요 ^^

이래나 저래나... 개발자들은 힘들게 개발했고... 이렇게 출시는 했습니다...
사용자들이 잘 사용해주고... 안되는거 알려주시면 또 고치고... 기능 추가해서 업데이트 해야겠네요 ^^ ㅋ

반응형

+ Recent posts