[Android] Lollipop 에서 Call Answer하기
얼마전 개발 App중에 Call을 Answer 해야하는 기능의 App이 있는데..
이게 kikat에서는 잘 돌아갔는데..Lollipop에서는 안돌아 가는가는 문제가 생겼다..
열심히 구글링 구글링했지만...
아직까지 성공한 사람은 없는듯.
이 ㅁ이 전에 사용하던 방법...
new Thread(new Runnable() {
@Override
public void run() {
try {
Runtime.getRuntime().exec("input keyevent " +
Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
} catch (IOException e) {
// Runtime.exec(String) had an I/O problem, try to fall back
String enforcedPerm = "android.permission.CALL_PRIVILEGED";
Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_HEADSETHOOK));
Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,
KeyEvent.KEYCODE_HEADSETHOOK));
mContext.sendOrderedBroadcast(btnDown, enforcedPerm);
mContext.sendOrderedBroadcast(btnUp, enforcedPerm);
}
}
}).start();
이건 안통한다..
WHY??
구글신께서는 아직 해답을 알아내지 못한걸까?아니면 나를 시험에 들게하기위해 못찾게 숨겨놓으신건가?
할수 없이 직접 안되는 원인을 해결하기 위해
reference Lollipop Full source를 뒤졌다..그리고 Kikat과 비교를 해봤다.
그리고 드디어 Lollipop 에서 위의 내용이 안먹는 이유를 찾았다.
기존에는 CallApp에서 저 BR( Intent.ACTION_MEDIA_BUTTON )을 받는 Receiver가 있었다..
그리고 KEYCODE_HEADSETHOOK을 확인 후 자체적으로 Call Answer를 했는데..
아뿔사 Lollipop에서는 이 부분이 사라졌다...
그럼?? Headset hook으로 전화를 못받는건가? 그래서 이어폰 장착후 전화 수신을 해보니 잘되더라..;;
그럼 어디로 간걸까??
GB때 이후로 Phoneapp을 오랜만에 봐서 그런지 소스 위치가 많이 바뀌어서 찾는데 애먹었다.
Telecomm이라는 service로 이동되어있는데..
전처럼 Receiver로 받는게 아니었다.
Lollipop에서 MedaiSession이라는 Service가 생겨났고, 여기서 CallBack을 받아서 처리하고 있었다.
난감... Callback을 훔쳐올수도 없고..ㅡ.ㅡ
그래서 생각해낸 방법은
MediaSession service에서 Key 동작 method를 빌려서 호출하는 방법이다.
Reciever의 응용편이라고 하는게 적당할듯...
그렇게 몇시간 삽질하니 결국은 잘 동작되었다.
관련 소스는 회사에 있으니...추후 업데이트 해야겠다..
늦은 업데이트....아래와 같다.
private MediaSessionManager mSessionManager;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private Method getMethodDispatchMediaKey(){
mSessionManager = (MediaSessionManager) mCtx
.getSystemService(Context.MEDIA_SESSION_SERVICE);
Method m = null;
try {
m = Class.forName(mSessionManager.getClass().getName()).getDeclaredMethod("dispatchMediaKeyEvent", KeyEvent.class);
m.setAccessible(true);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return m;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void acceptCall(){
try {
getMethodDispatchMediaKey().invoke(mSessionManager, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
getMethodDispatchMediaKey().invoke(mSessionManager, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
'Developments > Android' 카테고리의 다른 글
주요 ADB 명령어 모음 (0) | 2014.05.17 |
---|---|
[Android/Tip] Interface (0) | 2013.07.13 |
[Android/Exception] - java.lang.IllegalStateException (0) | 2013.07.13 |
[Android] Parcel (0) | 2013.07.13 |
[Android/Tip] ListView getView 중복 호출 (0) | 2013.05.06 |