2014-04-07 2 views
0

AudioManager가 AudioService 용 API를 제공한다는 것을 알고 있습니다. 그러나, 내가 원하는 것은 AudioService 클래스의 인스턴스를 얻는 것입니다.Android 시스템 서비스 인스턴스 가져 오기 (예 : AudioService)

소스를 연구하면 AudioManager가 원격 서비스에서 클래스를 호출 함을 알 수 있습니다.

AudioManager에 "sService"필드가 있지만 AudioService의 인스턴스가 아니라 대신 BinderInternal, IIRC의 인스턴스입니다. 어떻게 든 AudioService의 인스턴스에 액세스 할 수 있습니까? 또는 보안 문제로 인해 완전히 불가능합니다.

답변

1

AudioService에 대한 참조를 쉽게 얻을 수 있다고 가정합니다.

private static IAudioService getService() 
{ 
    if (sService != null) { 
     return sService; 
    } 
    IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); 
    sService = IAudioService.Stub.asInterface(b); 
    return sService; 
} 

당신은 sService이 IAudioService에 대한 참조가 될 것이라고 볼 수 있습니다 : 당신이 바로 코드의 해당 부분을 놓친 것 같아요. 마찬가지로 응용 프로그램에서 IAudioService를 직접 참조 할 수 있습니다. 그러나, 나는 왜 이것을해야할지 이해하지 못합니다.

+0

그건 내가 원하는 것이 아니에요. IAudioService는 바인더 일 뿐이며 바인더가 필요 없습니다. AudioService 클래스의 객체가 필요합니다 : https://github.com/android/platform_frameworks_base/blob/master/media/java/android/media/AudioService.java –

+0

이 서비스와 상호 작용할 수있는 유일한 방법은 별도의 프로세스에서 실행되고 바인더 만이 서비스에 대한 호출을 마샬링 할 수 있기 때문에 바인더를 통해서만 가능합니다. 따라서 AudioService의 값을 직접 변경하려는 경우에는이 작업을 수행 할 수 없습니다. – Yury

+0

감사합니다. 그것이 바로 내가 생각한 것입니다. 어쩌면 어떻게 든 원시 코드의 일종의 속임수/악용을 통해 할 수 있다고 생각했지만 불가능한 것처럼 보입니다. –