마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

class.getMethod() 질문입니다.

0 추천

뮤직플레이어부분 공부하고 있는데요

 

MediaButton을 사용 할것이면 시스템에 사용하겠다고 registerMediaButtonEventReceiver메서드를 호출 하는데

현재 공부하고있는 RandomMusicPlayer에서는

 

따로 MediaButtonHelper 클래스를 만들어서

 

 

static {
        initializeStaticCompatMethods();
    }
 
    static Method sMethodRegisterMediaButtonEventReceiver;
    static Method sMethodUnregisterMediaButtonEventReceiver;
 
    static void initializeStaticCompatMethods() {
        try {
            sMethodRegisterMediaButtonEventReceiver = AudioManager.class.getMethod(
                    "registerMediaButtonEventReceiver",
                    new Class[] { ComponentName.class });
            sMethodUnregisterMediaButtonEventReceiver = AudioManager.class.getMethod(
                    "unregisterMediaButtonEventReceiver",
                    new Class[] { ComponentName.class });
        } catch (NoSuchMethodException e) {
            // Silently fail when running on an OS before API level 8.
        }
    }
 
    public static void registerMediaButtonEventReceiverCompat(AudioManager audioManager,
            ComponentName receiver) {
        if (sMethodRegisterMediaButtonEventReceiver == null)
            return;
 
        try {
            sMethodRegisterMediaButtonEventReceiver.invoke(audioManager, receiver);
        } catch (InvocationTargetException e) {
            // Unpack original exception when possible
            Throwable cause = e.getCause();
            if (cause instanceof RuntimeException) {
                throw (RuntimeException) cause;
            } else if (cause instanceof Error) {
                throw (Error) cause;
            } else {
                // Unexpected checked exception; wrap and re-throw
                throw new RuntimeException(e);
            }
        } catch (IllegalAccessException e) {
            Log.e(TAG, "IllegalAccessException invoking registerMediaButtonEventReceiver.");
            e.printStackTrace();
        }
    }

이런식으로 구현해서 서비스 클래스에서 

 

 

MediaButtonHelper.registerMediaButtonEventReceiverCompat(
                    mAudioManager, mMediaButtonReceiverComponent); 
 
이런식으로 호출하는데
 
안드로이드 기본 뮤직플레이어에서는 그냥 서비스 클래스에서 바로
 
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        mAudioManager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(),
                MediaButtonIntentReceiver.class.getName()));
 
이런식으로 등록을 하더라구요...
둘의 차이가 뭔가요??
 
그래서 class.getMethod 관련해서 자료를 찾아봐도 영 알아듣기가 힘듭니다...
 
조언 부탁 드려요~ㅠㅜ

 

탭송 (870 포인트) 님이 2013년 3월 27일 질문

1개의 답변

0 추천
 
채택된 답변

AudioManager의 registerMediaButtonEventReceiver, unregisterMediaButtonEventReceiver는

API level 8 이후에 추가된 함수 입니다.

그래서 안드로이드 기본 유직플레이어처럼만 구현하면 8버전 이전 단말에서는 실행될 수 없기때문에

class.getMethod로 해당 함수를 호출 하면서 try-catch로 묶어서

해당 함수가 없는 경우에 대한 처리를 하고 있는겁니다.

b22n (22,940 포인트) 님이 2013년 3월 28일 답변
탭송님이 2013년 3월 28일 채택됨
오호 8이전의 단말기에 설치될 경우를 대비해서 저렇게 하는거군요

감사합니다^^
...