사용할 수 있는 자료형은 5가지 

NULL: 널값

INTEGER: 1,2,3,4,6,8bytes의 정수값
(자동증가 시킬 경우 INTEGER PRIMARY KEY AUTOINCREMENT 로 표기)

REAL: 8bytes의 부동소수점값

TEXT: UTF-8, UTF-16BE, UTF-16LE인코딩의 문자열

BLOB: 입력된 그대로 저장, 바이너리 파일 등


다른 형태는 어떻게 만들면 될까? 

Boolean타입: INTEGER로 만들어서 0과 1로 구별.

Date, Time타입
      TEXT: YYYY-MM-DD HH:MM:SS.SSS 형태로 저장
      REAL: 율리우스력을 기준으로 하는 정보를 저장
      INTEGER: UTC타입으로 저장

SQLite에 숫자, 문자, 바이너리를 넣을 수 있으니 자유롭게 넣고 개발자가 알아서 정해서 사용하면 된다.

SQLite는 대용량의 데이터를 처리하기에는 적합하지 않기에 대형프로그램보다는 지금 가장 많이 사용되고 있는 안드로이드 어플 개발 등 작은 프로그램 개발에 사용된다. 즉 다수의 개발자가 아닌 소수 혹은 혼자서 개발하는 경우가 많을 것이기에 좀 더 가볍고 자유롭게 사용할 수 있게 하는 편이 더 낫다.

반응형
SQLite에서 날짜를 표시하기 위한 함수는 아래의 5가지가 있다.

date(timestring, modifier, modifier, ...) : 날짜
time(timestring, modifier, modifier, ...) : 시간
datetime(timestring, modifier, modifier, ...) : 날짜+시간
julianday(timestring, modifier, modifier, ...) : 율리우스력 날짜
strftime(format, timestring, modifier, modifier, ...) : 포맷 지정

흔히 현재 날짜를 얻을 때 date, time, datetime을 자주 사용하게 된다.
이 함수에 'now' 문자열을 넣으면 현재 날짜와 시간을 얻을 수 있고, 이는 xCurrentTime 메소드가 제공해 주는 것이라고 SQLite 공식 페이지가 말하고 있다.(-_-;;)

즉, SELECT date('now'); 를 하면 현재 날짜가 '2011-12-25' 일 형식 으로 나오고,
SELECT datetime('now'); 를 하면 현재 날짜+시간(시:분:초)이 '2011-12-25 23:30:11' 형식으로 나온다.
단, 국제표준시간(UTC) 기준의 값을 출력한다.

우리나라의 표준 시간은 국제표준시+9 이기 때문에 시간이 틀리게 출력 된다.

해결 방법은 대략 두가지.

1. localtime 값을 이용한 현재시간 구하기 

SELECT datetime('now','localtime');


위와 같이 하면 국제표준시+9 가 된 우리나라 시간이 된다.

2. 시간 값 더하기 

SELECT datetime('now','+9 hours');


국제 표준시에 +9를 해 주면 우리나라 시간이 된다.


편한게 좋기 때문에 1번 추천.

더 자세한 정보는 SQLite 공식 페이지의 Date And Time Functions 페이지를 참조 하자.

보고픈님이 정리하신 SQLitet 날짜 관련 샘플

--UTC 기준의 현재 날짜/시간
select datetime('now');
2010-08-25 04:01:46

-- 로컬 기준의 현재 날짜/시간
select datetime('now','localtime');
2010-08-25 13:02:30

--현재 로컬 기준 시간에서 10분 3.5초를 더한 시간.
select datetime('now','localtime','+3.5 seconds','+10 minutes');
2010-08-25 13:14:15

--현재 로컬 시간에 3.5초를 더하고 날짜는 돌아오는 화요일 (weekday == 0 이 일요일입니다.)
select datetime('now','localtime','+3.5 seconds','weekday 2');
2010-08-31 13:05:39

--현재 달의 마지막 날짜
SELECT date('now','start of month','+1 month','-1 day','localtime');
2010-08-31

--2004-01-01 02:34:56초부터 현재까지의 총 초
SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
209785028

--현재날짜/시간 기준에서 올해 9번째달의 첫번째 화요일
SELECT date('now','start of year','+9 months','weekday 2');
2010-10-05

-- 날짜 포맷 스타일 변경
select strftime("%Y/%m/%d %H:%M:%S",'now','localtime');
2010/08/27 09:17:22


반응형

Fragment에서 GoogleMap v2를 사용하는 경우...

1. SupportMapFragment를 사용하는 MapFragment를 호출
2. popBackStack()을 하고
3. 다시 MapFragment를 호출 했는데
4. android.view.InflateException과 java.lang.IllegalArgumentException을 만나게 됐다면...

MapFragment에 onDestroyView()를 Override시킨 후 아래 코드를 추가해서 해결 할 수 있다.


SupportMapFragment를 사용하는 Fragment의 onDestroyView()

@Override
public void onDestroyView() {
	super.onDestroyView();
	Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
	FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
	ft.remove(fragment);
	ft.commit();
}
반응형

'Developer > Android' 카테고리의 다른 글

안드로이드에서 폰트 적용하기  (0) 2015.01.06
외부 앱 실행시키기  (0) 2014.06.11
안드로이드 리소스 폴더 확장 적용 순서  (0) 2014.05.30


프롤로그 

안드로이드는 특유의 파편화 문제로 여러 폰을 지원하다 보면 여러 종류의 레이아웃이나 리소스를 만들어야 하는 경우가 있다.

그런데 여기서 또 문제가, 안드로이드는 OS버젼별로 해당 폴더의 인식 순서가 다르다는데 있다.


덕분에 이걸 모르면 개 삽질을 미친듯이 해야 하고 (경험담ㅋㅋㅋ)

결국 해상도별 픽셀 폴더를 만드는 짓(!)을 해서 훗날 유지보수를 어렵게 만들게 된다.

그리고는 "어쩔 수 없다" 라는 말을 할 수 밖에 없는 상황을 발생시킨다. (이게 무슨 멍멍이 같은 상황인가ㅋㅋㅋ)


안드로이드 OS별 폴더 인식 순서는 간단히 아래와 같다.



OS 4.x 의 Layout 인식 순서

자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 존재하는 dpi 폴더 중 높은 dpi > 낮은 dpi > 자신의 해상도 > 낮은 해상도 > layout


OS 3.x 의 Layout 인식 순서 

자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 자신의 해상도 > 낮은 해상도 > layout > 높은 dpi


OS 2.x 의 Layout 인식 순서 

자신의 dpi > 높은 dpi > 낮은 dpi > 자신의 해상도 > layout



그래서, 몇가지 폰의 Layout 인식 순서를 예로 들면 다음과 같다.



갤럭시S3 (OS : 4.x, 해상도 : 720 X 1280)

layout-sw360dp
layout-sw320dp
layout-w360dp
layout-w320dp
layout-xhdpi
layout-hdpi
layout-mdpi
layout-1280x720
layout-960x540
layout-800x480
layout-480x320
layout


옵티머스 2X (OS : 4.x, 해상도 : 480 X 800)

layout-sw320dp
layout-w320dp
layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout-480x320
layout


갤럭시탭 (OS : 3.2, 해상도 : 1280 X 800)

layout-sw400dp
layout-sw384dp
layout-sw360dp
layout-sw320dp
layout-w400dp
layout-w384dp
layout-w360dp
layout-w320dp
layout-mdpi
layout-1024x768
layout-960x540
layout-800x480
layout-480x320
layout
layout-hdpi
layout-xhdpi


옵티머스 빅 (OS : 2.3, 해상도 : 480 X 800)

layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout


옵티머스 원 (OS : 2.2, 해상도 : 320 X 480)

layout-mdpi
layout-480x320
layout-hdpi
layout-xhdpi
layout


반응형

getActionBar()는 API Level11. 즉, Android 3.0 Honeycomb 이상에서 부터 사용이 가능 하다.

그 이하에서는 getActionBar()가 null을 리턴한다.

또, 테마설정에서 NoActionbar를 설정하는 경우(예: Theme.Holo.NoActionBar)에도 null이 리턴된다.


테마설정이 아무것도 안되어 있는데 null이 리턴 되는 경우에는 application 테마설정을 Holo계열로 해주면 된다.

현재(2012년 12월 4일), Holo계열 테마는 Theme.Holo과 Theme.Holo.Light 두가지가 있다.


getActionBar()는 Holo테마를 위해 존재하는 듯...


반응형

일반적으로 어플리케이션에서 사용되는 문자열을 정의 해 놓는 string.xml 파일에 임의의 인자값을 정의하여 추후 클래스파일에서 값을 설정할 수 있습니다.

Formatting Strings라고 하며, android에서 정해진 특별한 규칙을 통해 인자값을 줄 수 있습니다.


인자값이 정의된 string resource의 형태는 아래와 같습니다.

 

string.xml

string resource에 줄수 있는 자료형은 숫자형의 d와 문자형의 s가 있습니다.
d는 Double형이고, s는 String형 입니다.


인자값 지정은 %순서$자료형 으로 합니다.
인자를 23개까지 줘 봤는데 이상없이 잘 출력되는 것으로 보아, 인자의 갯수제한은 없는 것 같습니다.
인자에 대한 값 지정은 클래스에서 getString() 메서드를 통해 할 수 있습니다.

 

MainActivity.java

 

MainActivity.java에서 사용하는 Layout은 아래와 같습니다.

 

activity_main.xml

 

위 샘플소스를 첨부하였으니 필요하신 분은 참고하시기 바랍니다.


FormattingStrings.zip



아래는 활용 예 입니다.

string 파일의 인자 순서에따라 결과가 출력 됩니다.

 


 

String형은 문자 뿐만 아니라 숫자도 에러 없이 동일한 결과를 표현 합니다.

 


 

하지만, Double형은 숫자 이외의 값이 오면 에러가 발생합니다.

 


 

string 파일에 정의된 인자의 갯수가 getString()에서 설정하는 인자보다 많으면 에러가 발생합니다.

 


 

getString()에서 설정하는 인자의 갯수가 string 파일에 정의된 인자보다 많으면 정의된 갯수 이외의 인자는 무시됩니다.

 



 

반응형

android 개발을 할 때 여러 디바이스에 대한 테스트를 할 때 가장 좋은 방법은, 필요한 디바이스를 모두 확보 하고 있는 것 이지만..
그 많은 기계를 다 보유 하고 있다는 것은 상당한 부담이다..

그래서, 울며 겨자 먹기로 느려터진 애뮬레이터 AVD(Android Virtual Device Manager)라도 사용을 해야 하는데, 그에 대한 방법을 정리 한다.


AVD 생성 

이클립스에서는, Window > AVD Manager 실행.
직접 실행 할거면, 자신이 설치 해 둔 android sdk 폴더에 있는 AVD Manager.exe를 실행.

New를 눌러 새로운 AVD(애뮬레이터)를 생성한다.




Name에 자신이 원하는 이름을 설정하고, Target에 원하는 API Level을 설정한다.

SD Card의 Size에서 SD 메모리 용량을 적당히 설정하고..

Skin의 Resolution에서 원하는 해상도를 설정한다.
Built-in으로 설정을 하면 애뮬레이터 실행 시 우측에 하드웨어 버튼이 나타나지만, 해상도 조절을 마음대로 할 수 없다.
Resolution으로 설정을 하면 하드웨어 버튼이 나타나지 않기 때문에 키보드 단축키를 알아야 한다.

단축키는 아래 링크를 참조..
http://youngik.tistory.com/39

Hardware에서 Abstracted LCD density를 원하는 dpi로 설정한다.
( ldpi는 120, mdpi는 160, hdpi는 240, xhdpi는 320 )

Max VM application heap size는 애뮬레이터의 최대 heap size 설정이니 적당히 설정..

Device ram size도 적당히..

설정을 마치면 이렇게..



Create AVD를 누르면 새로운  AVD가 생성된다.



AVD 실행 

AVD를 실행하기 위해서는  AVD Manager를 이용하는 것이 일반적이다.

이클립스에서는, Window > AVD Manager 실행 > AVD 선택 > Start 클릭.
(이클립스를 통하지 않고 직접 실행 하는 경우, 자신이 설치 해 둔 android sdk 폴더에 있는 AVD Manager.exe를 실행)

AVD 실행이 안되는 경우도 있다.
대부분 android SDK가 위치한 경로에 공백이 있거나 한글이 포함되어 있는 경우인데, SDK 경로를 변경 하거나 Command 명령어로 직접 실행하면 해결 된다. 

AVD 실행 명령어
emulator -avd [AVD명] -scale [크기값(ex:0.8)]



AVD는 이클립스에서 App 실행시 생성 시켜도 되고, 미리 AVD를 생성 시켜놓고 App 실행을 해도 된다.
하지만, AVD가 로딩되는 속도가 매우(!!) 느리니 가급적 AVD를 먼지 띄워놓고 작업 하는 것이 좋다.

이클립스를 통해서 AVD에 App을 빌드 하다가 여러가지로 실패 하는 경우에는 command창에서 adb 명령어로 직접 apk를 설치 해주는 것이 가장 확실한 방법 이다.
adb는 android sdk 폴더의 tools 폴더에서 실행 가능하다.

command 창을 열고..

AVD가 떠 있는지 확인하기 위해 아래 명령어를 실행.
adb devices

AVD 이름이 확인 되면, apk를 설치한다.
adb install [패키지 경로][패키지 명].apk

AVD 사용 중 INSTALL_FAILED_INSUFFICIENT_STORAGE 에러를 만나게 되면, AVD 내부의 App 설치공간이 부족하다는 에러이니 용량을 확보 해 주자.

설치하려는 App이 20MB를 넘었거나, AVD에 App을 너무 많이 설치 했을 때 발생한다.

App을 많이 설치 했으면 지워서 용량 확보를 하면 되고, App 용량이 큰 경우라면 AVD의 SD 메모리 영역에 설치하면 된다.

SD 메모리 영역에 설치하는 명령
adb install -s [패키지 경로][패키지 명].apk

재설치 명령은 -r을 추가하면 됨
adb install -r -s [패키지 경로][패키지 명].apk



이렇게 하면 자신이 테스트 하고 싶은 디바이스의 해상도 대로 AVD를 마음껏 만들어 테스트 할 수 있다.
(하지만, 속도는 엄청 느리다는거..)

adb의 여러가지 명령어 들은 아래 링크를 참조.
http://forum.falinux.com/zbxe/?document_srl=533523


AVD 크기조절

AVD 해상도를 크게 하면 모니터 영역을 벗어나서 실행되기도 한다.
이때는 애뮬레이터를 실행 하기 전 나타나는 창에서 Scale display to real size에 체크 후, 자신의 모니터에 맞춰 조절하면 된다.




반응형

안드로이드 프로그래밍을 하다가 아래와 같은 에러를 만났다.

Description Resource Path Location Type Error generating final archive:
Debug Certificate expired on 11. 10. 11 오후 3:45 <프로젝트명> Unknown Android Packaging Problem

Debug 인증서 만료에 의한 Error로써, dubug.keystore 파일을 삭제하고 Debug 인증서를 갱신 해 주면 된다.

debug.keystore 파일의 위치는 'Window > Preferences > Android > Build'에서 'Default debug keystore' 항목을 참조하면 된다.
사용자 환경에 따라 다르겠지만, 일반적으로 C:\Documents and Settings\User Name\.android 에 위치해 있다.

Debug 인증서 갱신은 debug.keystore 파일을 삭제하고 프로젝트를 Build 해 줌으로 써 갱신 된다.


이 에러에 대해서 구글신(?)께 여쭤 봤지만 관련 정보가 의외로 안나와서 한참 찾았다.....
2시간 동안 나는 짜증 대마왕이 되버린....
같은 문제로 고생하는 이들이 조금이라도 빨리 해결할 수 있기를 바란다.



반응형


1. *#*#4636#*#*
This code can be used to get some interesting information about your phone and battery. It shows following 4 menus on screen:

* Phone information
* Battery information
* Battery history
* Usage statistics


2. *#*#7780#*#*
This code can be used for a factory data reset. It’ll remove following things:

* Google account settings stored in your phone
* System and application data and settings
* Downloaded applications

It’ll NOT remove:

* Current system software and bundled applications
* SD card files e.g. photos, music files, etc.

Note :-Once you give this code, you get a prompt screen asking you to click on “Reset phone” button. So you get a chance to cancel your operation.


3. *2767*3855#
Think before you give this code. This code is used for factory format. It’ll remove all files and settings including the internal memory storage. It’ll also reinstall the phone firmware.

Note:- Once you give this code, there is no way to cancel the operation unless you remove the battery from the phone. So think twice before giving this code.


4. *#*#34971539#*#*
This code is used to get information about phone camera. It shows following 4 menus:

* Update camera firmware in image (Don’t try this option)
* Update camera firmware in SD card
* Get camera firmware version
* Get firmware update counter

Note:- Never use the first option otherwise your phone camera will stop working and you’ll need to take your phone to service center to reinstall camera firmware.


5. *#*#7594#*#*
This one is my favorite one. This code can be used to change the “End Call / Power” button action in your phone. Be default, if you long press the button, it shows a screen asking you to select any option from Silent mode, Airplane mode and Power off.

You can change this action using this code. You can enable direct power off on this button so you don’t need to waste your time in selecting the option.


6. *#*#273283*255*663282*#*#*
This code opens a File copy screen where you can backup your media files e.g. Images, Sound, Video and Voice memo.


7. *#*#197328640#*#*
This code can be used to enter into Service mode. You can run various tests and change settings in the service mode.


8. *#*#232339#*#* OR *#*#526#*#* OR *#*#528#*#*
WLAN test (Use “Menu” button to start various tests)


9. *#*#232338#*#*
Shows WiFi MAC address


10. *#*#1472365#*#*
GPS test


11. *#*#1575#*#*
Another GPS test


12. *#*#232331#*#*
Bluetooth test


13. *#*#232337#*#
Shows Bluetooth device address


14. *#*#8255#*#*
This code can be used to launch GTalk Service Monitor.


15. Codes to get Firmware version information:

*#*#4986*2650468#*#* – PDA, Phone, H/W, RFCallDate

*#*#1234#*#* – PDA and Phone

*#*#1111#*#* – FTA SW Version

*#*#2222#*#* – FTA HW Version

*#*#44336#*#* – PDA, Phone, CSC, Build Time, Changelist number


16. Codes to launch various Factory Tests:

*#*#0283#*#* – Packet Loopback

*#*#0*#*#* – LCD test

*#*#0673#*#* OR *#*#0289#*#* – Melody test

*#*#0842#*#* – Device test (Vibration test and BackLight test)

*#*#2663#*#* – Touch screen version

*#*#2664#*#* – Touch screen test

*#*#0588#*#* – Proximity sensor test

*#*#3264#*#* – RAM version

Now I’ll reveal 3 hidden modes in the phone:

* Fast Boot mode
* Download mode
* Recovery mode

WARNING: All these modes are used to flash/reset phone firmware. Think twice before entering in these modes.


17. Fast Boot Mode
* Power off your phone.
* Press and hold Call and End Call/Power keys.

This mode is used to flash the phone firmware using command line tools.


18. Download Mode
* Power off your phone.
* Press and hold Volume Down, OK and End Call/Power keys.

This mode is also used to flash the phone firmware. Mostly this mode is used by GUI tools for easier and quicker flashing.


19. Recovery Mode
* Power off your phone.
* Press and hold Volume Down, Call and End Call/Power keys.

This mode is used for recovery purposes like to reset the phone firmware

Note:- Once the alert triangle is shown on screen, press “Menu” key to reset the firmware or press “Home” and “End Call/Power” keys to show recovery menu.

 

반응형

갤럭시탭 10.1을 타켓으로 하는 프로젝트를 하는 중 HoneyComb(API Level 11)에서는 기본 webview 사용 시, html 문서내의 input box에 포커스가 주어졌을 때 Background 가 날아가는(?) 현상이 있다는 것을 발견 했습니다.

Graphic Rendering과 관련있는 문제로, 이를 해결하기 위해서는 Android 3.0 (API Level 11)에서 추가된 2D Graphics Hardware Accelerated 설정을 사용 해야 합니다.


Hardware Acceleration의 사용 방법 

Hardware Acceleration은 AndroidManifest.xml 또는 해당 클래스에서 정의 할 수 있습니다.

1.AndroidManifest.xml을 이용하는 방법
AndroidManifest.xml 의 <application> 태그에 android:hardwareAccelerated="true" 속성 추가 합니다.
application 이나 activity 수준에서 하드웨어 가속 설정을 할 때 사용하며, 특정 activity에서 하드웨어 가속에 대한 설정을 해제 할 때는 아래와 같이 사용 합니다.
<application android:hardwareAccelerated="true">
     <activity android:name="MainActivity" />
     <activity android:name="SubActivity" android:hardwareAccelerated="false" />
</application>


2. 해당 클래스에 정의 하는 방법

하드웨어 가속이 필요한 윈도우에 아래 코드를 추가 합니다.
getWindow().setFlags(
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);


Hardware Acceleration은 HoneyComb 이상의 SDK 에서만 설정 가능 하므로, Project Build Target을 Android 3.0(API Level 11) 이상으로 설정 해야 합니다.


Hardware Acceleration에 대한 더욱 자세한 정보는 아래 링크를 참조 하시기 바랍니다.
http://android-developers.blogspot.com/2011/03/android-30-hardware-acceleration.html



반응형

안드로이드는 대기 모드로 들어가게 되면 베터리 소모를 줄이기 위해서 wifi 모드를 해제한다.
이때, 인터넷으로 데이터를 주고 받는 중이거나, 스트리밍을 하고 있는 중 이라면 wifi가 꺼지고 3G가 활성화 되고, 3G는 사용자의 요금으로 이어진다.
이런 상황을 위해 백그라운드 실행 중에도 wifi 상태를 유지 해야 할 필요가 있다.

백그라운드 실행 중에도 wifi 상태를 유지하기 위해서는 android.net.wifi.WifiManager.WifiLock 을 이용해서 wifi상태를 유지시켜줘야 한다.

이에 대해 소개한 포스트 링크
http://drcarter.tistory.com/entry/Android-안드로이드-개발-시-주의사항-백그라운드-실행시-주의할-점


wifi 는 디스플레이 다음으로 베터리 소모를 많이 일으키는 요소 TOP5 에 들어간다.
위 포스트에서도 언급하고 있지만, wifi를 유지한다는 것은 베터리 소모를 촉진 시킨다는 것을 의미한다.

그래서, 본 문제는..
wifi 모드를 유지하면 요금은 세이브 되지만, 베터리 소모가 많아지고..
wifi 모드를 해제하면 베터리는 절약 되지만, 요금이 발생 하는..
그런 딜레마가 발생한다..

단순하게 생각하면, 돈 나가는 것 보다 베터리 나가는게 낫지만
상황에 따라서는 아닐수도 있는..
역시, 대세는 데이터 무제한..


반응형
안드로이드에서 가끔 Unable to start activity ComponentInfo 에러가 발생하는 경우가 있다.

시작 Activity와 관련이 있기 때문에 이 경우 시작과 관련된 부분을 검토 해 보면 되는데,
시작 Activity의 setContentView() 부분이나, AndroidManifest.xml 파일의 내용 등을 확인 해 보면 된다.

그런데, 아주 가끔 아무 이유도 없이, 아무 이상도 없는데도 Unable to start activity ComponentInfo 오류가 발생한다.

이럴때는, AndroidManifest.xml 파일에 임의 주석을 추가 한다던지 등의 프로그램과 관련 없는 내용을 수정하여 AndroidManifest 파일에게 변경을 인식하게 해 주고 원상복귀 하여 저장 후 실행하면 정상적으로 작동하기도 한다.

신비한 안드로이드...
반응형

android 3.0~3.1의 Honeycomb 에서 java.lang.IllegalStateException: trying to requery an already closed cursor 에러를 만나게 된다면, startManagingCursor() 사용을 막으십시오.

startManagingCursor()는 Activity의 라이프사이클에 따라 알아서 커서를 관리해주기 때문에 편리한 메소드 이지만, Honeycomb 에서는 이것으로 인해 에러가 발생하는 상황이 있습니다.

Honeycomb의 버그인지, 아니면 무슨 이유가 있는 것인지 알 수는 없으나 android 2.3 디바이스 까지는 아무 문제 없던 소스가 Honeycomb 디바이스에서는 에러를 꾸엑꾸엑 뱉어내면서 죽어버리는 현상이 있습니다.

Honeycomb에서는 Cursor 사용 후 직접 close() 처리를 하는 것이 좋을 것 같습니다.


번역된 외국 사이트를 많이 봐서 그런가..
왠지 말투가 번역기 스럽다...
반응형

'Developer > Android' 카테고리의 다른 글

Unable to start activity ComponentInfo 에러  (3) 2011.08.18
Android Intent 활용 사례  (0) 2011.06.28
웹페이지에서 Activity 호출하기  (0) 2011.06.22

안드로이드에서 Intent로 앱을 호출하는 방법 정리

 

연락처

연락처 조회

Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

연락처 등록

Intent intent = new Intent(Intent.ACTION_INSERT,
    Uri.parse("content://contacts/people"));
startActivity(intent);

연락처 수정

Intent intent = new Intent(Intent.ACTION_EDIT,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

연락처 삭제

Intent intent = new Intent(Intent.ACTION_DELETE,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

 

전화

* 권한 설정 (AndroidManifest.xml)
전화 걸기 : CALL_PHONE = "android.permission.CALL_PHONE"
긴급 통화 : CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED"
폰 상태 읽기 : READ_PHONE_STATE = "android.permission.READ_PHONE_STATE"
폰 상태 수정 : MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE"
브로드케스팅 수신 : PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS"
전화 걸기 이전 : ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL"

전화걸기 화면

Intent intent = new Intent(Intent.ACTION_DIAL,
    Uri.parse("tel:" + TelNumber));
startActivity(intent);

전화걸기

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + TelNumber));
startActivity(intent);

 

SMS

* 권한 설정 (AndroidManifest.xml)
수신 모니터링 : RECEIVE_SMS = "android.permission.RECEIVE_SMS"
읽기 가능 : READ_SMS = "android.permission.READ_SMS"
발송 가능 : SEND_SMS = "android.permission.SEND_SMS"
SMS Provider로 전송 : WRITE_SMS = "android.permission.WRITE_SMS"
                            : BROADCAST_SMS = "android.permission.BROADCAST"

SMS 발송 화면

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

SMS 보내기

Intent intent = new Intent(Intent.ACTION_SENDTO,
    Uri.parse("smsto://01012341234"));
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

 

이메일

이메일 발송 화면

Intent intent = new Intent(Intent.ACTION_SENDTO,
    Uri.parse("mailto:" + contact.getEmail()));
startActivity(intent);

 

브라우저

Browser에서 URL 호출하기

Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse("http://www.google.com/"));
startActivity(intent);

브라우저에서 검색

Intent intent = new Intent(Intent.ACT ION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "검색어");
startActivity(intent);

 

지도

지도 보기

Uri uri = Uri.parse ("geo: 38.00, -35.03");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

 

안드로이드 마켓

안드로이드 마켓에서 Apps 검색

Uri uri = Uri.parse("market://search?q=pname:전제_패키지_명");  
//--- 예) market://search?q=pname:com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

안드로이드 마켓의 App 상세 화면

Uri uri = Uri.parse("market://details?id=전제_패키지_명");
//--- 예) market://details?id=com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent);

 

설정화면

각 설정별 Activity Action : http://developer.android.com/reference/android/provider/Settings.html

 

* Activity Action 예시
WiFi : android.provider.Settings.ACTION_WIFI_SETTINGS
Bluetooth : android.provider.Settings.ACTION_BLUETOOTH_SETTINGS
디스플레이 : android.provider.Settings.ACTION_DISPLAY_SETTINGS

설정화면 부르기 (WiFi의 예)

Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

 

반응형

WebView를 이용하는 프로그램이 웹페이지에서 Activity를 호출하는 방법

아래와 같은 html 문서가 있을 때

test.html
<html>
	<body>
		<a href="app://application">Activity 호출</a>		
	</body>
</html>

app://application 링크를 통해 Activity를 호출하기 위해서 java 파일을 아래와 같이 작성한다
MainActivity.java

url.startsWith 메소드를 통해 url 시작 정보를 읽어 오는 방법이다.
같은 기능을 indexOf 메소드를 이용해서도 구현할 수 있다.
if 구문을 아래와 같이 변경 하면 된다.
indexOf 사용

검색하다 보니 AndroidManifest.xml 파일에 intent-filter를 추가해야 한다는 글이 많았는데, 난 추가 안해도 잘 돼서 패스.. (난, Android 2.3 에서 테스트 했음)
어쨌든 intent-filter는 TargetActivity에 추가해야 하며, 내용은 아래와 같다.
AndroidManifest.xml

마지막으로 MainActivity.java 파일에서 사용한 main Layout 파일은 아래와 같다.
main.xml





반응형

'Developer > Android' 카테고리의 다른 글

Android Intent 활용 사례  (0) 2011.06.28
AndroidManifest.xml 구조  (0) 2011.05.09
Android 외장메모리 경로 추출  (0) 2011.04.26

TabActivity의 내용을 구현하는 방법에는 일반적으로 다음과 같은 방법이 있다.

1. Layout xml을 이용하는 방법
2. 다른 java class를 이용하는 방법
3. TabActivity class에서 직접 생성하는 방법

Layout xml을 TabActivity에서 호출

아래와 같은 내용의 xml Layout이 있는 경우

layout_tab1.xml

해당 id를 호출

testTab1.java


class를 TabActivity에서 호출

java파일 testTab2_1, testTab2_2, testTab2_3 이 아래와 같이 있는 경우

testTab2_1.java

testTab2_2.java

testTab2_3.java

intent로 해당 class를 호출

testTab2.java


TabActivity에서 직접 내용 생성

TabContentFactory 인터페이스를 이용.
TabContentFactory 인터페이스는 createTabContent를 정의하며, 탭 호스트로부터 전달된 태그명으로부터 뷰를 생성해 리턴하는 역할을 한다.

testTab3.java

반응형

Android 기반의 태블릿 PC인 삼성 갤럭탭 AVD (Android Virtual Devices) 입니다.
이클립스에 ADT(Android Development Tool)가 설치된 상태에서
Window > Android SDK and AVD Manager > Available Packages > Add Add-on Site
를 눌러 아래주소를 입력하면 삼성 갤럭시탭 AVD를 생성할 수 있습니다.

follow @AndroidDev: http://twitter.com/AndroidDev#
GALAXY Tab Info: http://galaxytab.samsungmobile.com/

사용자 삽입 이미지




반응형
Android는 기본 개발 언어가 JAVA이기 때문에 JAVA 개발시 기본적으로 설치 하는 Tool 위에 Android 개발에 필요한 Tool을 설치한다.

Android는 오픈소스로, 통합된 개발 환경을 한 회사에서 주도적으로 만든 것이 아니기 때문에 이것저것 설치해야 하며, 설치 초보자는 순서를 잘 지켜 차례대로 설치 하는 것이 좋다.

1. JDK(Java Development Kit) 설치
http://www.oracle.com/technetwork/java/javase/downloads/index.html


2. 이클립스 설치
http://www.eclipse.org/downloads/

* 이클립스 지원에 대한 Android 공식 공지 (http://developer.android.com/sdk/requirements.html)
2014.04.29. 현재 : Eclipse 3.7.2 (Indigo) 나 그 상위 버전을 사용 할 것. 이클립스 3.6 (Helios)는 더 이상 최신 버전의 ADT(Android Development Tools)를 지원하지 않음.
2012.01.05. 현재 : Eclipse 3.6 (Helios) 나 그 상위 버전을 사용 할 것. 이클립스 3.5 (Galileo)는 더 이상 최신 버전의 ADT(Android Development Tools)를 지원하지 않음.
2010.08.19. 현재 : 최신 버젼은 3.6 (Helios) 이지만, Android SDK 구동에 3.5가 안정적이다. 


3. ADT(Android Development Tool) 플러그인 설치
이클립스에서 Help > Install New Software 에서 'Add' 버튼을 눌러 android ADT 경로(https://dl-ssl.google.com/android/eclipse/)를 입력하여 설치한다.
설치중에 서명이 없는 소프트웨어가 있다는 경고가 뜨더라도 계속 설치한다.

ADT 공식 설명서는 아래 경로에 있다.(영문)
http://developer.android.com/sdk/eclipse-adt.html
ADT가 설치 됐는지 여부는 Help > About Eclipse > Installation Details 에서 확인 하면 된다.


4. Android SDK 설치
http://developer.android.com/sdk/index.html
SDK는 따로 설치할 필요 없이 압축만 풀어 두면 된다.
압축 해제 후, 이클립스의 Window > Preference > Android 에서 SDK의 Location을 압축을 푼 경로로 지정하고, Window > Android SDK and AVD Manager > Available Packages 에서 추가 SDK요소들을 다운 받는다.

뭘 설치 해야 할지 모를 때는 전부 선택해서 전부 설치 하는 것이 낫다.

SDK를 설치하기 전에 시스템 요구사항(영문) http://developer.android.com/sdk/requirements.html 을 읽어 보는 것이 좋다.
(2010.08.19일 현재 SDK가 이클립스 3.6에서 실행에 문제가 있으니 3.5에서 실행 해 달라는 내용의 경고가 있다.)

"Caution: There are known issues with the ADT plugin running with Eclipse 3.6. Please stay on 3.5 until further notice."


5. AVD(Android Virtual Device) 생성 및 옵션 조정
이클립스의 Window > Android SDK and AVD Manager 의 Virtual Devices 에서 New 버튼으로 AVD를 생성한다.
SD Card 설정은 최소한 9MB 보다 크게 설정해야 한다.
Android 화면은 HVGA가 표준 해상도 이다.
AVD 생성후 Start 버튼을 누르면 에뮬레이터가 작동한다.

AVD 경로에 영문이 아닌 문자가 있으면 이클립스가 에뮬레이터를 제대로 기동시키지 못한다.
윈도우 계정명을 한글로 쓰는 사람들은 에뮬레이터 기동시 에러가 발생 할 수 있다.
이런 경우 .android\avd 폴더 내의 'AVD명.avd' 폴더(ini 파일은 유지)를 영문만 있는 경로(예를 들면 C:\ 같은..)로 옮겨주고
avd 폴더에 있는 AVD명.ini 파일의 path 값을 해당 경로로 수정 해 준다.

 
이것으로 Android 프로그래밍을 위한 준비가 끝났다.


반응형

'Developer > Android' 카테고리의 다른 글

Android 2.3(Gingerbread) 에서 추가된 기능  (0) 2011.04.18
TabActivity 구현  (0) 2011.01.17
삼성 갤럭시탭 AVD Add-on Link  (0) 2010.11.08

+ Recent posts