1. 2012.12.12 특정 라이브러리가 없으면 설치 안되게 하기
  2. 2012.11.09 [DRM] 마켓별 DRM 적용방법. (1)
  3. 2012.09.18 안드로이드 개발자 간담회 후기 ( 2 ) (5)
  4. 2012.09.18 안드로이드 개발자 간담회 후기 ( 1 )
  5. 2012.07.24 android weightSum사용하기. (4)
  6. 2012.07.20 Android sqlCipher Proguard 오류시...
  7. 2012.07.17 sqlCipher (2)
  8. 2012.07.03 안드로이드 복사한 데이터 베이스 사용하려면,
  9. 2012.05.30 안드로이드 단말별 해상도 정보
  10. 2012.05.25 android NDK 개발하기 설정.
  11. 2011.12.30 안드로이드 문자 보내기 (2)
  12. 2011.12.30 안드로이드 문자보내기 (1) (2)
  13. 2011.12.24 Intent.FLAG_ACTIVITY_CLEAR_TOP
  14. 2011.11.30 카카오톡 처럼 팝업 올라오게 하기.
  15. 2011.11.21 안드로이드 단말기 MacAddress 가져오기.
  16. 2011.11.17 안드로이드 단말기 버전 알아오기
  17. 2011.11.17 Android의 역사.
  18. 2011.11.16 안드로이드란?
  19. 2011.11.04 볼륨키로 미디어 볼륨만 조정가능하게 하기 (2)
  20. 2011.10.27 안드로이드 키보드 보이기, 숨기기 (1)
  21. 2011.10.13 현재실행중인 액티비티 구하기
  22. 2011.09.25 티스토어 부분 유료화 결제 검수 방법 변경
  23. 2011.08.18 sd카드에 database 저장하기.
  24. 2011.08.04 [VideoView] 로컬 비디오파일 설정
  25. 2011.07.12 screen on / off
  26. 2011.06.24 color를 xml로 사용하기. (1)
  27. 2011.06.24 나인패치 (3)
  28. 2011.06.21 스크롤상태를 확인가능한 ScrollView (13)
  29. 2011.06.16 외부 라이브러리 사용하기
  30. 2011.06.07 안드로이드 개발환경 구축하기

특정 라이브러리가 없으면 설치 안되게 하기



 

특정라이브러리가 없으면 설치 안되게....

        <!-- This is how we can request a library but still allow the app
             to be installed if it doesn't exist. -->
        <uses-library android:name="com.example.will.never.exist" android:required="true" />

 

설치 할 수 없다는... 에러메시지...

[2012-12-12 10:39:25 - ApiDemos] Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
[2012-12-12 10:39:25 - ApiDemos] Please check logcat output for more details.
[2012-12-12 10:39:25 - ApiDemos] Launch canceled!


신고

[DRM] 마켓별 DRM 적용방법.





1. DRM 적용 스토어 리스트.

1. 구글 스토어 

2. 티스토어 

3. 삼성앱스

4. 올레마켓


2. 적용방법 


# 각 스토어 별로 DRM 적용 방법은 , 각 스토어 별로 안내 지침 보셔야 합니다.


   제가 하나하나 알려 드리면 좋지만, 

   - 스토어 별로 DRM이 주기적으로 업데이트 되며, ( DRM 라이브러리의 버전이 맞지 않다면, 리젝됩니다. ), 주기적으로 소스도 바뀝니다.

   - 파일 하나로 끝나는 것이 아니라, java 파일, manifest파일, proguard관련 설정 까지 경우에 따라서 맞추어야 합니다.

  그래서, 스토어 안내사항 보시는 것이 최고입니다. 


# 스토어별 링크 


1. 구글 스토어 

- 추가적 DRM 필요 없습니다. 


2. 티스토어 

 - http://dev.tstore.co.kr/devpoc/download/downloadApplicationDRM.omp?ctgrCd=applicationDRM&menuId=1


3. 삼성앱스 

 - http://developer.samsung.com/android ( 요기 들어가서 열심히 검색. )


4. 올레마켓 

- https://seller.ollehmarket.com/page/cs_devpds_front/devpds_view_list.jsp?selectnid=51200011123208&pagesize=5&pagecount=10&pagecurrent=1&pagestart=1


# 해당 마켓에 자세히 설명이 나와있으니, 안내사항대로 순차적으로 적용하시면 어려운 점 없으실 겁니다.



신고

안드로이드 개발자 간담회 후기 ( 2 )




안드로이드 개발자 간담회 각 세션에 대한 상세 설명을 기록해 보자. ^^ 

감상평은 요기. 

2012/09/18 - [Programming/android] - 안드로이드 개발자 간담회 후기 ( 1 )

앞쪽에서는, 열심히 적었는데.. 뒤로 갈수록 졸음이 밀려와서 약간은 기록이 허술하다. ㅜ_ㅜ


사진 출처는 : 권순선 님의 구글 플러스 


모든 세션은 영어로만 진행되고, 통역지원조차 되지 않아 불가피하게 영어로 필기. 

뭐 통역하면서 필기하는 것이 더 어려우니까.. 휴..

흠... 몇가지만 한글로 살짝 통역하고... 나머지는 뭐 패스. ^^;;


아, 발표 내용중에 VSync라는 내용에 대하여, 조금은 길게 설명했는데...

이는 잘 모르겠는 내용. 공부가 필요하다.


1st. Definitive Android Design ( 결정적인 안드로이드 디자인 ? ) 


- Density independent pixels


  Allows developers to build flexible UIs

  > 유연한 UI를 만들어라.


  ldpi / mdpi / hdpi / xhdpi

  > density 에 따라서, 위의 리소스 타입을 모두 구현하라.


- Bitmap assets


  Build assets for each density

  ldpi, mdpi, hdpi, xhdpi


  scale up ( interpolation)

  scale down (aliasing)


  > Bitmap asset을 사용할때도, density 에 따라서, 위의 리소스 타입을 모두 구현하라.

     자체적으로 , scale up <-> scale down을 하긴 하지만, 이것이 이미지의 품질을 보장하지는 않는다.


- Tablet 


  >= Android 3.2, Smallest width 600dp(sw600dp)layout-sw600dp

  < Android 3.2, large or xlarge layouts - layout-large , layout-xlarge


  - 48dp height = ~9mm

  Touchscreen objects should be 7-10mm


  > 터치영역은 최소 48dp height는 되어야 한다. 사용자에게 터치 실수를 하게 하면 안된다.

- Mind the Gap 

Leave space for borders


- Gap 


  > 사용자가 잘못 터치하는 것을 미연에 방지하기 위하여...

  padding 16dip정도… 주어야 한다. 컨텐츠 크기를 넓히기 위해서 Gap을 좁게 하면 안된다.


- Action Bar 

  > 액션바에는 다음 4가지가 있다.


   1. App icon - 이동을 도와주기도 한다.

   2. View control

   3. Action buttons

   4. Action overflow - 휴대 기기의 한정된 공간을 이용하기 위하여….


- Rotation & different screen sizes


  > 상태에 따라 한가지 어플리케이션도 다르게 화면 구성을 해야 한다.


- Notification


- Base Layout (?)


  Not changed in Jelly Bean

  > 잘 모르겠다. 공부 하자.


-Expanded layout (?)

  > 잘 모르겠다. 공부 하자.


-Actions (?)


   Handle most common tasks

   Streamline trianging

   Do not abuse it

  > 잘 모르겠다. 공부 하자.

   

* App Structure


- General structure


   - Top level views - Put content forward


- Up vs back


   Up and back is different


- Navigation controls


- Fragments 


   Reusable UI components

      Can be used as non-UI data objects


   Organise layouts in sections

      Each section is a fragment


   Display multiple fragments on tablets

      One or two on phones


 - Swipeable pages

   

   ViewPager class

      PagerAdapter - swipe able views


- Support Library


   1.6 +


- Pure Android 

  > 안드로이드를 안드로이드 답게 개발하자.


  Don'ts 

     Mimic UI from other platforms

     > 다른 플랫폼을 흉내내어 디자인 하지 말자.

     Carry over platform-specific icons

     Use bottom tab bars 

     > 안드로이드 탭은 위.. 아이폰은 아래…

        안드로이드의 백키 및 메뉴키가 같이 눌릴 수 있으므로... 위에 놓는 것이 좋다.

     Use labeled back buttons

     Use right-point caret buttons ">"표시!

     > 이 또한 아이폰을 흉내내지 말라.


 Do's 

     Use Action bar

     Build intelligent context-aware apps

     Pre-load data at appropriate times

     Focus on the user experience

     Provide offline support

     > 모든 사용자들이 네트워크게 연결되어 있다고 생각하지 말고, 오프라인일때도 사용할 수 있게 하라.


2st. What's new in Android.


* Project Butter


- UI Goals

  - Smooth

  - Responsive


- Jank

  - Missed frames

  - Repeated frames

  - Resulting in jittery animation


- VSync ( Before JellyBean.!? )


  - Displays draw at 60 fps

  - VSync is a control signal

    - For each frame


- Drawing without VSync

- Drawing with VSync


- Double Buffering

- Triple Buffering


* Rich Notifications


* SDK Tools


- New tools

    - Lint

    - Device Monitor

    - System Trace


- Rapid development

    - Improved visual layout editor

    - App template


* Building Android App with Wep API's.


* Google Play


발표자 : Tony Chan , Ankur Kotwal


* 추가 질문 : 구글 플러스와 같은… 홈버튼을 누르면 나오는 슬라이드 드로워 같은… 것은 공개 여부가 있는가?

하고 있다. 공개 예정이다.


3st. In App Billling

  - 인앱 빌링은... 필기까지는 안했다. 

    여튼, 발표자분 귀여우셨다는... 


4st. How to get featured


1. What are we looking for?

  - Always think about the user!


2. Greate looking App Page


- 멋진 아이콘

- 멋진 포트터 사진

- 내용이 좋은… 어플리케이션 설명.

- Video를 넣어도 좋다!


3. Think "Pure Android"


 - Don't use bottom tab navigation bars. 

     ( 터치가 겹칠 수 있다. )

 - Be mindful about back button navigation. 


4. Other things we look for


- Apps over 1MB should allow users to "Move to SD card"

- User ratings ( > 4.0 )

- Not everyone in the world has great mobile networks -> Think about your offline experience.


저작자 표시 비영리 변경 금지
신고

안드로이드 개발자 간담회 후기 ( 1 )





휴가 중 짬을 내어, 안드로이드 개발자 간담회에 다녀왔다.


열정적인 개발자들이 참 많았던 자리, 

이런 모임은 항상 스스로를 독려하게 한다.


발표자들의 모습을 보면... 타고난 재능을 기반으로, 즐겁게 최선을 다하며 개발을 즐기고 있는 그들의 모습이 느껴진다.

나는 정말 그들만큼 하면서, 주어진 현실을 비판하고 있는 것일까? 


아이구야, 이상한 사족이 길다.


강남 파이낸스 센터 . 구글 본사에서 진행된, 안드로이드 간담회.

권순선 부장님의 구글 플러스에서 가져온 사진입니다.

70여명의 사람들이 모여있다. 우르르르~ 열정적인 개발자님들... 항상 존경스럽다. 


흠, 세션은 다음과 같다.


상세 일정


- 6:00 ~ 6:30 저녁식사

- 6:30 ~ 7:00 Android Design Guide

- 7:00 ~ 7:30 What's New in Android

- 7:30 ~ 8:00 In App Billing / Subscription : 요 세션에서.. 발표자분. 너무 귀여우시던... 하하..

- 8:00 ~ 8:30 Fighting Piracy 또는 How to get featured in Play Store

- 8:30 ~ 9:00 QnA (온라인 질문)

- 9:00 ~ 9:30 QnA (현장 질문)


개인적으로, What's New in Android 가 좋았다.

개발을 하다보면, 항상 익숙하던 것만 무던하게 사용하는데... 


새로운 것도 한번 사용하여 개발을 진행해야 겠다! 라는 결심이 서게 해주었으니 ^^


아 맞다. 귀여운 스티커들도 주셨다. 

그래서, 내 맥북이에 살포시 붙여주었지만, 안이쁘다는 오류.. ㅜㅠ


먼저, 간단한 간담회에 대한 감상은 이정도...



세션에 대한 상세 설명은 다음 글에 이어서... ^^



2012/09/18 - [Programming/android] - 안드로이드 개발자 간담회 후기 ( 2 )



신고

'Programming > android' 카테고리의 다른 글

[DRM] 마켓별 DRM 적용방법.  (1) 2012.11.09
안드로이드 개발자 간담회 후기 ( 2 )  (5) 2012.09.18
안드로이드 개발자 간담회 후기 ( 1 )  (0) 2012.09.18
android weightSum사용하기.  (4) 2012.07.24
Android sqlCipher Proguard 오류시...  (0) 2012.07.20
sqlCipher  (2) 2012.07.17

android weightSum사용하기.



parent에 weight_sum을 1로 정하시고, child에 layout_weight 을 .7로 주면.. 70%를 차지하게 됩니다.


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:weightSum="1"

    android:background="#ffffffff">

<LinearLayout  

    android:layout_width="fill_parent" 

    android:layout_height="0dip"

    android:layout_weight="0.7"

    android:background="#ff000000"/>

</LinearLayout>


안드로이드 한지, 2년만에 알게된, 새로운 사실... -_-;;;


출처 : http://www.androidpub.com/1507297

신고

Android sqlCipher Proguard 오류시...



SQLCIPHER

 

In Android development, you probably want to encrypt the database (*.sdf) so that user (especially with rooted device) can't read the database without the application; for example, using SQLite Database Browser (http://sqlitebrowser.sourceforge.net). Fortunately, you can useSQLCipher (http://sqlcipher.net) to complete the task. Here are the implementation steps:

  • Download the latest SQLCipher library from their website. I recommend you download the binaries (*.zip).
  • Extract the file. It should contains libs and assets folder.
  • Copy (and replace) these 2 folders into your project.
  • Add these new libraries into your project classpath. For example if you are using Eclipse IDE (http://www.eclipse.org), you can resolve by click menu Project > Properties. ChoseJava Build Path tab, and then Libraries on the next tab. Click Add JARs, chose all *.zipand *.jar files from SQLCipher libraries. Click OK.
  • Change all packages import statements from android.database.sqlite.* intoinfo.guardianproject.database.sqlcipher.*. But the original android.database.Cursorcan still be used.
  • Add these lines at onCreate method in first activity class. pragmaKey is a key you defined (String).

         SQLiteDatabase.LoadLibs(this);

         SQLiteOpenHelper.getWritableDatabase(pragmaKey); 

  • Run the application.
  • Pull the database (*.sdf). It should be unrecognized as a database when you open it withSQLite Database Browser.

 

PROGUARD

 

With ProGuard (http://proguard.sourceforge.net) you can shrink, optimize, and obfuscate your code so that your exported (*.apk) file become smaller in size and more difficult to reverse by another engineer. Here are the implementation steps:

  • In your project, add this line into default.properties file. It shows that your proguard configuration is based on proguard.cfg file.

         proguard.config=proguard.cfg 

  • You can fix errors while exporting your project or running your application by adding –keepline in proguard.cfg file. For example like:

         -keep public class * extends android.app.Activity

 

 

INTEGRATION

 

When I develop this integration, it seems ProGuard hasn't tested with SQLCipher yet. So I have to exclude SQLCipher libraries in ProGuard configuration.

 

     -keep public class info.guardianproject.database.** {

         *;

     }

 

     -libraryjars libs/commons-codec.jar

     -libraryjars libs/guava-r09.jar

     -libraryjars libs/jsr305-1.3.9.jar

     -libraryjars libs/sqlcipher.jar

     -libraryjars assets/icudt46l.zip

 

If you find errors similar with insertWithOnConflict or Verifier rejected class from SQLCipherpackage, you should upgrade your ProGuard libraries in your android-sdk.


출처 : http://www.facebook.com/notes/hendrick-prasdito/how-to-integrating-sqlcipher-and-proguard-in-android-development/10150980582279008


 추가자료 : 

1. https://groups.google.com/forum/?fromgroups#!searchin/sqlcipher/proguard/sqlcipher/-odd0jrXH-I/jwdQAfwPwegJ

2. http://proguard.sourceforge.net/#manual/usage.html


외국 아이들은 참 친절한듯... 

신고

sqlCipher




요즘, 프로젝트에 sqlCipher를 쓰고 있다...

sqlite 암호화 툴로, 안드로이드, IOS, php등 다양하게 사용 가능합니다.

공식 홈페이지 : http://sqlcipher.net/


# 헌데 생긴 문제점 !!


Performance가 너무 안나왔다.

데이터가 70000건까지는 원활한 속도로 수행하였으나, 


뭐, 120000건이 넘어가자... 쿼리 하나를 하는 속도가 2초까지 나왔다. 흠...

쿼리를 아무리 최적화하고, 인덱스를 잡고 등등 다해도....

나는 200000건이 넘어가는 테이블도 있었는데... ㅠ_ㅠ 

왜그렇게 만들었냐고 묻는다면, 내가 안만들었으니 주는대로 쓸뿐이다...

이 정도까지 모바일에서 사용해보겠다고 만들어본것도 조금은 용감하네... 흠...


그래서, 적용하다가... 일부 중요한 데이터에만 사용하기로 하였다.


여하튼, sqlcipher...

"너무 많은 데이터에 사용하기에는 퍼포먼스가 안나올수 있다."


신고

안드로이드 복사한 데이터 베이스 사용하려면,




파일은 asset에 넣고, 복사하여 사용하면, 되지만, 


"android_metadata"라는 테이블이 없으면, 오류가 생긴다. Locale정보를 저장한다는.

http://developer.android.com/reference/java/util/Locale.html

* 데이터베이스를 열 때, 생성한 데이터베이스가 아닌 외부에서 만들어져서 복사된 데이터 베이스인 경우

android_metadata라는 테이블이 데이터베이스 마다 존재해야 하며, 해당 테이블에는 로케일과 관련된 정보가 저장된다. 다음과 같은 쿼리 둘을 실행시켜 테이블을 생성하고, 필드를 추가해야 한다.

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'ko_KR')

INSERT INTO "android_metadata" VALUES ('ko_KR')


- 위의 방법을 이용해서 테이블에 로케일을 지정해준 경우에는 setLocale() 메소드를 이용해 로케일을 변경해 줄 수 있다. 현재 안드로이드에서 지원하는 로케일의 종류에 대해서는 Locale 클래스를 참조:

http://developer.android.com/reference/java/util/Locale.html


* 그러나, 로케일 지정을 원하지 않는 경우, 데이터베이스를 SQLiteDatabase.openDatabase() 클래스 메소드를 이용하여 열 때 SQLiteDatabase.NO_LOCALIZED_COLLATORS 옵션을 추가해서 열어 주어야 한다.

SQLiteDatabase db = SQLiteDatabase.openDatabase(dbPath, null,

                  SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);


* 위 테이블이 존재하지 않는 경우 에러가 발생한다.


Note.

1. 솔직히 에러가 날 때도 있고 그렇지 않을 때 도 있었다. 불행하게도 이유는 찾지 못했다. 왜지?

2. SQLiteDatabase.NO_LOCALIZED_COLLATORS 를 추가해도 문제가 해결되지 않는 경우도 있다고 한다. 역시 이유는 알 수 없다.


신고

안드로이드 단말별 해상도 정보



(단위 : 픽셀)

범주기기명가로세로가로비세로비
Apple아이패드7681024

1

1.3

아이폰4G640960

1

1.5

아이폰3G320460

1

1.4375

HVGAG1, 옵티머스1, 이자르 등320480

1

1.5

WVGA 800넥서스원, 갤럭시S, 갤럭시S2, 디자이어 등480800

1

1.66

WVGA 854모토로라, 드로이드, XPeria, X10 등480854

1

1.77

7인치 태블릿킨들파이어, 누크태블릿, 갤럭시탭 7인치6001024

1

1.7

10인치 태블릿갤럭시탭 10.1, Asus transformer8001280

1

1.6

10인치 태블릿2모토로라 XOOM7201280

1

1.77

-갤럭시 S2 LTE, 갤럭시 S37201280

1

1.77

갤럭시 노트8001280

1

1.6

갤럭시 넥서스7201280

1

1.77


잘못 기재된 내용이 있다면, 덧글 부탁드립니다.

신고

android NDK 개발하기 설정.



출처 : http://thdev.net/117


Android NDK r7(최신버전)을 설치하고 build하는 방법을 설명하겠습니다.

 r7 이라고해서 기존 버전과 설치 방법이 다르거나 하지는 않았습니다. 다른 블로그를 참고해서 실행방법을 알아보고 제 환경에 맞는 NDK를 사용해보았습니다. 이번 글은 Ubuntu에서 NDK를 설치하고 NDK에서 제공하는 예제 코드를 사용해서 테스트 해보도록 하겠습니다.

android 개발자 페이지
  http://d.android.com

NDK 다운받기
 NDK는 위의 홈페이지로 접속하여, SDK -> android NDK, r7 을 클릭하시고 해당 OS 버전에 맞는 NDK를 다운 받으시면 됩니다.

다운 받은 NDK를 압축 해제하기
 명령어를 통한 압축 해제 방법입니다. tar -xvf android-ndk-r7b-linux-x86.tar.bz 으로 압축 해제를 하거나


다운로드 폴더로 직접이동하여 압축 해제하시면 됩니다.(윈도우와 동일)

NDK 예제 사용하기
 압축 해제가 완료되면 해당 폴더에 android-ndk-r7b 폴더가 생깁니다. 해당 폴더에 접근하면 NDK 관련 파일들이 나열되어 있습니다. docs폴더에는 ndk사용에 관한 설명과 설치관련 설명 문서가 들어있습니다. 이중 홈페이지(안드로이드 개발자 페이지)의 ndk 사용법 설명에  OVERVIEW.HTML 파일을 읽어보라고 되어 있습니다.

 이번 설명에는 NDK에서 제공하는 예제를 사용해보려고 합니다. 예제가 있는 경로는 ./samples/ 폴더안에 있고, 이중 ./hello-jni/ 샘플 프로젝트를 사용해보겠습니다. 먼저 c코드를 확인하고 빌딩하기 위해 jni 폴더로 이동합니다. jni 폴더에는 Android.mk(메이크 파일)과 hello-jni.c(소스코드)가 포함되어 있습니다.

hello-jni.c
 Apache License 2.0에 관한 내용이 설명되어 있고, string.h jni.h 가 포함되어 있습니다.
 아래 코드는 Hello TaeHwan!! My Blog : http://thdev.net 을 jstring(jni에서 사용하는 string) 값으로 return 해주는 코드입니다.
 함수명은 stringFromJNI(JNIEnv* env, jobject thiz) 이 됩니다.

 함수명에 Java_com_example_hellojni_HelloJni 가 추가로 붙어있습니다.
   com_example_hellojni 이 부분은 java 패키지 파일명 이름이 됩니다.
   HelloJni : 이 부분은 java class의 이름이 됩니다.
   만약 함수명이 result이고, 패키지명이 net.thdev.test, Class 명이 hello 라면
   Java_net_thdev_test_hello_result(); 가 되게 됩니다.

String 값은 UTF 형으로 변환하여 return 됩니다.

Android.mk 파일
 ndk-build 하기위해 필요한 파일입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LOCAL_PATH:=$(call my-dir)
   my-dir은 현재 위치(Android.mk의 위치) 현재 소스코드가 존재하는 폴더위치를 반환
 
include $(CLEAR_VARS)
   : 빌드시 GNU Makefile에 필요한 변수들을 초기화
     (e.g. LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, etc...)
 
LOCAL_MODULE
  : 각 모듈을 식별하기 위해 정의되어야 하고, 고유한 이름과 공백을 포함할 수 없습니다.
    "hello-jni" 파일의 공유 라이브러리 모듈은 "libhello-jni.so"가 됩니다.
 
LOCAL_SRC_FILES
   : head를 제외한 C 소스파일이 나열되어야 합니다.
 
include $(BUILD_SHARED_LIBRARY)
  : 공유 라이브러리를 만들지점

이정도로 설명이 되겠네요. 영어가 짧아서 해석하는데 문제가 많습니다. 원본 파일의 위치는 /docs/ANDROID-MK.html 파일을 참고해주세요.

ndk-build
 build 하는 방법입니다. 현재는 PATH로 등록하지 않았기에 아래처럼 사용할 수 있습니다.
 제 android-ndk-r7b의 위치는 Downloads에 있습니다.
  명령어는 : ~/Downloads/android-ndk-r7b/ndk-build 로 실행했습니다. android-ndk-r7b의 위치에 따라 변경하시면 됩니다.

build가 완료되면 아래 처럼 확인이 가능합니다.

Android 실행해보기
 New Android Project를 통해서 실행 가능합니다. 최신 NDK r7버전의 예제코드는 android 4.0.3 에뮬레이터로 동작합니다. 
 Create project from existing source를 통해서 가져오시면 됩니다. 경로는 위에서 작업했던 경로이며 hello-jni 폴더를 선택하셔야 합니다.

아래와 같이 HelloJni.java와 libs/armeabi/폴더 아래 3개 파일을 확인 가능합니다. gdb.setup, gdbserver, libhello-jni.so입니다.

java 코드
 static 으로 hello-jni를 호출 합니다. ndk를 통해서 생성된 lib파일의 이름은 libhello-jni.so 입니다. load할때는 hello-jni만 입력하면 됩니다.

1
2
3
static {
    System.loadLibrary("hello-jni");
}

native 인터페이스
 public native String  stringFromJNI();
   stringFromJNI() 코드는 위 C코드에 작성된 함수를 호출 하기 위한 Native 인터페이스입니다.

코드 사용

1
2
3
TextView  tv = new TextView(this);
tv.setText( stringFromJNI() )
setContentView(tv);
TextView를 생성하고, 거기에 setText해주는 코드입니다. stringFromJNI()를 호출 합니다.

아래와 같은 결과를 얻을 수 있습니다.


마무리
 급하게 한다고..내용이 엉망인것 같습니다. 좀더 공부해서 추가내용 올리도록 하겠습니다. 간단한 프로그램 작성도 하구요!


신고

안드로이드 문자 보내기 (2)




안드로이드 문자 어플리케이션을 통해서 보내는 방법은 다음과 같다.

# MIME type을 이용 ("vnd.android-dir/mms-sms")

# 이렇게 하면, 실행됨.

 private void sendSmsByApplication(){
     Intent i = new Intent(Intent.ACTION_VIEW);
     i.putExtra("address", "01025481781");
     i.putExtra("sms_body", "Hello my friends!");
     i.setType("vnd.android-dir/mms-sms");
     startActivity(i);
 }


하지만, 갤럭시 탭에서는 에러가 발생한다. 

실행할 문자 어플리케이션이 없어서 그렇다. 이런 경우, Exception발생.
다음과 같은 Exception. 이런 경우도 대비해야겠다. 

12-28 12:46:17.520: E/AndroidRuntime(1637): FATAL EXCEPTION: main
12-28 12:46:17.520: E/AndroidRuntime(1637): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW typ=vnd.android-dir/mms-sms (has extras) }
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1510)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1384)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivityForResult(Activity.java:3131)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.Activity.startActivity(Activity.java:3237)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.sendSmsByApplication(MainActivity.java:40)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity.access$0(MainActivity.java:35)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at s.m.s.MainActivity$1.onClick(MainActivity.java:30)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View.performClick(View.java:3122)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.view.View$PerformClick.run(View.java:12020)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.handleCallback(Handler.java:587)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.os.Looper.loop(Looper.java:132)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at android.app.ActivityThread.main(ActivityThread.java:4126)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invokeNative(Native Method)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at java.lang.reflect.Method.invoke(Method.java:491)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
12-28 12:46:17.520: E/AndroidRuntime(1637):  at dalvik.system.NativeStart.main(Native Method) 


신고

안드로이드 문자보내기 (1)




문자를 보내는 방법은, 다음과 같다.

1. AndroidManifest.xml 파일에 퍼미션을 추가한다.

<uses-permission android:name="android.permission.SEND_SMS" />        
<uses-permission android:name="android.permission.RECEIVE_SMS" />        


2. 자바 코드에 코드를 추가한다.
전화기능이 없는 갤탭 10인치에서는 NoService가 옴. 

public class MainActivity extends Activity {
private Button btnSendSMS; 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        findViewById(R.id.btnSendSMS).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendSMS("01012345678", "Send, sms, please.!");
}
});
    }
    
    /**
     * 문자를 보내는 메소드
     * @param phoneNumber
     * @param message
     */
    private void sendSMS(String phoneNumber, String message){
    
     String SENT = "SMS_SENT";
     String DELIVERED = "SMS_DELIVERED";
     
 
       // 문자 보내는 상태를 감지하는 PendingIntent
     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
        // 문자 받은 상태를 감지하는 PendingIntent
     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
       
 
       // 문자 보내는 상태를 감지하는 BroadcastReceiver를 등록한다.
     registerReceiver(new BroadcastReceiver() {

                       // 문자를 수신하면, 발생. 

@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
    
     // 문자를 받는 상태를 확인하는 BroadcastReceiver를 등록.
     registerReceiver(new BroadcastReceiver() {

                        // 문자를 받게 되면, 불린다. 
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered", Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
     
 
       // SmsManager를 가져온다.
     SmsManager sms = SmsManager.getDefault();
        // sms를 보낸다. 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
    
    }
}


※ 문자를 보내는 메소드 설명.
 

sms.sendTextMessage(String destinationAddress, scAddress, Stringn text, PendingIntent sendIntent, deliveryIntent);

destinationAddress, phoneNumber,
scAddress - Service center address, use null for default SMSC
text - SMS message
sendIntent - pending intent to invoke when the message is sent
deliveryIntent - pending intent to invoke when the message has been delivered.

만약, 문자를 수신하는상태 및 보낸 상태를 파악하고 싶지 않으면, sendIntent, deliveryIntent를 null로 주면 된다.

※ 문자를 보내는 기능이 없는 갤럭시 탭 와이파이 버전같은 경우, 

SmsManager.RESULT_ERROR_NO_SERVICE:  콜백이 onReceive에서 온다.

관련글.
2011/12/30 - [Programming/android] - 안드로이드 문자 보내기 (2)

신고

Intent.FLAG_ACTIVITY_CLEAR_TOP




Intent.FLAG_ACTIVITY_CLEAR_TOP flag ensures that the series of activities in the backstack is cleared.
신고

카카오톡 처럼 팝업 올라오게 하기.




        // 이 부분이 바로 화면을 깨우는 부분 되시겠다.

        // 화면이 잠겨있을 때 보여주기

   getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

       // 키잠금 해제하기

       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD

       // 화면 켜기

       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);


필요한 순간 위 코드를 넣어주면, 되겠다. 
잠자고, 있는 화면을 깨워주는것, 
 
신고

안드로이드 단말기 MacAddress 가져오기.



{ 홈화면 } > { 하드웨어키 메뉴 클릭 } > { 설정 } > { 상태 } 에 들어가면, { Wi-Fi MAC주소 }가 존재한다.


단말기 사용자에 대한 내용이다.

코드는 아님, 
신고

안드로이드 단말기 버전 알아오기




현재 단말기의 버전을 알아오고 싶다면, 다음의 코드를 이용하면 된다. 
그리고, 아래와 같이 상황에 맞춰서 대처하여 보자.

OS별 코드 버전 넘버는 전의 포스트 참조. (2011/11/17 - [Programming/android] - Android의 역사.)

 

int version = android.os.Build.VERSION.SDK_INT;
 

switch (version) {

case 2:

Log.d("VERSION", "? 1.1");

break;

case 3:

Log.d("VERSION", "CUPCAKE 1.5");

break;

case 4:

Log.d("VERSION", "DONUT 1.6");

break;

case 5:

Log.d("VERSION", "ECLAIR 2.0");

break;

case 6:

Log.d("VERSION", "ECLAIR 2.0.1");

break;

case 7:

Log.d("VERSION", "ECLAIR 2.1");

break;

case 8:

Log.d("VERSION", "FROYO 2.2");

break;

case 9:

Log.d("VERSION", "GINGERBREAD 2.3");

break;

case 10:

Log.d("VERSION", "GINGERBREAD 2.3.3-2.3.4");

break;

case 11:

Log.d("VERSION", "HONEYCOMB 3.0");

break;

case 12:

Log.d("VERSION", "HONEYCOMB 3.1");

break;

case 13:

Log.d("VERSION", "HONEYCOMB 3.2");

break;

case 14:

Log.d("VERSION", "ICECREAMCAKE 4.0");

break;

}


이상.

신고

Android의 역사.



안드로이드의 역사? 랄 것도 조금은 어색하지만, 그동안 버전 및 특징 그리고, 히스토리 들을 알아보는 시간을 가져볼까요,

Android Version

안드로이드는 스펠링 순으로 먹는 것을 컨셉으로 하여 코드 네임을 짓고 있죠, 나름 맞추는 재미가 쏠쏠하다는…    

안드로이드 버전에 대해서 자세히 알고 싶다면, 개발자 사이트가 제일 좋겠죠,

하기 사이트 참조 바랍니다.

http://developer.android.com/sdk/index.html

  그래도 간단하게 정리.

Android Version

RELEASE DATE 

CODENAME 

API Level

FEATURE 

1.1

February 2009

 

2

 

1.5

April 2009

Cupcake

3

 

1.6

September 2009

Donut

4

 

2.0

October 2009

Eclair

5

 

2.0.1

December 2009

-

6

 

2.1

January 2010

-

7

 

2.2

May 2010

Froyo

8

외장메모리 설치 지원 등..

2.3

December 2010

Gingerbread

9

Sip, Voip 지원, Keyboard copy/paste지원 등.

2.3.3

February 2011

-

10

 

2.3.4

May 2011

-

10

several bug fixes

3.0

February 2011

Honeycomb 

11

Tablet 용, 그래픽 기능 향상

3.1

May 2011

-

12

 

3.2

July 2011

-

13

 

4.0

October 2011

IcecreamSandwich

14

http://developer.android.com/sdk/android-4.0-highlights.html

그렇다면, OS별 사용도는 각각 어떨까요?

2011년 11월 3일 구글이 14일간 집계한 OS분포도는 다음과 같습니다.  

 

일별 통계는 다음과 같습니다. 


출처 : http://developer.android.com/resources/dashboard/platform-versions.html


신고

안드로이드란?



안드로이드 개발을 업으로 삼고 계속 일하고 있는 시점에서, 이제서야 Android가 무엇인가를 생각한다는게 우습다.

하지만, 난 아직 안드로이드를 너무 모르기에, 정리를 차근차근 해 나가고 있다.

오늘도 역시나,

 

  • 안드로이드란?

    사전에서 찾아보면 뜻은 다음과 같습니다.

    android – n. a robot with a human appearance.

    사람 형상을 한 로봇. 뭔가 난해합니다.
     

    그렇다면, 실제 안드로이드는 무엇일까요?

    안드로이드는 구글이 내놓은 리눅스(Ubuntu) 기반의, 모바일을 타겟으로한 운영체제 입니다.(요즘에는, 모바일을 벗어나 다양한 가전기기에도 안드로이드가 탑재되고 있지요,) 2005년 구글은 모바일 사업의 일환으로, Android를 인수했고, 작업을 시작했습니다.

    구글의 서비스가 대부분 그렇듯, 구글은 안드로이드 역시 무료로, 널리 사용되길 원했습니다. 그래서 Apache License로 배포 했구요,

    Apache License라 함은, 누구나 무료로 사용하고, 안드로이드를 customizing하여, 상용의 자신의 제품에 사용해도 상관이 없다는 것입니다.

    Apache License에 대해 좀더 알고 싶다면, 하단의 링크를 들어가 봅시다.

    http://www.apache.org/licenses/LICENSE-2.0.html

     

    이러한 점에서(무엇보다 공짜라는 점에서), 안드로이드는 휴대폰 Vendor들에게 굉장히 매력적인 시장으로 느껴지게 되었죠,

    Apple의 iPhone의 iOS에 대응할 그 무언가가 필요했던, 휴대폰 제조사에게는 더욱더 말입니다.

    휴대폰 Vendor들이라면, 우리나라의 삼성전자, LG전자, 팬텍, 이제는 구글에 인수된 Motorola, 대만의 HTC등이 있겠죠,

     

    안드로이드는 또한, 개발자에게도 매력적으로 다가왔는데요, 개발자는 휴대기기에 Android SDK를 이용하기만 하면, 누구나 간편하게 개발을 하고 판매하는 일이 가능하게 되었으니까요,

    이를 위해, 여타의 중간 도매상이 없어도, 개발한 제품을 소비자에게 다이렉트로 전달해 줄 수 있는 Android Market을 제공해 주었죠,

    물론, Android Market에 앱을 판매하려면, 개발자 등록비용(매년 갱신x, 평생)으로 $25이 들어가긴 합니다만, Apple의 개발자 등록 비용이 더 비싸다는 점과 매년 갱신해야 한다는 점, 또한 Apple PC를 가지고 있어야 개발이 가능하다는 점을 생각하면 굉장히 자유로운 조건이라고 판단됩니다.

    그래서, Android는 개발자들에게도 유행처럼 번져 나갔죠, 지금은 버블이 많이 진 것 같습니다만…

     

    주저리 주저리…

    아 , Gartner에서, 집계한 결과를 보면, 안드로이드 마켓 점유율이 50프로에 가깝다네요,
    http://news.cnet.com/8301-13506_3-20051610-17.html

     

    그리고, 2015년 모바일 운영체제에 대한 전망(물론 되어보기전엔 모르는 거겠죠,)에서도 안드로이드가 꽤나 긍정적으로 나왔네요,
    심비안에 대해서는 꽤나 부정적이네요, Window mobile에 대해서는 꽤나 긍정적이구요,
    하기 사이트에 기사가 있답니다. 

    http://news.cnet.com/8301-13506_3-20048236-17.html?tag=mncol;txt


    기사의 일부에서 발췌한, IDC에서 전망한 2015년 결과는 아래와 같습니다.


    (Credit: IDC)

     

    앗차, 좀더 알고 싶다면, android wiki를 보시는 것도 좋을 듯하네요.

    http://en.wikipedia.org/wiki/Android_(operating_system)

    또한, Android Developer 공식 사이트 정보

    http://developer.android.com/guide/basics/what-is-android.html

    아쉽게도 모두 영어,

     

신고

볼륨키로 미디어 볼륨만 조정가능하게 하기




내 어플리케이션 안에서는, 볼륨키로 전화 음량을 조정하는 것이 아닌, 미디어 볼륨만 조정 가능하도록 하자.

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

     AudioManager audio = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 

      switch (keyCode) {

      case KeyEvent.KEYCODE_VOLUME_UP:

       audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);

       return true;

      case KeyEvent.KEYCODE_VOLUME_DOWN:

       audio.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_SHOW_UI);

       return true;

      } 

     return super.onKeyDown(keyCode, event);

    }

 
신고

안드로이드 키보드 보이기, 숨기기



 

특정 동작을 했을 때, 소프트 키보드를 보여주고 싶을때에 사용한다.
키보드를 제어하려면 InputMethodManager객체를 사용한다.
InputMethodManager는 "android.view.inputmethod"에 존재한다.

이 객체는 activity에서, getSystemService로 구할 수 있으며, 변수는 Context.INPUT_METHOD_SERVICE로 구하여 오면 된다.

키보드를 보여줄때는,
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver) 를 사용하고,

키보드를 가릴때는,
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags) 를 사용하면 된다.

예를 들어보자.

[ ImmActivity.java ]

 

import android.view.inputmethod.InputMethodManager;

import android.widget.EditText;

 

public class ImmActivity extends Activity {

        

private InputMethodManager imm;

private EditText searchTxt;

      

     /** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState, CURRENT_MENU);

setContentView(R.layout.main);

init();

}

 

private void init(){

    imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    searchTxt = (EditText) findViewById(R.id.search_edittext);

}

 

/**

* 키보드를 가림.

*/

private void hideKeyboard(){

    imm.hideSoftInputFromWindow(searchTxt.getWindowToken(), 0);

}

 

/**

* 키보드를 보여줌.

*/

private void showKeyboard(){

    imm.showSoftInput(searchTxt, 0);

}

}

 

굉장히 간단한 예제이므로, 별도의 설명이 필요없는…
그냥 위와 같이, init()에서 선언해주고, 필요에 따라서, showKeyboard(), hideKeyboard()를 호출하여 주면 된다는…
설명할 것도 없는 것을 주저리 주저리 적은듯…

 + 

내가 자주 사용하는 ,hideKeyboard() function

private void hideKeyboard(){

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

}


신고

현재실행중인 액티비티 구하기




현재 액티비티가 실행 중이라면, true를 반환하고,
실행중이 아니라면, false를 반환합니다.

    private boolean isActivityTop(){

    ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

        List<RunningTaskInfo> info;

        info = activityManager.getRunningTasks(1);

        if(info.get(0).topActivity.getClassName().equals(PhoneStateReceiverTestActivity.this.getClass().getName())) {

             return true;

        } else {

             return false;

        }

    }

 
info = activityManager.getRunningTasks(1); 는 태스크 리스트를 1개 가져온다는 뜻이고, 
리스트 형식으로 반환하여 주므로, 상황에 맞게 응용하여 사용하시면 되겠습니다. 
 
신고

티스토어 부분 유료화 결제 검수 방법 변경



 

인앱 관련. 티스토어 결제 검수방법이 변경되었다.
괜히, 승인거부만 당한… "부분 유료화API"에는 그에 대한 내용이 나와있지 않다.
어쩌라는 거지…?

http://dev.tstore.co.kr/devpoc/notice/listNotice.omp 의 179번 글보면 됨. 

검수 방법에 대한 정보는 다음과 같다.

 

3-10. 부분유료화 API가 정상적으로 적용되었는가?

– 최신 버전의 API가 적용되어야 함

– 부분유료화 API 외 자체 결제 기능 제공불가 (단, 실물거래는 허용)

– 등록된 부분유료화 상품 정보와 Application에 구현된 메뉴 정보가 일치하여야 함

– 등록된 과금액과 실제 발생한 과금 로그의 정보가 일치하여야 함

– 부분유료화 결제(부분 유료화 API에서 제공화면) 젂 금액 안내 및 고객확인 절차 팝업이

구현되어야 함

ex) 방패 아이템 구매는 3,000원이 결제됩니다. 결제하시겠습니까? (확인 / 취소)

Cash 10,000점 충전하시겠습니까? 현금 3,000원이 결제됩니다. (확인 / 취소)

– 부분유료화 상품유형(소멸성, 영구성, 기갂성 등) 등록 시 용도에 맞지 않게 구현되어 있어야함.


즉, 결제 팝업을 띄우기 이전에 금액 확인을 거쳐서, "방패 아이템 구매는 3,000원이 결제됩니다. 결제하시겠습니까? (확인 / 취소)"을 띄운후, 확인을 누른 액션에 대해서만, 결제팝업을 보여줘야 한다는 것.

티스토어 인앱을 구현할 때 기억하기! 기억하기!

신고

sd카드에 database 저장하기.




sqlopenhelper를 사용해 데이터베이스를 생성하게될 경우에, 보통 "data/ data / 패키지명 / db / 데이터베이스파일"로 생성이 되게 된다.

이 경로는 내가 원하는 곳으로 바꿀 수는 없을까?

이는 다음과 같이 하면 된다.

생성자에서 filePath만 새로 잡아주면 됩니다.

예 > 

public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + SQLITE_FILE;

public DBOpenHelper(Context context){

super(context, FILE_PATH, null, DB_VERSION);

}


 자동 생성되는, onCreate, onUpdate에 있는 내용은 동일하게 쓰셔도 무방합니다.

저의 풀소스,

public class DBOpenHelper extends SQLiteOpenHelper {

private static final int DB_VERSION = 1;

public DBOpenHelper(Context context){

super(context, Constants.FILE_PATH, null, DB_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(getCreateCategoryTableString());

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS " + DBConstants.TABLE_NAME);

onCreate(db);

}

private String getCreateCategoryTableString(){

   return "CREATE TABLE "+ DBConstants.TABLE_NAME +" ( "

   + _ID   + " INTEGER PRIMARY KEY AUTOINCREMENT, "  

   + DBConstants.ID + " INTEGER NOT NULL, "

   + DBConstants.TITLE_KOR       + " TEXT NOT NULL, "

   + DBConstants.ENG    + " TEXT NOT NULL, "

   + DBConstants.CODE_NUM    + " TEXT NOT NULL, "

   + DBConstants.SDATE    + " TEXT NOT NULL ) ; ";

}

}

 

참조 : 2011/02/08 - [Programming/android] - android에서 외부(sdcard) db를 열려면?

신고

[VideoView] 로컬 비디오파일 설정



videoView.setVideoURI(Uri.parse("android.resource://패키지명/" + R.raw.리소스아이디));



신고

'Programming > android' 카테고리의 다른 글

티스토어 부분 유료화 결제 검수 방법 변경  (0) 2011.09.25
sd카드에 database 저장하기.  (0) 2011.08.18
[VideoView] 로컬 비디오파일 설정  (0) 2011.08.04
screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24

screen on / off



안드로이드 화면 꺼짐 방지 (Screen on)

1. layout에서, android:keepScreenOn="true"의 속성을 준다.
 
사용예 :

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:keepScreenOn="true">

 

2. 자바 코드에서, 다음과 같은 코드를 추가한다. 


사용예 : 

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);


3. View에서 아무곳에서나 다음 메소드를 호출한다.

setKeepScreenOn(true);

 

안드로이드 화면 꺼짐 요청 (Screen off)
  

1. 코드에서 다음을 요청합니다.
 

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotDimScreen"); 



2. 매니페스트에서, 다음의 권한을 줍니다.
 

<uses-permission android:name="android.permission.WAKE_LOCK" /> 

 
저작자 표시
신고

'Programming > android' 카테고리의 다른 글

sd카드에 database 저장하기.  (0) 2011.08.18
[VideoView] 로컬 비디오파일 설정  (0) 2011.08.04
screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24
스크롤상태를 확인가능한 ScrollView  (13) 2011.06.21

color를 xml로 사용하기.



1. 먼저 res > values 폴더안에 colors.xml파일을 생성해줍니다.

2. colors.xml에 색을 넣어줍니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <!-- 흰색 -->
 
     <color name="white">#ffffff</color>
....
</resources>


3. 사용합니다.

사용법 :

xml 파일에서는, "@color/white"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
android:background="@color/red"    
    android:layout_width="match_parent"
    android:layout_height="match_parent">


java 파일에서는, 

view.setBackgroundColor(getResources().getColor(R.color.red)); 

 
자바에서,
그냥 view.setBackgroundColor(R.color.red); 요런식으로 사용하시게 되면, 참조를 못읽게 되어서, 원하시는 색상 출력하실 수 없습니다.
위의 방법을 사용하셔야 합니다. 

추가 자세한 사항은 역시나, api를 참조합시다.
http://developer.android.com/guide/topics/resources/more-resources.html#Color
 
 

저작자 표시 비영리 변경 금지
신고

'Programming > android' 카테고리의 다른 글

[VideoView] 로컬 비디오파일 설정  (0) 2011.08.04
screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24
스크롤상태를 확인가능한 ScrollView  (13) 2011.06.21
외부 라이브러리 사용하기  (0) 2011.06.16

나인패치



안드로이드 나인패치란?
 
일반 png의 이미지에, 늘어날 수 있는 영역을 지정해주는 것입니다. PNG 이미지로 되어있는데
Stretchable(늘어나는) 영역을 정의할 수 있습니다. 이 나인패치 이미지는 보통 뷰(View)의 배경이미지로 사
용됩니다.
이에 대한 개념 정리는, 여타 사이트에 워낙 잘 설명이 되어있고, 제가 더 잘설명할 자신이 없어, 생략합니다.
아래 사이트 참조하세요.
 

쉽게 말해, 나인패치를 만드는 법은 이미지에, 늘어날수 있는 영역을 그려주시면 됩니다.
그림만으로는 이해가 잘 안가실테니, 예제를 보여드리겠습니다.


 
첫번째 예제.
 
다음과 같은 이미지가 있습니다. 이 이미지를 버튼에 배경으로 적용할 것입니다.
Left, top 부분이 늘어나는 영역, right, bottom영역이 내용이 들어가는 영역입니다.
204 x 70pixel



나인패치를 이용하여 적용하면 다음과 같습니다.
동그란 부분은 손상되지 않고, 깨지지 않으면서 이미지가 그려진걸 볼 수있습니다.


 
두번째 예제.
 
어떻게 늘어나는지 보여드리기 위해, 이미지에 약간 그림을 그렸습니다.
방금 전의 뷰를 이번의 이미지로 바꾸어서 보여주게 되면 다음과 같습니다.
204 x 70pixel

 



 
세번째 예제.
 
첫번째, 두번째에서는 내용영역을 넓게 잡아서, 내용이 적어도 최소사이즈가 큰 것을 확인할 수 있었는데,
이번에는 내용의 크기에 따라서, 버튼의 크기가 좀더 유동적입니다.
적용이미지는 다음과 같습니다.
45 x 35pixel



이전의 이미지보다 좀더 유동적으로 그려진것을 볼 수 있겠습니다.
내용이 들어가는 영역을 좀 좁혀놨기때문에 글자가 작을경우에도, 일정 크기를 유지하지 않네요.


  
나인패치 적용법
 
위의 사이트에보면 안드로이드 sdk받아서 하라고 하시는 분들도 있는데, 그렇게 하셔도 되고 사용하시는 일
반 그래픽 에디터 사용하셔도 됩니다. 디자이너분들은 그래픽에디터가 익숙하시겠죠.
 
1. 일반적으로 작업된 이미지에 left, top, right, bottom 1pixel씩 margin을 넣어주시고 left, top, right,
bottom에 검은색 1px선으로 늘어날 영역을 그려주시면 됩니다.
 
2. 그리고 파일명을 다음과 같은 형식으로 저장해주시면 됩니다. [filename].9.png
 
이와 같은 작업을 해야하는 이유는, 안드로이드 단말기의 종류가 여러가지이고, 단말기마다 해상도가 다르
기 때문에, 레이아웃을 비율로 상대적으로 잡게 됩니다. 이럴경우, 백그라운드로 준 이미지를 임의로 늘리게
되면, 이미지가 깨지는 현상이 생기게 됩니다. 그렇기 때문에 나인패치라는 방법을 사용하여 이미지의 왜곡
을 최소한으로 막아 이미지를 적용하자는 것입니다.

위에 사용한 예제 파일은 다음과 같습니다.

저작자 표시 비영리 변경 금지
신고

'Programming > android' 카테고리의 다른 글

screen on / off  (0) 2011.07.12
color를 xml로 사용하기.  (1) 2011.06.24
나인패치  (3) 2011.06.24
스크롤상태를 확인가능한 ScrollView  (13) 2011.06.21
외부 라이브러리 사용하기  (0) 2011.06.16
안드로이드 개발환경 구축하기  (0) 2011.06.07

스크롤상태를 확인가능한 ScrollView



스크롤뷰에서, 스크롤된 상태를 알수 없을 경우가 있기 때문에, 만든 커스텀 위젯입니다.
현재, HorizontalScrollView를 기준으로 만들었는데, 그냥 ScrollView도 다음과 같이 하시면 바로 적용가능하시겠네요.
스크롤뷰의 위치가 어디에 위치했는가를 알려줍니다.

상태는 세가지가 있습니다.
public static enum DIRECTION { LEFT, RIGHT, NONE }
스크롤이 움직이게 되면, 커스텀 위젯의, 
OnEdgeTouchListener 가 호출되고, 여기서 스크롤 위치를 계산하여
콜백을 날려주게 됩니다. 
이때, 위의 DIRECTION상태에 따라서, 원하시는 액션을 취해주시면 됩니다.

만든 방법은, 스크롤 될때마다 computeScroll을 호출하기 때문에, 이때마다 위치를 계산하여, 인터페이스를 등록한후 콜백을 날려주는 겁니다.

사용방법은 커스텀뷰 생성후에, 생성된 커스텀 뷰에
setOnEdgeTouchListener를 등록하여 사용하면 됩니다.
 

CustomHorizontalView.java

import android.content.Context;

import android.graphics.Path.Direction;

import android.util.AttributeSet;

import android.widget.HorizontalScrollView;


/**

 * 스크롤뷰가 가장자리에 다다랐는지 확인하기 위해 사용하는 커스텀 ScrollView

 * @author 이현정(g.littlepanda@gmail.com)

 */

public class CustomHorizontalScrollView extends HorizontalScrollView {

protected OnEdgeTouchListener onEdgeTouchListener;


public static enum DIRECTION { LEFT, RIGHT, NONE };

public CustomHorizontalScrollView(Context context) {

super(context);

}


public CustomHorizontalScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}


public CustomHorizontalScrollView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

 

public void setOnEdgeTouchListener(OnEdgeTouchListener l){

this.onEdgeTouchListener = l;

}


@Override

public void computeScroll() {

super.computeScroll();

if(onEdgeTouchListener != null){

if(getScrollX()==0){

onEdgeTouchListener.onEdgeTouch(DIRECTION.LEFT);

} else if((getScrollX() + getWidth())==computeHorizontalScrollRange()){

onEdgeTouchListener.onEdgeTouch(DIRECTION.RIGHT);

} else {

onEdgeTouchListener.onEdgeTouch(DIRECTION.NONE);

}

}

}

public interface OnEdgeTouchListener {

void onEdgeTouch(DIRECTION direction);

}

}

 

요런식으로 사용.
사용방법.java

listScrollView.setOnEdgeTouchListener(new CustomHorizontalScrollView.OnEdgeTouchListener() {

@Override

public void onEdgeTouch(DIRECTION direction) {

if(direction==DIRECTION.LEFT){

if(leftDirectionImg.getVisibility()==View.VISIBLE){

leftDirectionImg.setVisibility(View.INVISIBLE);

}

} else if(direction==DIRECTION.RIGHT){

if(rightDirectionImg.getVisibility()==View.VISIBLE){

rightDirectionImg.setVisibility(View.INVISIBLE);

}

} else if(direction==DIRECTION.NONE){

if(leftDirectionImg.getVisibility() != View.INVISIBLE){

leftDirectionImg.setVisibility(View.VISIBLE);

}

if(rightDirectionImg.getVisibility() != View.INVISIBLE){

rightDirectionImg.setVisibility(View.VISIBLE);

}

} else {

throw new IllegalArgumentException("Invalid direction. please check direction.!");

}

}

});


나름 열심히 만들었으니 불펌하지 말아주세요. 도움이 되셨다면 댓글 하나라도 남겨주시구요~
 
 
2012-05-07  덧붙입니다.. 

별거 아닌데, 다들 유용하게 사용하셨다니, 기분이 좋네요. 코멘트 남겨주신 분들 감사합니다.
다들 즐겁게 개발하시기를 빕니다.


저작자 표시 비영리 변경 금지
신고

외부 라이브러리 사용하기




1. 사용할 라이브러리를 준비해줍니다. (*.jar, *.so파일은 다르게 함, 나중에 정리하도록 합시다.)

2. 프로젝트를 만들어줍니다. 

3. 프로젝트에 마우스를 갖다대고 오른쪽을 클릭하여 New > Folder를 선택하여, libs라고 폴더를 추가하여 줍니다. 

 


4. libs폴더에 아까 1번에서 준비한 라이브러리를 복사해줍니다. 
복사된 모습 보이시죵,



5. 프로젝트를 클릭하여 오른쪽 마우스 클릭하여 BuildPath > ConfigureBuildPath 를 눌러줍니다.
   여기서, Add JARs 클릭. 해당 프로젝트의 libs로 찾아들어가 아까 복사해 둔 라이브러리를 추가해 줍니다. 
   그리고, OK 클릭.
 


6. 라이브러리 추가 완료입니다.
    이제, 추가된 라이브러리가 사용가능한지, 확인해 보시면 될겁니다.
      
저작자 표시 비영리 동일 조건 변경 허락
신고

안드로이드 개발환경 구축하기




안드로이드 개발환경을 구축하는 방법입니다.
(윈도우 기준, 이클립스 갈릴레오 기준.)

developer사이트의 개발환경 구축하는 방법을 참고합니다. 
http://developer.android.com/sdk/installing.html 


1. Preparing Your Development Computer
   안드로이드 개발환경 구축을 위해서는 먼저 java가 설치되어야 합니다.
   시스템에 맞추어 java를 다운 받으시고, path까지 잡아주세요.
   다운로드 링크는 다음과 같습니다. 
    http://www.oracle.com/technetwork/java/javase/downloads/index.html 
    자바를 다운 받고, 패스를 설정하는 방법은, 다른 사이트에 워낙 잘나와 있어서 생략합니다.
    참조 하세요.
     http://plusblog.tistory.com/298 


2. Downloading the Sdk Stater Package
    안드로이드 SDK툴을 다운 받으셔야 합니다.
    다운로드 링크는 다음과 같습니다. 
    http://developer.android.com/sdk/index.html 
   여기서 또한 시스템에 맞는 것으로 다운 받으시고, 만약 .zip, .tgz를 다운 받으셨다면, 원하시는 폴더에 압축을 푸세요. 
    윈도우즈 사용하시면, 
android-sdk_r11-windows.zip받으시면 되겠죠, os에 맞게 받으세요, 

3. installing the adt plugin for eclipse
     이클립스에 안드로이드 개발을 위한 ADT(Android Development Tools)을 설치합니다.
     이클립스 갈릴레오 버전으로 Help > Install New SoftWare....가 있습니다.
     이곳에서, add를 눌러 줍니다. 

이름 : 아무거나.(혹은 그냥 android-sdk. 요정도..)
url : https://dl-ssl.google.com/android/eclipse/ 

 
    그리고, OK를 눌러 업데이트를 해줍니다. 시간은 약 15분정도 걸리네요. 
    중간에 뭐, 인증되지 않았는데, 설치 할것이냐고 물어보는데요, 그냥 Yes해주시면 됩니다.

4. 3번 과정을 완료하면, 다음과 같이 이클립스에 로봇의 모양이 뜨게 됩니다.


 이걸 누르게 되면, Available packages라고 뜨는데요, 여기서 update all해주시면 됩니다. 
  시간이 꽤나 걸립니다. 1시간 넘어갑니다.


  이렇게 설치해주시면 되구요,
  설치 완료 되시면, 프로젝트 새로 만들때,
  
  Android Project가 뜨구요, 만드시면 기본으로 생성되는 것이 Hello World가 뿌려지는 어플리케이션입니다. 

  모두들, 이제 Hello-World 출력해보세요. 

  이상입니다. 
 

신고