728x90

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

728x90
728x90
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


728x90
728x90

제목 잡기가 참 힘들다.

간단하게 설명할 수 있는 타이틀이 떠오르지 않는다.

이 글은 duplicateParentState와 addStatesFromChildren에 대한 내용이다.


'안드로이드에서 부모 뷰의 속성이 자식 뷰에도 동일하게 적용 되도록 하는 방법'이란 것인데, 좀 쉽게(?) 설명하자면 이런 경우다.


1. 게시판 리스트뷰가 있다.

2. 각 항목은 More 버튼을 가지고 있다.

3. More 버튼을 누르면 다음 화면으로 넘어간다.

4. More 버튼을 직접 누르지 않고 해당 아이템을 눌러도 다음 화면으로 넘어간다.

5. More 버튼을 직접 누르지 않더라도 항목이 눌리면 More 버튼도 눌림 처리 되어야 한다.


마지막 5번이 핵심 요건이다.


3번을 처리하기 위해 More 버튼에 클릭이벤트를 주고, 4번을 처리하기 위해 레이아웃(Layout)에 클릭 이벤트나 터치이벤트를 주는것은 별 문제가 아니다.

그런데, 5번을 처리하기 위해 레이아웃 클릭 시 More 버튼이 눌린 것 처럼 표현하기 위해 별도의 처리를 하는 번거로움을 duplicateParentState="true" 속성으로 해결할 수 있다.


addStatesFromChildren는 duplicateParentState와 반대의 경우로 More 버튼을 눌렀을 때 Layout이 눌림 처리 되는 것이라 이해하면 된다.


아래 예제를 참고하자

http://ingeni.tistory.com/entry/Android-duplicateParentState-부모뷰-속성을-동일하게-자식뷰에-적용하기

http://stackoverflow.com/questions/10605647/android-make-parent-selector-trigger-when-selecting-child

728x90
728x90

ListView 에서 데이터 페이징을 구현 하는 방법 중 주로 사용되는 방법이 아마 이 두가지가 아닐까 싶다.

1. 맨 아래에 '더보기' 버튼을 놓는다.

2. 스크롤이 맨 아래에 닿았을 때 새로운 데이터를 불러 온다.

 

하지만, 이 두 방법은 사용자에게 정보 전달의 Delay를 발생시킨다.

빠르게, 지연없이, 정보를 쭉쭉 확인하고 싶은 사람에게는 순간순간의 Stop을 발생시키게 되는 것이다.

사용자에게 이러한 정보의 Delay를 발생시키지 않는 지연 없는 데이터 전달이 필요한 경우가 있다.

 

위에서 나온 2번에 대한 응용으로 스크롤이 가장 마지막 Data 항목까지 가지 않고, 특정 Data항목에 다다르면 다음 Data를 불러오는 방법이다.

activity_main.xml
<relativelayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="match_parent">

	<listview
		android:id="@+id/lv_main"
		android:layout_width="match_parent"
		android:layout_height="match_parent">
	</listview>
</relativelayout>
MainActivity.java
public class MainActivity extends Activity {
	private ListView lvMain;
	private boolean isLoading = false;
	private int mCurrentPage = 0; // 현재 페이지 번호
	private int mTotalPage = 0; // 전체 페이지 번호
	private int mItemCount= 15; // 화면에 보여줄 항목 수

	@Override
	public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
		super.onCreate(savedInstanceState, persistentState);
		setContentView(R.layout.activity_main);
		lvMain = (ListView) findViewById(R.id.lv_main);
		lvMain.setOnScrollListener(onScroll);
	}

	OnScrollListener onScroll = new OnScrollListener() {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
			if ((totalItemCount - firstVisibleItem) < mItemCount && mCurrentPage < mTotalPage) {
				setRequestData(mCurrentPage + 1);
			}
		}
	};

	private void setRequestData(int page) {
		if (isLoading) {
			return;
		}
		isLoading = true;
		
		// TODO 데이터 통신
		// TODO 데이터 통신 완료 후 mCurrentPage값, mTotalPage값을 지정. isLoading=false로 지정.
	}
}

 

OnScrollListener에서 ListView 스크롤 시 남아있는 항목의 갯수를 체크하여 미리 데이터를 불러온다.

통신환경에 따라 차이는 있겠지만, 이런 방식으로 페이징을 구현하면 사용자가 데이터를 불러오느라 기다리는 시간을 단축시킴으로써 서비스의 신속성을 유지할 수 있다.

 

 

728x90
728x90

assets 폴더에 적용할 폰트를 넣어놓고 아래 코드를 적용한다.

여기서는 Roboto-Thin.ttf 폰트를 예로 들어 표기한다.

MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Typeface mFont = Typeface.createFromAsset(getAssets(), "Roboto-Thin.ttf");
    ViewGroup root = (ViewGroup) findViewById(R.id.mylayout);
    setFont(root, mFont);
}

public void setFont(ViewGroup group, Typeface font) {
    int count = group.getChildCount();
    View v;
    for (int i = 0; i < count; i++) {
        v = group.getChildAt(i);
        if (v instanceof TextView || v instanceof EditText || v instanceof Button) {
            ((TextView) v).setTypeface(font);
        } else if (v instanceof ViewGroup)
            setFont((ViewGroup) v, font);
    }
}

 

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mylayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello!"
        android:textSize="40sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Click!"
        android:textSize="40sp" />
</LinearLayout>

 

 

728x90
728x90

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();
}
728x90

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

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

내 어플에서 외부 앱(3rd party App)을 실행하는 방법

 

실행시킬 패키지의 Activity를 아는 경우

ComponentName compName = new ComponentName("com.package","com.package.activity");
Intent intent = newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(compName);
startActivity(intent);

 

실행시킬 패키지명만 아는 경우

Intent intent = context.getPackageManager().getLaunchIntentForPackage("ParkageName");
startActivity(intent);
728x90
728x90

아래의 순서로 정해짐

 

한정자 종류 설명
MCC와 MNC mcc310.. 모바일 국가코드, SIM 카드에 저장된 모바일 네트워크 카드
언어와 지역 en
en-rUS
언어코드 :http://ko.wikipedia.org/wiki/ISO_639 : Alpha-2
한국(ko), 영어(en), 일본어(ja), 중국어(zh)
국가코드 : http://geotags.com/iso3166/countries.html
한국(ko), 영국(rGB), 미국(rUS), 덴마크(de)
화면 크기 small
normal
large
화면 크기에 따른 분류
화면 비율 long
notlong
notlong : QVGA, HVGA, VGA
Long : WQVGA, WVGA, FWVGA
방향 port
land
방향(orientation)
Dock mode car
desk
car : 자동차의 dock에 있을 경우
desk : 책상용 dock에 있을 경우
야간 모드 night
notnight
주간, 야간
픽셀 밀도 ldpi
mdip
hdpi
nodpi
ldpi
mdpi
hdpi
nodpi : 픽셀 밀도와 상관없는 비트맵 리소스를 위해서만 사용
터치 스크린 타입 notouch
stylus
finger
notouch : 터치 스크린 지원 안할 경우
stylus : 스타일러스 펜을 사용할 경우
finger : 손가락 사용
키보드 keysexposed
keyshidden
keyssoft
keysexposed : 하드웨어 키보드 보유
keyshidden : 하드웨어 있지만 사용 불가, SW 키보드 없는 상태
keyshoft : SW키보드만 지원
키보드 배열 nokeys
qwerty
12key
nokeys : 하드웨어 키 없음
qwerty : 하드웨어 키보드 보유
12key : 12key 하드웨어 보유
네비게이션 키 navexposed
navhidden
navexposed : 사용자가 네비게이션 키를 사용 가능
navhidden : 네비게이션 키 사용 불가
탐색 도구 nonav
dpad
trackball
wheel
nonav : 네비게이션 장치 없음
dpad : D-패드를 지원
trackball : 트랙볼 지원
wheel : 휠 탑재
API 레벨 v3
v4
..
안드로이드 SDK 버전에 따른 분류

 

언어코드

values는 영어
values-ko : 한국어
values-ja : 일본어
values-zh : 중국어

 

이미지

drawable-ko-hdpi
drawable-ja-hdpi
drawable-zh-hdpi

 

조합

drawable-en-rUS-land
drawable-en-rGB-hdpi
drawable-port-hdpi
values-fr-rCA

 

  ldpi(120) mdpi(160) hdpi(240)
small QVGA(240x320)
2.6 ~ 3.0 인치
   
normal WQVGA(240x400)
3.2 ~ 3.5 인치
FWQGA(240x432)
3.5 ~ 3.8 인치
HVGA(320x480)
3.0 ~ 3.5 인치
WVGA(480x800)
3.3 ~ 4.0 인치
FWVGA(480x854)
3.5 ~ 4.0 인치
large   WVGA(480x800)
4.8 ~ 5.5 인치
FWVGA(480x854)
3.5 ~ 4.0 인치
 

 

728x90
728x90


프롤로그 

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

그런데 여기서 또 문제가, 안드로이드는 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


728x90
728x90

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테마를 위해 존재하는 듯...


728x90
728x90

일반적으로 어플리케이션에서 사용되는 문자열을 정의 해 놓는 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 파일에 정의된 인자보다 많으면 정의된 갯수 이외의 인자는 무시됩니다.

 



 

728x90
728x90

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에 체크 후, 자신의 모니터에 맞춰 조절하면 된다.




728x90
728x90

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

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시간 동안 나는 짜증 대마왕이 되버린....
같은 문제로 고생하는 이들이 조금이라도 빨리 해결할 수 있기를 바란다.



728x90
728x90


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.

 

728x90
728x90

갤럭시탭 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



728x90
728x90

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

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

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


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

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

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


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

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

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

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

신비한 안드로이드...
728x90
728x90

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() 처리를 하는 것이 좋을 것 같습니다.


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

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

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

안드로이드에서 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);

 

728x90
728x90

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





728x90

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

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

manifest 파일은 작성된 안드로이드 어플리케이션에 대한 주요 정보들을 가지고 있다.
때문에, 프로그램을 분석할 때 가장 먼저 보게 되는 곳이 manifest 파일이다.
이때, 구조를 잘 이해하고 있으면 manifest 파일을 해석 하는데 많은 도움이 된다.

출처 : http://developer.android.com/guide/topics/manifest/manifest-intro.html

AndroidManifest.xml


728x90
728x90

getExternalStorageDirectory() 메서드는 external storage directory를 가져온다.
그리고, getAbsolutePath() 메서드는 경로의 Root를 가져온다.
이 두가지를 조합해서 아래와 같이 사용하면 된다.

안드로이드에서 SD카드를 이용한 외장메모리 영역 뿐만 아니라 내부의 확장메모리영역의 주소값을 가져 올 때도 사용 가능.

import java.io.File;
import android.os.Environment;

public String getSDPath() {
    File extSt = Environment.getExternalStorageDirectory();
    String SDPath = extSt.getAbsolutePath();
    return SDPath;
}

 

728x90

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

AndroidManifest.xml 구조  (0) 2011.05.09
Android 2.3(Gingerbread) 에서 추가된 기능  (0) 2011.04.18
TabActivity 구현  (0) 2011.01.17
728x90
Froyo는 Java5 기반이었으나 Gingerbread는 Java6 기반으로 Java API를 업그레이드하여 일부 java.*, javax.* 패키지의 API가 변경됨
그 외 일부 Android 개선사항이 반영되어 android.* 패키지의 API가 변경됨
변경된 메소드는 Android Developers의 Android API Differences Report 문서 참조

아래는 Tstore Developer Center에서 제공하는 내용임.

NFC 관련

가) NfcAdapter, NdefMessage, NdefRecord 로 구성된 android.nfc 패키지가 추가됨.
NfcAdapter는 NFC H/W에 대한 핸들을 제공하며,NDEF(NFC Data Exchange Format)의 개별 레코드는 NdefRecord, 레코드의 셋은 NdefMessage로 표현됨

나) NFC 지원 단말은 NFC Service가 백그라운드에서 구동되며 NFC 태그를 읽으면 읽혀진 NDEFMessage를 extra data로 하는 ACTION_TAG_DISCOVERED intent를 브로드캐스트하므로 NFC 기능을 활용하는 App은 AndroidManifest.xml에 아래의 intent-filter 엘리먼트를 포함해야 함
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>

다) NFC 기능을 활용하는 App은 아래 퍼미션을 AndroidManifest.xml에 명시해야 하며, 구동 시 NfcAdapter의 isEnabled() 메소드를 호출해서 단말의 NFC 지원여부를 확인해야 함
<uses-permission android:name="android.permission.NFC">

라) NFC 기능을 활용하는 App은 구글마켓에서 NFC 미지원 단말에게 노출되지 않기 위해 AndroidManifest.xml에 아래 엘리먼트를 포함해야 함
<uses-permission android:name="android.permission.NFC">


센서 관련

자이로를 포함한 신규 센서를 활용하는 App은 구글마켓에서 미지원 단말에게 노출되지 않기 위해 AndroidManifest.xml에 아래 엘리먼트 중 필요한 항목을 포함해야 함
<uses-feature android:name="android.hardware.sensor.gyroscope" android:required="true">
<uses-feature android:name="android.hardware.sensor.barometer" android:required="true">


카메라 관련

단말의 특정 카메라를 선택하기 위해 Camera 클래스에 카메라의 개수를 확인하고, 특정 카메라의 정보를 획득하고, 특정 카메라를 선택하는 메소드들이 추가되고, 각 카메라의 캠코더 기능 또한 선택해서 확인할 수 있음


음향효과 관련 

음향효과를 제공하기 위해 android.media.audiofx 패키지가 추가되었으며, Equalizer, Virtualizer, BassBoost, PresetReverb, EnvironmentalReverb 등 음향효과 클래스가 추가됨
각 음향효과는 트랙별 또는 전체에 적용될 수 있으며, 트랙별로 음향효과를 적용하기 위해 AutioTrack 클래스와 MediaPlayer 클래스가 수정됨


멀티미디어 프레임웍 관련

가) 멀티미디어 프레임웍이 Opencore가 완전히 제거되고 Stagefright로 대체됨.
일반 App에는 영향이 없으나 DRM 등 멀티미디어 프레임웍의 플러그인 형태의 App은 수정 개발해야 함

나) JPEG 메타데이터의 위치정보 중 위도/경도 외에 고도 태그를 읽을 수 있는 API가 추가됨


다운로더 관련 

가) HTTP 기반의 파일 다운로드를 제공하는 DownloadManager 백그라운드 서비스가 추가됨.
App은 바인더를 통해 DownloadManager에게 다운로드를 요청,쿼리,취소할 수 있음

나) 각 다운로드 항목은 인디케이터에 표시되며 사용자가 항목을 클릭하면 DownloadManager가 AC-TION_NOTIFICATION_CLICKED intent를 브로드캐스트하므로,  다운로드를 요청한 App은 broadcast receiver를 통해 필요한 동작을 할 수 있음

다) 단말이 재부팅되거나 네트워크 연결상태가 변경되면 DownloadManager가 자동으로 이어받기를 진행하며 다운로드 파일은 디폴트로 공용 폴더에 저장되나 다운로드 요청 시 다른 폴더를 저장폴더로 설정할 수 있음


StrictMode 관련 

가) Android App의 메인 쓰레드는 반응성을 높이기 위해 UI관련 이벤트를 주로 처리하며 파일 I/O 또는 네트워크 I/O는 별도 쓰레드에서 처리하는 것이 좋음.
또한, DB접속을 명시적으로 종료하지 않으면 일시적인 메모리 leak이 발생하며 DB접속에 부하가 발생하므로 DB접속을 명시적으로 종료해야 함

나) StrictMode는 App의 메인 쓰레드에서 I/O가 발생하는지, DB접속이 명시적으로 종료되지 않는지 검출하기 위해 신규 제공되는 디버깅 목적의 클래스임


UI 프레임웍 관련 

가) View와 Widget에서 오버스크롤링 지원 추가

나) Touch spoofing을 막기 위해 Toast 등에 가려진 View가 터치 이벤트를 받지 않는 기능 추가

다) 입력이벤트와 입력장치에 대한 베이스클래스를 정의하여 일관된 이벤트 hierarchy를 구성하여 입력이벤트와 입력장치에 대한 속성을 확인할 수 있도록 함

라) 멀티포인트 멀티터치 트래킹이 가능하도록 MotionEvent 클래스 확장함. 각 터치포인트는 “pointer ID”로 관리됨.

마) 텍스트 선택 컨트롤을 일반 App에서 활용 가능하도록 BaseInputConnection, InputConnection, In-putConnectionWrapper 클래스 확장

바) ActivityInfo에 화면 orientation 항목이 추가되고, RunningAppProcessInfo에 empty, background, service, foreground, visible 외에 perceptible 항목이 추가됨 (백그라운드 뮤직 플레이어 등의 용도)

사) Notification 텍스트와 아이콘 스타일을 정의하기 위한 항목 추가함


대(xlarge) 화면 지원 관련 

가) Froyo의 고해상도(xhdpi) 지원에 이어 7인치 이상의 대화면(xlarge) 지원을 추가함.

나) App은 AndroidManifest.xml에 아래 엘리먼트를 추가하여 대화면 지원 여부를 명시할 수 있음
<supports-screens android:xlargeScreens=”true”/”false”>

다) App 패키징 시 대화면용 App 리소스는 xlarge 폴더에 두어야 함


그래픽 관련 

가) OpenGL ES 2.0 메소드 중 Froyo에서 지원되지 않은 glDrawElements()와 glVertexAttribPointer()를 추가함

나) YV12 픽셀포맷 지원을 추가함


Content Provider 관련 

가) 검색 결과를 바로 재생하기 위한 PLAY_FROM_SEARCH intent가 MediaStore에 추가됨. 음성인식을 통한 미디어 재생에 활용함.

나) 특정 App의 관리화면과 응용프로그램관리 초기화면으로 바로 진입할 수 있도록 Settings에 APPLICATION_DETAILS_SETTINGS intent와 MANAGE_ALL_APPLI CATIONS_SETTINGS intent가 추가됨

다) SIP 주소를 저장할 수 있도록 ContactsContract에 ContactsContract.CommonData Kinds.SipAddress 타입 추가됨


Location 관련 

가) LocationManager에게 위치정보를 요청해서 wake lock이나 WiFi lock을 유발한 App을 트랙킹하여 응용프로그램관리 메뉴의 App별 배터리 사용 정보에 반영함

나) Activity는 LocationManager의 requestLocationUpdates() 또는 requestSingleUpdate() 메소드를 통해 위치정보를 주기적 또는 일회성으로 업데이트받도록 등록할 수 있음.
위치정보 제공자는 명시적으로 선택하거나, Criteria 클래스를 통해 특정 조건 (정확도, 전력소모량, 속도, 비용 등)에 맞는 제공자 선택 가능


Storage 관련 

가) OBB(Opaque Binary Blob) 지원을 위한 StorageManager 클래스 추가됨.
OBB 파일은 마운트해서 사용하는 별도의 파티션이고 StorageManager는 특정 OBB의 마운트여부 확인, 마운트, 언마운트를 수행함

나) Android 2.3은 외장SD가 없는 단말도 허용함.
외장SD를 필요로하는 App은 isExternalStorageRe-movable() 메소드를 통해 외장SD 존재 여부 확인 가능


Package Manager 관련 

가) 패키지정보에 최초설치시간과 최종업데이트시간 필드 추가됨

나) 특정 컨텐츠 프로바이더에 대한 정보를 제공하는 getProviderInfo() 메소드 추가됨

추가된 screenOrientation 속성 값

설명

reverseLandscape

상하가 뒤집힌 Landscape 화면

reversePortait

상하가 뒤집힌 Portrait 화면

sensorLandscape

Landscape 모드이되 상하 선택은 센서 활용

sensorPortrait

Portrait 모드이되 상하 선택은 센서 활용

fullSensor

Landscape, Portrait, 상하 선택에 센서 활용



728x90

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

Android 외장메모리 경로 추출  (0) 2011.04.26
TabActivity 구현  (0) 2011.01.17
삼성 갤럭시탭 AVD Add-on Link  (0) 2010.11.08
728x90

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

728x90
728x90

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/

사용자 삽입 이미지




728x90
728x90
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 프로그래밍을 위한 준비가 끝났다.


728x90

'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