반응형
UMS_CONNECTED 류와 MEDIA_MOUNTED 류의 intent들을 사용하여
PC에 USB연결 시, 혹은 폰에 SD Card 탈착 시, Toast 메시지를 띄우는 테스트 프로그램을 작성 중,
그 사용법이 달라, 왜 달라야 하는지 질문드립니다.
먼저, UMS(USB)와 관련된 intent들은 XML Manifest에 Receiver에 intent filter 부분에서 action을 정의해 놓고
이를 BroadcastReceiver를 상속받은 별도의 Class에서 onReceive를 통해 처리해야 올바르게 동작합니다.
그러나 이를 Activity에서 Intent Filter를 동적으로 생성해 Add Action해서 onReceive 할 경우 동작을 하지 않습니다.
반대로 MEDIA(SDCard)와 관련된 intent들은 Activity에서 동적으로 IntentFilter를 생성하여 각 action들을 Add해 주고
이를 onReceive에서 처리해야 올바르게 작동합니다.
만약 UMS처럼 XML Manifest에 정의 후 이를 별도의 Class에서 Receiver를 통해 처리하려고 할 경우 동작을 하지 않습니다.
이 둘의 차이가 어디서 오는지 궁금합니다.
XML Manifest
01.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
manifest
xmlns:android
=
"http://schemas.android.com/apk/res/android"
03.
package
=
"com"
04.
android:versionCode
=
"1"
05.
android:versionName
=
"1.0"
>
06.
<
application
android:icon
=
"@drawable/icon"
android:label
=
"@string/app_name"
>
07.
<
activity
android:name
=
".IntentTest"
08.
android:label
=
"@string/app_name"
>
09.
<
intent-filter
>
10.
<
action
android:name
=
"android.intent.action.MAIN"
/>
11.
<
category
android:name
=
"android.intent.category.LAUNCHER"
/>
12.
</
intent-filter
>
13.
</
activity
>
14.
<
receiver
android:name
=
"com.Receiver"
>
15.
<
intent-filter
>
16.
<
action
android:name
=
"android.intent.action.UMS_CONNECTED"
/>
17.
<
action
android:name
=
"android.intent.action.UMS_DISCONNECTED"
/>
18.
</
intent-filter
>
19.
</
receiver
>
20.
</
application
>
21.
<
uses-sdk
android:minSdkVersion
=
"4"
/>
22.
</
manifest
>
Receiver.java
01.
package
com;
02.
03.
import
android.content.BroadcastReceiver;
04.
import
android.content.Context;
05.
import
android.content.Intent;
06.
import
android.util.Log;
07.
import
android.widget.Toast;
08.
09.
public
class
Receiver
extends
BroadcastReceiver {
10.
public
void
onReceive(Context context, Intent intent) {
11.
if
(intent.getAction().equals(intent.ACTION_UMS_CONNECTED)) {
12.
Toast.makeText(context,
"USB Connected"
, Toast.LENGTH_LONG).show();
13.
}
14.
15.
if
(intent.getAction().equals(intent.ACTION_UMS_DISCONNECTED)) {
16.
Toast.makeText(context,
"USB Disconnected"
, Toast.LENGTH_LONG).show();
17.
}
18.
}
19.
}
IntentTest.java
01.
package
com;
02.
03.
import
android.app.Activity;
04.
import
android.content.BroadcastReceiver;
05.
import
android.content.Context;
06.
import
android.content.Intent;
07.
import
android.content.IntentFilter;
08.
import
android.os.Bundle;
09.
import
android.util.Log;
10.
import
android.widget.Toast;
11.
12.
public
class
IntentTest
extends
Activity {
13.
/** Called when the activity is first created. */
14.
15.
BroadcastReceiver mReceiver1 =
null
;
16.
17.
@Override
18.
public
void
onCreate(Bundle savedInstanceState) {
19.
super
.onCreate(savedInstanceState);
20.
setContentView(R.layout.main);
21.
22.
23.
// install an intent filter to receive SD card related events.
24.
IntentFilter intentFilter1 =
new
IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
25.
intentFilter1.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
26.
intentFilter1.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
27.
intentFilter1.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
28.
intentFilter1.addAction(Intent.ACTION_MEDIA_EJECT);
29.
intentFilter1.addDataScheme(
"file"
);
30.
31.
mReceiver1 =
new
BroadcastReceiver() {
32.
public
void
onReceive(Context context, Intent intent) {
33.
String action = intent.getAction();
34.
if
(action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
35.
Toast.makeText(context,
"SD Card mounted"
, Toast.LENGTH_LONG).show();
36.
37.
}
else
if
(action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) {
38.
Toast.makeText(context,
"SD Card unmounted"
, Toast.LENGTH_LONG).show();
39.
40.
}
else
if
(action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) {
41.
Toast.makeText(context,
"SD Card scanner started"
, Toast.LENGTH_LONG).show();
42.
43.
}
else
if
(action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
44.
Toast.makeText(context,
"SD Card scanner finished"
, Toast.LENGTH_LONG).show();
45.
46.
}
else
if
(action.equals(Intent.ACTION_MEDIA_EJECT)) {
47.
Toast.makeText(context,
"SD Card eject"
, Toast.LENGTH_LONG).show();
48.
49.
}
50.
}
51.
};
52.
registerReceiver(mReceiver1, intentFilter1);
53.
}
54.
}
추가로 궁금한 것은 위와 같은 구조로 어플을 작성하였을시, Receiver 클래스의 Instance 어떤방식으로
현재 실행중이 Activity(IntentTest)의 Method를 호출할 수 있을지 궁금합니다.
감사합니다.
SD카드 삽입/추출 시 intent filter 동작과 관련된 질문입니다.] 게시물에서 "루디"님 답변을 첨부합니다.
코드상에 intentFilter1.addDataScheme(
"file"
); 이 구문을 추가 했듯이
manifest의 인텐트 필터로 아래와 같이 <data android:scheme="file" />을 넣어주셔야 됩니다.
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
수고하세요 ^^
[출처] Android USB MOUNT Source|작성자 행복한훈
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - app widget 버튼이 동작을 안해요 해결법 (0) | 2014.01.11 |
---|---|
안드로이드 - 새로운 다른 앱이 설치될때 app widget 멈출 경우 해결법 (0) | 2014.01.11 |
[Android/안드로이드] 어플리케이션 외장메모리 (sd card )에 설치하는 방법. (0) | 2014.01.08 |
안드로이드 - [번역] 안드로이드 외장 메모리에 설치 가능한 어플리케이션 만들기 (0) | 2014.01.08 |
안드로이드 - SQLite 기본 명령어 정리 (0) | 2014.01.05 |
안드로이드 - 브로드캐스트 리시버 관련 인텐트의 액션들 (0) | 2014.01.05 |
안드로이드 - URI parser에서 분석되는 방법 (0) | 2014.01.05 |
안드로이드 - SD카드 마운트-탈착에 관한 인텐트 (0) | 2014.01.05 |