프로그래밍/안드로이드

안드로이드 - USB MOUNT 브로드캐스트 받는법

가카리 2014. 1. 5. 21:35
반응형

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>

수고하세요 ^^
반응형