Aliexpress에서 안드로이드 해드유닛을 구입하게 될 경우 아래 이미지와 같은 작은 스피커를 제공하는 제품들이 있습니다. 주로 아우디, 벤츠, 재규어, 랜드로버가 해당 대상으로 보입니다.
이 스피커의 정식 명칭은 '외부 스피커'로 네비게이션, 음성인식 등에서의 소리를 내보내는 역할을 합니다. 문제는 이 스피커가 동작할 때 마다 앰프가 동작하는 소리가 들리며 (딸깍 딸깍) 음질 또한 조악합니다. 안내 음성도 앞 뒤가 짤리고요. 일부 포럼에서는 이 스피커를 교체하고, 앰프를 튜닝한 사례도 봤습니다. 그런데 별 차이가 없다더군요. (선배님들이 정말 많은 노력을 하셨더군요)
모든 소리가 이 스피커에서 나오지 않더군요. 시스템에서 지정한 네비게이션 만 이 스피커에서 소리가 나오는거 같았습니다. 가정을 세워봅니다. "기본 네비가 아니면 저 스피커에 소리가 나오지 않는다." 티맵을 설치하고, 기본 네비를 구글 맵스로 변경해봤습니다. 그리고 티맵을 직접 실행해 봅니다. 소리가 저 스피커에서 나오더군요. 애이. 포기해야지 했는데.
티맵의 버그(제자리 뺑뺑이) 때문에 카카오네비를 설치했습니다. 그런데 이건 자동차 스피커에서 소리가 나오더군요? 하지만 기본 네비게이션 설정 앱에서는 선택할 수 없어 매번 앱스로 들어가 실행해야 하는 불편함이 있었습니다. 그래서 다른 조건이 있을거라 생각하고, 이들의 런처를 추출해 디컴파일 해 봤습니다.
그 결과 아래 제어문에서 걸러지는 APP ID를 갖고 있는 앱들은 위 스피커에서 소리가 나오는것을 확인했습니다. 우리나라에 해당되는 부분이 보입니다. com.skt.tmap.ku 그리고, 전역으로 해당되는 map/Map/navi 가 보이네요. 이 APP ID에 해당되지 않는 앱을 설치하면 위 스피커에서 소리가 나오지 않고, 자동차 스피커에서 소리가 나옵니다.
public static boolean isNavgation(String str) { boolean v0 = ((str.equals("com.google.android.apps.maps")) || (str.equals("com.autonavi.amapauto")) || (str.contains("com.baidu.BaiduMap")) || (str.contains("navi")) || (str.contains("com.papago")) || (str.contains("com.waze")) || (str.contains("com.sygic")) || (str.contains("navi")) || (str.contains("com.cyberon")) || (str.contains("com.kingwaytek")) || (str.equals("com.nng.igo.primong.hun10th")) || (str.contains(".igo")) || (str.contains("com.skt.tmap.ku")) || (str.contains("map")) || (str.contains("Map")) || (str.contains("cld.kld")) || (str.contains("ru.yandex.yandexnavi")) || (str.contains("com.loco")) || (str.contains("com.mireo")) || (str.contains("com.nng.igoprimoisrael.javaclient") ) || (str.contains("com.ivolk.StrelkaGPS")) || (str.contains("cityguide.probki.net"))) && !str.contains(".mapgoo") && !str.contains(".amaplocation") && !str.contains("map.location") && !str.contains("com.android.simappdialog") ? true : false; return v0; }
이 부분을 중국 엔지니어에게 손봐달라고 하니, 전역 설정 부분이라 건드리기 어렵다는 회신을 받았습니다. 스피커만 바이패스 하면 되는데 말입니다. 런처가 디컴파일이 완벽하게 되지 않아 다시 컴파일 할 때 문제가 생기더군요. 그래서 직접 수정은 실패! (췟)
한번 위 조건에 해당되지 않는 APP ID를 갖고 있는 네비를 찾았습니다. 다행이 티맵 스토어 버전을 제외하면 모두 위 조건에 해당되지 않습니다.
티맵 : com.skt.skaf.l001mtm091 (플레이 스토어 버전이 아닙니다)
맵피 : com.mnsoft.mappyobn
카카오네비 : com.locnall.KimGiSa
이들을 설치해 보면 실제 저 작은 스피커에서 소리가 나오지 않음을 확인 하게 됩니다. 그럼 잘 해결 됐는가? 그렇지 않습니다. 네비게이션 선택 옵션에서 선택된 네비만 UI 의 네비게이션 버튼과 맵핑 됩니다. 즉, 아래 화면에서 선택이 안된다면 앱스로 가서 네비게이션을 직접 실행해야 하는 불편함이 있습니다.
그래서 Fake App을 만들기로 결정합니다. 원리는 간단합니다. com.skt.tmap.ku 의 APP ID의 앱을 만듭니다. 안드로이드 시스템은 네베게이션이 설치되어 있다고 생각합니다. 이 앱을 실행하면 내가 원하는 네비게이션 앱으로 연결해 주면 됩니다. 코드 예제는 다음과 같습니다. 아주 간단해요.
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.mnsoft.mappyobn"); if (launchIntent != null) { startActivity(launchIntent);//null pointer check in case package name was not found } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1);
위 예제는 맵피를 실행하는 예제 화면 입니다. 맵피가 바로 실행되는 것 처럼 보이지만 실제로는 Fake App이 실행되고 이 앱이 맵피를 다시 부르는 구조 입니다. Fake App이 너무 가볍기 때문에 눈에 잘 띄이지 않는거구요 ^^
저 작은 스피커에서 소리가 나왔을땐 어찌나 답답하던지 ; 아래가 코드 전문 입니다. com.autonavi.amapauto 로 해서 만들었습니다.
package com.autonavi.amapauto; import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.mnsoft.mappyobn"); if (launchIntent != null) { startActivity(launchIntent); } else { // 앱이 없다. 걍 종료 } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } }
이걸 응용하면 중국 안드로이드 헤드유닛이 공통적으로 사용하는 EasyConn 대신 Carlinkit를 불러올 수 있더군요. (지금은 이것도 바꿔 놨습니다)
좋아요 ^^