달력

0

« 2025/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
반응형
728x90
반응형
애플리케이션을 제작하다 보면 파일을 입/출력 기능을 구현해야 하는 경우가 있습니다. 파일 입/출력을 수행하려면 파일의 경로를 꼭 알아야 하는데, 안드로이드에서 파일을 저장할 수 있는 경로는 다양합니다.

가장 크게 애플리케이션 데이터가 저장되는 영역(일반적으로 '내부 저장소(Internal Storage)'라 불림)와 사진, 비디오, 데이터 등을 저장하는 영역(일반적으로 '외부 저장소(External Storage)(주1)'라 불림)으로 나뉠 수 있으며, 각 영역별로 다시 캐시 데이터가 저장되는 영역, 데이터베이스가 저장되는 영역 등으로 나뉩니다.

(주1) 외부 저장소는 사용자 데이터(사진, 동영상, 등)이 저장되는 영역입니다. 일반적으로 이는 단말기의 외장 SD카드를 지칭하지만, 단말기에 따라서는 이 영역이 외장 SD카드가 아닌 단말기 내부에 탑재되어 있는 경우도 있었습니다. (넥서스S가 이에 해당) 또는, 단말기 내에 탑재된 외장 메모리 영역 외에 별도의 SD카드도 지원하는 단말기도 존재합니다. (갤럭시S가 이에 해당)

내부 저장소는 각 애플리케이션에서만 데이터를 읽고 쓸 수 있지만, 외부 저장소에는 특정 애플리케이션에서만 사용하는 애플리케이션 고유 영역과 공용 영역이 각각 존재합니다. 애플리케이션 고유 영역에는 각 애플리케이션에서 사용하는 데이터를 저장하며, 이 영역에 저장된 내용은 애플리케이션이 삭제될 때 같이 삭제됩니다.

공용 영역에는 사진, 비디오, 기타 파일 등을 저장하며 애플리케이션의 삭제에 영향을 받지 않습니다. 하지만, 외부 저장소에 저장된 데이터는 애플리케이션 고유 영역에 저장되어 있더라도 다른 애플리케이션에서 해당 데이터에 접근하는 것이 가능합니다.

각 영역의 경로가 필요할 때마다 해당 경로를 직접 써서 사용할 수도 있겠지만, 번거롭기도 하고 각 유형에 해당하는 경로를 그 때마다 찾아봐야 하므로 시간도 많이 소요됩니다. 이러한 이유로 안드로이드에서는 데이터가 저장되는 주요 경로를 간편하게 얻는 메서드를 제공합니다.

내부 저장소

1. 캐시(Cache) 저장 영역
캐시 디렉터리에는 애플리케이션에서 필요한 임시 파일들이 저장됩니다.

API
File Context.getCacheDir()
내부 저장소의 캐시 디렉터리 경로를 반환합니다.

내부 저장소의 캐시 디렉터리 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/cache

패키지 이름이 com.androidhuman.app 일 경우, 이 애플리케이션의 캐시 디렉터리 경로는 다음과 같습니다.

/data/data/com.androidhuman.app/cache

2. 데이터베이스(Database) 파일
애플리케이션에서 사용하는 데이터베이스 파일들이 저장됩니다.

API
File Context.getDatabasePath(String name)
데이터베이스 파일의 경로를 반환합니다. 인자로 데이터베이스 파일의 이름을 넘겨줍니다.

데이터베이스 파일이 저장되는 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/databases

패키지 이름이 com.androidhuman.app 일 경우, 데이터베이스 파일은 다음 경로에 저장됩니다.

/data/data/com.androidhuman.app/databases

3. 일반 파일 저장 영역
데이터베이스와 캐시를 제외한 애플리케이션에서 사용하는 일반 파일이 저장되는 영역입니다. 이 경로는 Context.openFIleOutput(String, int)를 사용하여 생성되는 파일이 저장되는 경로와 동일합니다.

API
File Context.getFilesDir()
애플리케이션에서 사용하는 일반 파일들이 저장되는 경로를 반환합니다.

파일이 저장되는 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/files

패키지 이름이 com.androidhuman.app 일 경우, 일반 파일은 다음 경로에 저장됩니다.

/data/data/com.androidhuman.app/files

애플리케이션에서 사용하는 각 일반 파일들의 경로를 가져오려면 다음 메서드를 사용합니다.

API
File Context.getFileStreamPath(String name)
일반 파일이 저장된 공간에서 특정 이름을 가지는 파일의 경로를 반환합니다. 인자로 확장자를 포함한 파일 이름을 넘겨줍니다.

파일의 경로는 다음과 같이 구성됩니다.

/data/data/[패키지 이름]/files/[파일이름]

패키지 이름이 com.androidhuman.app 이고 파일 이름이 filename.ext일 경우, 파일의 경로는 다음과 같습니다.

/data/data/com.androidhuman.app/files/filename.ext


외부 저장소-공용 영역

1. 최상위 경로 얻기
외부 저장소(일반적으로 SD카드)의 최상위 경로를 의미합니다.

API
static File Environment.getExternalStorageDirectory()
외부 저장소의 최상위 경로를 반환합니다.

2.2 (Froyo) 이상을 기준으로 반환되는 최상위 경로는 일반적으로 다음과 같습니다.

/mnt/sdcard


2. 특정 데이터를 저장하는 영역
여러 애플리케이션에서 공용으로 사용할 수 있는 데이터들을 저장합니다. 데이터의 유형에 따라 별도의 디렉터리를 사용합니다.

API
static File Environment.getExternalStoragePublicDirectory(String type)
데이터 유형에 따른 외부 저장소의 저장 공간 경로를 반환합니다. 인자로 디렉터리의 유형을 넘겨줍니다.

안드로이드에서는 총 7개 데이터 유형에 대한 표준 저장 경로를 제공합니다. Environment.getExternalStoragePublicDirectory()의 인자로 넘겨줄 수 있는 인자 및 각 인자의 경로는 다음과 같습니다.

인자명 설명 경로
Environment.DIRECTORY_ALARMS 알람으로 사용할 오디오 파일을 저장합니다. /mnt/sdcard/Alarms
Environment.DIRECTORY_DCIM 카메라로 촬영한 사진이 저장됩니다. /mnt/sdcard/DCIM
Environment.DIRECTORY_DOWNLOADS 다운로드한 파일이 저장됩니다. /mnt/sdcard/Download
Environment.DIRECTORY_MUSIC 음악 파일이 저장됩니다. /mnt/sdcard/Music
Environment.DIRECTORY_MOVIES 영상 파일이 저장됩니다. /mnt/sdcard/Movies
Environment.DIRECTORY_NOTIFICATIONS 알림음으로 사용할 오디오 파일을 저장합니다. /mnt/sdcard/Notifications
Environment.DIRECTORY_PICTURES 그림 파일이 저장됩니다. /mnt/sdcard/Pictures
Environment.DIRECTORY_PODCASTS 팟캐스트(Poacast) 파일이 저장됩니다. /mnt/sdcard/Podcasts

이 영역에 데이터를 저장하기 전에, 해당 디렉터리가 존재하는지 필히 확인해야 합니다. 이를 확인하기 위해 File.mkdirs()를 사용하여 디렉터리가 없을 경우 새 디렉터리를 생성합니다. 디렉터리가 존재하지 않을 경우 FileNotFoundException이 발생합니다.

외부 저장소-애플리케이션 고유 영역

1. 특정 데이터를 저장하는 영역
애플리케이션 고유 영역에도 공용 영역과 마찬가지로 각 데이터 유형별로 데이터를 저장하는 표준 디렉터리를 제공합니다.

API
File Context.getExternalFilesDir(String type)
애플리케이션 고유 영역의 데이터 유형에 따른 외부 저장소의 저장 공간 경로를 반환합니다. 인자로 디렉터리의 유형을 넘겨줍니다.

각 경로의 역할은 공용 영역과 동일합니다.

인자명 경로
Environment.DIRECTORY_ALARMS /mnt/sdcard/Android/data/[패키지 이름]/files/Alarms
Environment.DIRECTORY_DCIM /mnt/sdcard/Android/data/[패키지 이름]/files/DCIM
Environment.DIRECTORY_DOWNLOADS /mnt/sdcard/Android/data/[패키지 이름]/files/Downloads
Environment.DIRECTORY_MUSIC /mnt/sdcard/Android/data/[패키지 이름]/files/Music
Environment.DIRECTORY_MOVIES /mnt/sdcard/Android/data/[패키지 이름]/files/Movies
Environment.DIRECTORY_NOTIFICATIONS /mnt/sdcard/Android/data/[패키지 이름]/files/Notifications
Environment.DIRECTORY_PICTURES /mnt/sdcard/Android/data/[패키지 이름]/files/Pictures
Environment.DIRECTORY_PODCASTS /mnt/sdcard/Android/data/[패키지 이름]/files/Podcasts
null /mnt/sdcard/Android/data/[패키지 이름]/files


2. 캐시 데이터를 저장하는 영역
애플리케이션에서 사용하는 임시 데이터를 외부 저장소에 저장합니다.

API
File Context.getExternalCacheDir()
외부 저장소의 캐시 디렉터리를 반환합니다.

외부 저장소의 캐시 저장 경로는 일반적으로 다음과 같이 구성됩니다.

/mnt/sdcard/Android/data/[패키지 이름]/cache

패키지 이름이 com.androidhuman.app 일 경우, 캐시 저장 경로는 다음과 같습니다.

/mnt/sdcard/Android/data/com.androidhuman.app/cache



글 출처: 커니의 안드로이드 이야기

 

728x90
반응형
:
Posted by mapagilove
728x90
반응형
[안드로이드] 2.3 예제로 이해하는 layout - 2.3.1 LinearLayout


2. 예제로 안드로이드 맛보기

2.1 모든 개발의 시작... Hello world
2.2 Hello world 파헤치기

2.3 예제로 이해하는 layout

* 들어가는 말 : 오늘은 드디어 layout을 주물러 보도록 하겠습니다. 액티비티니, 통신이니, 스레드니 하는 것들은 차차 보기로 하고, 일단 눈에 보이는 것부터 해야 재미도 있고, 당장 폰에 올려 보고 신나게 해볼 수 있을테니까요... 자 그럼 시작합니다~

2.3.1 LinearLayout
UI 관련된 것은.. 그중에서도 xml이나 html처럼 화면정의 파일이 따로 있는 경우에는 더더욱, 백문(百聞)이 불여일견(不如一見)이다. 시시콜콜한 설명을 듣기 보다, 차이를 확실하게 알 수 있도록 의도적으로 작성해 놓은 예제를 보는 것만큼 효율적인 것이 없다. 그럼, 필자가 '의도적으로'작성한 아래 예제를 보자.

[그림16]

둘러보면, 가장 바깥에 LinearLayout이 있고, 그 안에 TextView, LinearLayout, TextView가 차례로 들어 있다. 여기서 알 수 있는 한가지 사실은 Layout은 얼마든지 중첩이 가능하다는 것이며, 이는 매우 유용할 것으로 보인다. 사실, 이정도도 말이 안될 것이다.
우선, LinearLayout의 속성을 살펴 보자

android:orientation="vertical" : 내부 아이템들을 리니어하게, 즉 일렬로 나열하는데, vertical이므로 세로로 나열하겠다는 뜻으로 보인다.
android:layout_width="fill_parent" android:layout_height="fill_parent" : 가로/세로 모두 바로 위 부모를 꽉 채우라는 것을 의미한다. 이 값들은 px이나 dp등의 사이즈 유닛으로 채울 수도 있으며, fill_parent의 반대 개념인 wrap_content도 가능한데, 이는 내부 아이템들을 넣을 수 있을 만큼만 차지하겠다는 것을 의미한다.
android:background="@color/bg" : 레이아웃의 배경을 의미하는데, 여기에 @color/bg 가 보이는데, 지난 챕터에서 비슷한 것을 본 것 같지 않은가? 바로, @string/hello 이다. 이것은 res/values/strings.xml에 있었다. 마찬가지로 res/values/color.xml 이다. 보는 김에 이것도 살펴보고 지나가자. 그러기 위해 만든 예제이다.



[그림17]

<color name="bg">#1191d0</color> : 이렇게, bg라는 이름으로 #1191d0 라는 컬러값이 정의되어 있는 것을 알 수 있다. 상당히 유용할 것 같다. 배경색을 지정할 때, background="#1191d0" 이렇게 해도 되지만 자주 쓰는 컬러는 왠만하면 이렇게 따로 정의해 두는 것이 나중에 색상을 바꾸기도 편하고 여러모로 좋다. 자, 이제 Layout을 전개하면서 가장 헷갈리는 부분을 설명하겠다. 이건, 결과물을 함께 보면서 이야기하자.

[그림17]

[그림17]에서 보면, 파란색 바탕이 가장 바깥에 있는 LinearLayout이고, 가운데 하얀색 부분이 내부 LinearLayout이다. 내부 LinearLayout의 속성을 살펴보자.

android:orientation="horizontal" : 앞서 보았던 것과 반대로 이번에는 horizontal이다. 즉, 가로로 전개하겠다는 뜻이다.
android:layout_weight="1" : 주목해야 할 부분이다. 바깥의 LinearLayout은 fill_parent였는데, 위아래 "1", "3"이 찍힌 TextView는 글씨가 들어갈 크기만큼 차지하고 나머지 부분은 모두 이 내부 LinearLayout이 차지한 것은, 바로 이 layout_weight="1"이 있기 때문이다. 정의하지 않으면 layout_weight="0"으로 세팅한 것과 같은데, 이는 layout_height에 지정한 크기만큼만 차지하겠다는 뜻이며, 나머지는 layout_weight 이 0이 아닌 차일드뷰끼리 나눠서 차지하게 된다. 매우 유용하므로 꼭 이해해야 한다.
android:gravity="center" : 내부 정렬을 의미한다. 차일드들을 한가운데에 몰아서 정렬하겠다는 뜻이다. left, right, top, bottom, center, center_vertical 등이 가능한데, 오른쪽 가운데 정렬을 하고 싶을 경우에는 "right|center_vertical"과 같이 "|" 연산자로 중첩시켜야 한다.


이제, 내부 레이아웃의 차일드인 2-1, 2-2, 2-3의 주요 속성들을 살펴보자.
먼저, 2-1, 2-2, 2-3 모두 android:layout_weight="1" 속성을 가지고 있으므로, 가로 길이는 정확히 3등분이 됨을 알 수 있다.

2-1의 android:layout_gravity="left|bottom" : 텍스트뷰 2-1의 가로는 3등분하였지만, 세로는 wrap_content로, 자기 자신의 텍스트를 표시할 수 있을 정도의 크기만 차지하는데, 이는 부모의 크기에 비해 많이 남는다. 이럴 때 layout_gravity속성을 사용한다. 그렇다면 무조건 top-left에 표시되게 된다. 여기서는 left|bottom 이므로 왼쪽 아래에 정렬되는데, 사실 가로는 셋이서 3등분하여 차지하였기 때문에 그냥 bottom 으로 설정한 것과 같은 결과를 보인다.
2-2의 gravity="center" : 2-2는 세로도 fill_parent이므로, layout_gravity는 의미가 없으며, 내부의 텍스트에 대해여 gravity="center"를 통하여 텍스트를 가운데에 정렬시켰다. 가로, 세로 크기가 표시할 텍스트에 비해 공간이 많이 남는다. 이럴 때 어디에 정렬시킬지 gravity를 사용하여 정의한다.
2-3의 layout_gravity="center", gravity="right" : 내부 글자는 오른쪽으로 정렬시키면서 뷰 자체는 부모의 가운데에 위치시키도록 하였다.


이와 같이 2-1, 2-2, 2-3의 xml소스와 결과 화면을 비교해 보면, gravity와 layout_gravity를 이해할 수 있을 것이다. 사실, 이게 여러겹으로 중첩이 되다 보면 상당히 헷갈리는데, 예를 들어 parent의 gravity와 child의 layout_gravity가 겹쳐지면 매우 환상적인(@.@) 헷갈리는 결과를 볼 수 있다. 따라서, 본 예제의 xml을 가지고 이렇게 저렇게 중첩시키고, 변형해 보면서 완전히 이해해 둘 것을 당부한다. 내 머리를 믿고, 알 것 같다고 해서 그냥 넘어가면 꼭 실제 개발할 때, 골치아픈 날이 올 것이다. 만들 때 괴롭지 않으려면, 한 대여섯번이라도 바꿔서 결과를 보도록 하자.

2.3.1 LinearLayout 에서, LinearLayout뿐만 아니라 모든 Layout의 공통적인 부분까지 정렬에 관한 중요한 부분을 모두 알아보았다. AbsoluteLayout, FrameLayout, TableLayout 등을 알아볼 때에는 중첩되는 부분은 안다는 가정하에 기술할 것이니, 가장 기본이 되는 LinearLayout을 잘 익히기 바란다.

===================================================================================================================
자, 오늘은 여기까지.. 휴우~ 차이를 확실하게 알아볼 수 있도록 예제를 꾸며 보았습니다. 앞으로도 이런식으로 전개하여, 제가 공식 문서들만 보면서 개발할 때 힘들었던 부분들을 중점적으로 적어 보도록 하겠습니다. 안드로이드를 시작하는 분들에게 도움이 되길 바랍니다. 화이팅!!!

by 나의엘프 | 2010/10/13 11:59 | TokTokLab(모바일개발) | 트랙백 | 덧글(15)
728x90
반응형
:
Posted by mapagilove
2012. 5. 14. 20:43

안드로이드 - 타이머 구현 안드로이드 이야기2012. 5. 14. 20:43

728x90
반응형

안드로이드에서 타이머 구현 하기

개발환경 : JDK 1.6, Android 2.1, window XP

이번에는 안드로이드에서 타이머 구현 방법에 대해 언급할려고 한다.

쓰임세는 다양하다. 게임에서 시계표시를 할수 있고 타이머 관련

구현도 가능하며 시간 간격에 맞게 어떤 작업을 수행하고자

할때도 쓰일것이다. 그래서 한번은 정리할 필요가 있었다.

(1) java 에서 주로 쓰는 방법

안드로이드는 java를 기반으로 하기 때문에 java 에서 사용하는

타이머 구현 방법을 떠올릴 것이다.

Java 에서 구현하는 방법은 여러가지가 있는데 그 첫번째는

스레드를 이용하는 것이다.

추상클래스인 Runnable 를 상속받던지 아니면 Thread 클래스를

생성해서 run 함수를 구현하는데 그 속에 일정한 간격으로

루프를 돌수 있도록 구현 하면 된다.

private final class SwapViews implements Runnable {

private final int mPosition;

public SwapViews(int position) {

mPosition = position;

}

public void run() {

// 기능구현

Thread.sleep(1000);// 1초의 정지

}

}

// 위 클래스 사용

SwapViews swapViews = new SwapView(0);

swapViews.start();

두번째는 Timer 를 이용하는 방법이다.

Timer 클래스는 시간관리를 위해 만들어진 클래스 이므로

이것이 타이머 관리를 위해 더 적절한 방법일지도 모르겠다.

그리고 구현하기도 쉽다. 파라미터로 몇 개의 값만 넘기면

되기 때문이다.

예제를 보게 되면 첫번쨰 파라미터는 작업을 수행할 TimerTask

클래스 객체를 만들어 넣으면 된다. 그속에 run 함수는 필수로

구현 해야되며 run 에 있는 내용이 설정한 시간 간격에 맞게

수행이 되는것이다.

그리고 두번쨰는 run 이 실행되고 종료 시간을 나타낸다.

두번째 파라미터만 넣게 되면 한번으로 끝나지만 세번째 파라미터를

넣게 되면 넣은 값만큼의 간격으로 반복하게 되는것이다.

TimerTask task = new TimerTask(){

public void run() {

try {

mainTime++;

int min = mainTime / 60;

int sec = mainTime % 60;

String strTime = String.format("%s : %s", min, sec);

//Thread.sleep(1000);

} catch (Exception e) {

e.printStackTrace();

}

}

};

Timer mTimer = new Timer();

mTimer.schedule(task, 1000, 1000);

// 3초후 run을 실행하고 종료 timer.schedule(task, 3000);

// 10초후 run을 실행하고 매3초마다 실행 timer.schedule(task, 10000, 3000);

(2) android 에서 Handler 을 이용한 방법

위의 두가지 방법은 java 에서 흔히 구현하는 방법이고 안드로이드에서는

또 다른 방법이있다. 굳이 그 방법을 소개 할려는 것은 위의 방법으로는

내부적으로 수행하는 기능은 구현할지 모르겠지만 화면상에 실시간으로

시간값을 변경해야 한다던지 시계가 움직이는 애니메이션 같은 것을

구현하고자 한다면 아래에 소개한 방법으로 해야 되기 때문이다.

그것은 android.os.Handler 클래스를 이용하는 것인데 백그라운드

메시지를 전달할때도 쓰이는데 이것을 sendEmptyMessageDelayed 함수를

이용해 일정한 간격으로 계속 반복해서 보냄으로서 시계역활을 할수 있게 된다.

구현은 android.os.Handler 클래스 객체를 정의한다.

그리고 필수 함수인 handleMessage 를 구현한다. handlerMessage 함수내부에는

sendEmptyMessageDelayed 함수를 실행해야 한다. 그래야 반복적으로

수행이 될것이다. 이 함수의 두번째 파라미터로 시간이 들어가게 되는데

반복하고자 하는 시간을 넣으면 된다.

mHandler = new Handler(){

public void handleMessage(Message msg){

super.handleMessage(msg);

/** 초시간을 잰다 */

int div = msg.what;

int min = mainTime / 60;

int sec = mainTime % 60;

String strTime = String.format("%02d : %02d", min, sec);

this.sendEmptyMessageDelayed(0, 1000);

mTimeView.setText(strTime);

mTimeView.invalidate();

mainTime++;

}

};

이렇게 정의를 했으니 이것을 사용해야 하는데 처음 시작하고자 하는 곳에

mHandler.sendEmptyMessage(1); 함수를 실행하면 된다. 파라미터로 넘어가는

1 의 값은 핸들의 구분자이다. 여러 개의 기능을 사용하고자 할 때 파라미터

값을 바꾸고 handleMessage 로 넘어온 Message what 변수로 구분하게 된다.

위의 int div = msg.what sendEmptyMessage 의 파라미터로 넘어간 값을

가져오게 되는 것이다.

728x90
반응형
:
Posted by mapagilove
728x90
반응형
// 웹페이지 띄우기 
Uri uri = Uri.parse("http://www.google.com"); 
Intent it  = new Intent(Intent.ACTION_VIEW,uri); 
startActivity(it);

// 구글맵 띄우기 Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity(it);

// 구글 길찾기 띄우기 Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=출발지주소&daddr=도착지주소&hl=ko"); Intent it = new Intent(Intent.ACTION_VIEW,URI); startActivity(it);

// 전화 걸기 Uri uri = Uri.parse("tel:xxxxxx"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it);

Uri uri = Uri.parse("tel.xxxxxx"); Intent it = new Intent(Intent.ACTION_CALL,uri); // 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" />

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

// SMS 발송 Uri uri = Uri.parse("smsto:0800000123"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "The SMS text"); startActivity(it);

// MMS 발송 Uri uri = Uri.parse("content://media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it);

// 이메일 발송 Uri uri = Uri.parse("mailto:xxx@abc.com"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email Client"));

Intent it = new Intent(Intent.ACTION_SEND); String[] tos = {"me@abc.com"}; String[] ccs = {"you@abc.com"}; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email Client"));

// extra 추가하기 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client"));

// 미디어파일 플레이 하기 Intent it = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/song.mp3"); it.setDataAndType(uri, "audio/mp3"); startActivity(it);

Uri uri = Uri.withAppendedPath( MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it);

// 설치 어플 제거 Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it);

// APK파일을 통해 제거하기 Uri uninstallUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

// APK파일 설치 Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

// 음악 파일 재생 Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3"); returnIt = new Intent(Intent.ACTION_VIEW, playUri);

// 첨부파일을 추가하여 메일 보내기 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client"));

// 마켓에서 어플리케이션 검색 Uri uri = Uri.parse("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); // 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다.

// 마켓 어플리케이션 상세 화면 Uri uri = Uri.parse("market://details?id=어플리케이션아이디"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); // 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다.

// 구글 검색 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity(intent);



참고 : http://snipt.net/Martin/tag/android

728x90
반응형
:
Posted by mapagilove
2012. 5. 13. 20:53

안드로이드 - sms전송하기 안드로이드 이야기2012. 5. 13. 20:53

728x90
반응형

이미 안드로이드사이드를 통해 한글 번역판이 공개되어 있지만 저와 같은 초보개발자를 위해 좀 더 간추려 보았습니다.

근데 정리하고나니 큰 차이는 없는듯..ㅋㅋ

해당 소스는 현재 작업중인 저의 4번째 어플 기능중 일부분으로써 이번에 작업하면서 리팩토링하셨다고 보면 됩니다.

일단 AndroidManifest.xml 파일에 "SEND_SMS / RECEIVE_SMS" 2가지 권한을 추가합니다.

* AndroidManifest.xml
- Permissions 을 추가하여 안드로이드에서 해당 기능을 이용할 수 있도록 정의
- Permissions 항목 정의 및 종류는 http://www.androes.com/66 를 참고하세요!!

<?xml version="1.0" encoding="utf-8"?>
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androes.imhere"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">

<!-- Activity Definition -->
<activity android:name=".SmsSender" android:label="SMS Sender">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>

<!-- SMS 수신부분 정의 -->
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

</application>

<uses-sdk android:minSdkVersion="7" />

<!-- SMS 관련 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
< /manifest>


* sms_send.xml
- SMS 보내기 UI 정의

<?xml version="1.0" encoding="utf-8"?>
< LinearLayout android:id="@+id/widget28"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/label1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="받는사람 전화번호"
android:textSize="12sp">
</TextView>
<EditText android:id="@+id/phone" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textSize="18sp"
android:phoneNumber="true">
</EditText>
<TextView android:id="@+id/label2" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="메시지"
android:textSize="12sp">
</TextView>
<EditText android:id="@+id/message" android:layout_width="fill_parent"
android:layout_height="150px" android:gravity="top">
</EditText>
<Button android:id="@+id/button" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="전송">
</Button>
< /LinearLayout>


* SmsSender.java
- Main Activity 파일로 실제 sms UI 및 처리를 담당
- 번호와 메세지가 정상적으로 입력되면 sendSMS(phoneNo, message)를 통해 처리
- 전송과정을 Toast를 통해 모니터링 하고 싶다면 sendSMS() 함수를, 원치 않으면 __sendSMS()를 이용하시면 됩니다.
- 다른 클래스들과는 다르게 SmsManager 클래스를 사용하는데 이클래스는 직접적으로 초기화 하지 않으므로
SmsManger 객체를 얻을수 있는 정적 메소드인 getDefault() 를 호출하여 사용하게 됩니다.
sendTextMessage() 메소드를 이용하여 PendingIntent 와 함께 SMS 메시지를 전송하게 됩니다.
PendingIntent 객체는 메시지를 전송한후에 다른 액티비티를 보여주기 위해서 사용됩니다.
모니터링을 하기위해 PendingIntent 와 함께 두개의 BroadcastReceiver 객체가 사용됩니다.

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);


* SmsSender.java Full Source

package com.androes.imhere;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SmsSender extends Activity {

Button btnSendSMS;
EditText txtPhoneNo;
EditText txtMessage;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms_send);

btnSendSMS = (Button) findViewById(R.id.button);
txtPhoneNo = (EditText) findViewById(R.id.phone);
txtMessage = (EditText) findViewById(R.id.message);

<!-- Send Button Click Event -->
btnSendSMS.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
String phoneNo = txtPhoneNo.getText().toString();
String message = txtMessage.getText().toString();
if (phoneNo.length()>0 && message.length()>0)
sendSMS(phoneNo, message);
else
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
Toast.LENGTH_SHORT).show();
}
});
}

// SMS를 전송하는 과정을 모니터링하고 싶다면
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);

//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
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));

//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
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 sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}

// 모니터링 안하고 발송을 원한다면 아래 함수를 이용
private void __sendSMS(String phoneNumber, String message)
{
PendingIntent pi = PendingIntent.getActivity(this, 0,
new Intent(this, SmsSender.class), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, pi, null);
}

}


* SmsReceiver.java
- SMS 메시지를 받을때 onCreate() 메소드가 호출 될 것입니다.
- SMS 메시지는 번들 객체를 통해 Intent 객체(onReceive() 메소드의 두번째 파라미터)에 포함되어 있습니다.
- 이 메시지는 PDU 포맷으로 Object array 에 저장되어있습니다.
- 이 메시지를 가져오기 위해서는, SmsMessage 클래스로부터 정적 메소드인 createFromPdu()를 사용합니다.
- SMS 메시지는 Toast 클래스를 사용하여 보여집니다.

package com.androes.imhere;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}

}
728x90
반응형
:
Posted by mapagilove
2012. 5. 13. 20:41

안드로이드 - SMS전송 안드로이드 이야기2012. 5. 13. 20:41

728x90
반응형

이미 안드로이드사이드를 통해 한글 번역판이 공개되어 있지만 저와 같은 초보개발자를 위해 좀 더 간추려 보았습니다.

근데 정리하고나니 큰 차이는 없는듯..ㅋㅋ

해당 소스는 현재 작업중인 저의 4번째 어플 기능중 일부분으로써 이번에 작업하면서 리팩토링하셨다고 보면 됩니다.

일단 AndroidManifest.xml 파일에 "SEND_SMS / RECEIVE_SMS" 2가지 권한을 추가합니다.

* AndroidManifest.xml
- Permissions 을 추가하여 안드로이드에서 해당 기능을 이용할 수 있도록 정의
- Permissions 항목 정의 및 종류는 http://www.androes.com/66 를 참고하세요!!

<?xml version="1.0" encoding="utf-8"?>
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androes.imhere"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">

<!-- Activity Definition -->
<activity android:name=".SmsSender" android:label="SMS Sender">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>

<!-- SMS 수신부분 정의 -->
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

</application>

<uses-sdk android:minSdkVersion="7" />

<!-- SMS 관련 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
< /manifest>


* sms_send.xml
- SMS 보내기 UI 정의

<?xml version="1.0" encoding="utf-8"?>
< LinearLayout android:id="@+id/widget28"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/label1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="받는사람 전화번호"
android:textSize="12sp">
</TextView>
<EditText android:id="@+id/phone" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textSize="18sp"
android:phoneNumber="true">
</EditText>
<TextView android:id="@+id/label2" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="메시지"
android:textSize="12sp">
</TextView>
<EditText android:id="@+id/message" android:layout_width="fill_parent"
android:layout_height="150px" android:gravity="top">
</EditText>
<Button android:id="@+id/button" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="전송">
</Button>
< /LinearLayout>


* SmsSender.java
- Main Activity 파일로 실제 sms UI 및 처리를 담당
- 번호와 메세지가 정상적으로 입력되면 sendSMS(phoneNo, message)를 통해 처리
- 전송과정을 Toast를 통해 모니터링 하고 싶다면 sendSMS() 함수를, 원치 않으면 __sendSMS()를 이용하시면 됩니다.
- 다른 클래스들과는 다르게 SmsManager 클래스를 사용하는데 이클래스는 직접적으로 초기화 하지 않으므로
SmsManger 객체를 얻을수 있는 정적 메소드인 getDefault() 를 호출하여 사용하게 됩니다.
sendTextMessage() 메소드를 이용하여 PendingIntent 와 함께 SMS 메시지를 전송하게 됩니다.
PendingIntent 객체는 메시지를 전송한후에 다른 액티비티를 보여주기 위해서 사용됩니다.
모니터링을 하기위해 PendingIntent 와 함께 두개의 BroadcastReceiver 객체가 사용됩니다.

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);

SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);


* SmsSender.java Full Source

package com.androes.imhere;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SmsSender extends Activity {

Button btnSendSMS;
EditText txtPhoneNo;
EditText txtMessage;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms_send);

btnSendSMS = (Button) findViewById(R.id.button);
txtPhoneNo = (EditText) findViewById(R.id.phone);
txtMessage = (EditText) findViewById(R.id.message);

<!-- Send Button Click Event -->
btnSendSMS.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
String phoneNo = txtPhoneNo.getText().toString();
String message = txtMessage.getText().toString();
if (phoneNo.length()>0 && message.length()>0)
sendSMS(phoneNo, message);
else
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
Toast.LENGTH_SHORT).show();
}
});
}

// SMS를 전송하는 과정을 모니터링하고 싶다면
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);

PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);

//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
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));

//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
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 sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
}

// 모니터링 안하고 발송을 원한다면 아래 함수를 이용
private void __sendSMS(String phoneNumber, String message)
{
PendingIntent pi = PendingIntent.getActivity(this, 0,
new Intent(this, SmsSender.class), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, pi, null);
}

}


* SmsReceiver.java
- SMS 메시지를 받을때 onCreate() 메소드가 호출 될 것입니다.
- SMS 메시지는 번들 객체를 통해 Intent 객체(onReceive() 메소드의 두번째 파라미터)에 포함되어 있습니다.
- 이 메시지는 PDU 포맷으로 Object array 에 저장되어있습니다.
- 이 메시지를 가져오기 위해서는, SmsMessage 클래스로부터 정적 메소드인 createFromPdu()를 사용합니다.
- SMS 메시지는 Toast 클래스를 사용하여 보여집니다.

package com.androes.imhere;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SmsReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}

}
728x90
반응형
:
Posted by mapagilove
반응형