/AndroidAutoIdrive

Implementations of some Android Auto features as unofficial IDrive apps

Primary LanguageKotlinMIT LicenseMIT

Android Auto for IDrive

Build Status Code Coverage Crowdin Release Download Download Counter Gitter Buy Me A Coffee MIT Licensed

The BMW/Mini IDrive NBT does not offer native Android Auto integration, but does provide a very powerful Connected Apps convergence option with tight integration points into the car. This project is an effort to implement most of the features of Android Auto as unofficial BMW/Mini Connected Apps.

By relying on the Connected Apps technology, this app greatly extends the functionality of the car without any modifications or hacks. Any MY2014 or newer BMW or Mini equipped with NBT or NBT Evo and the "BMW Apps (6NR)" feature, an active BMW ConnectedDrive subscription, or the "Mini Connected (SA6NM)" option should be compatible.

App List
Gallery

Overview

As part of the Connected Apps feature, when the phone connects to the car over USB (or Bluetooth in 2017+ models), enabled phone apps can show a special dashboard-optimized interface in the car.

Android Auto for IDrive, combined with the safety benefits of the tactile IDrive controller, builds on this protocol to allow the user to interact with their incoming notifications and control their phone's music while the phone is safely tucked away.

Getting Started

This app requires that the BMW Connected or Mini Connected app for your car is installed and can successfully add the Connected and Calendar entries to your car's Connected Apps menu. The new My BMW app seems to interfere with BMW Connected and is not supported.

Download the APK of the latest stable release from the Releases page. Choose the one that says "sentry" to automatically upload crash reports, or choose "nonalytics" otherwise. After starting, the app should detect the Connected app and start waiting for the car connection.

Also consider trying out the nightly build! It has the latest features and is a preview of the next release, so please consider installing the Sentry build to automatically report crashes. The nonalytics build is available too. Some of the new features include:

  • Brand new simpler phone UI with clearer setup instructions
  • Supports logging in as Spotify to set the global coverart in ID5+
  • Adds Spotify browse and playlist coverart, as well as searching Spotify
  • Reads out notifications, and adds popup and statusbar support in ID5+
  • Supports replying to notifications
  • Starts car navigation to handle certain phone navigation buttons
  • Supports the new MyBMW app

Check out the FAQ if you run into problems.

User Guide

Phone Connection

After connecting the phone to the car, the official Connected app should show this car icon in the status bar. When this icon appears, this app should connect and add its functionality to the car.

See this guide for tips on improving the connection reliability of the Connected app.

Phone App List

After all the apps are connected, a bunch of new entries will show up in the car's Connected menu. Besides the official Calendar and Connected apps, there should be a new Audioplayer icon and a book icon with no label. This book icon is the Notifications app, if enabled.

Music App List

Several new entries will be added to the Media section of the control screen. The Audioplayer icon is the one with the main functionality, while the other displayed apps above the Audioplayer are quick shortcuts to switch playback to the respective apps. This screenshot also shows the official Spotify app at the bottom of the list.

Implemented Features

Integration Points

Besides showing a self-contained remote UI, the IDrive system offers many exciting integration points. Here are a few that this project supports:

  • The UI widgets automatically take on the respective theme to fit the car
  • The Assistants, Map View, Notification List, and Music Playback screens can be assigned to the physical shortcut buttons in the dashboard
  • New notifications trigger a statusbar icon in IDrive version 4
  • New notifications can trigger a popup in IDrive version 4
  • New notification popups can be disabled if a passenger is detected in the seat
  • The currently-playing app is displayed along the top of the IDrive screen
  • The currently-playing song title is shown in the Multimedia side panel of the IDrive
  • On a MY2017+ car supporting Bluetooth Apps, audio focus will be enabled which grants the following extra features:
    • The Media shortcut button opens this app when it is in control of the music
    • Automatically resumes playback when reconnecting to the car
    • Playback pauses when pushing the mute button or during calls
    • The physical back/next buttons can be held down to seek within a track or pressed to skip tracks
    • The steering wheel controls can skip tracks from the instrument cluster
    • Enqueued songs can be scrolled in the instrument cluster, depending on app support

Limitations

This project replicates some of the features of Android Auto using the IDrive interface, using the same APIs that Android Auto uses to talk to the music apps. It cannot currently provide more advanced Android Auto features, such as:

  • Integration with the car's Voice Assistant button
  • Screen-casting of arbitrary phone apps to the car (Google Maps, Waze, or any other apps)
  • Displaying the original Android Auto interface at all

Due to the unofficial reverse-engineered nature of this project, it has some limitations:

  • The main menu entries' icons and text can't be altered, and so do not look exactly correct
  • The individual music source icons sometimes don't open the Audioplayer interface in ID4, but they do switch the active music source
  • Android Oreo disabled Android Open Accessory Protocol 2 audio output, which is required to play audio over the app's USB connection in model years 2014-2017. Please listen over Bluetooth audio and use this app as a control interface.
  • Some Android Auto music apps enforce a list of allowed client apps, preventing this app from launching them or browsing their libraries. However, once they are running, they can be controlled. For example, these popular music apps can not be launched, they must be started manually:
    • Amazon Music
    • Audible
    • Bandcamp
    • CloudPlayer
    • Deezer
    • doubleTwist
    • Google Play Music
    • iHeartAuto
    • TuneIn Radio
    • Pandora
    • Scribd
    • Smart Audiobook Player
    • YouTube Music
  • Recent versions of Spotify block the standard Android MediaBrowserService connection, which is needed for the Search feature. Downgrading to version 8.4.96.953 will enable this feature.

Requirements

To communicate to the car, this project relies on the proxy connection that is created by the main Connected app on the phone. Both of the brand-specific Connected and the Connected Classic apps have been tested as compatible for this purpose, but the new Connected app is more reliable. My BMW and the new MINI app are not compatible.

Additionally, the car proposes a security challenge during the connection process, and this project asks the Security Service provided by the Connected apps for the correct response. The normal Connected app should be enough for this, but it might be necessary to also install the Connected Classic app to provide the Security Service. If this is needed, it is not recommended to install both the Connected and Connected Classic apps of the same brand, they may fight over the connection to the car and undefined results may happen. Instead, install the Connected Classic app of the other brand that is not intended to be used regularly, for example using BMW Connected and Mini Connected Classic.

Build Instructions

  • (Optional) Add a Google Maps API key to ~/.gradle/gradle.properties as a property named AndroidAutoIdrive_GmapsApiKey.
    • No spaces or quotes are needed around the property value: AndroidAutoIdrive_GmapsApiKey=AIza
    • This key should have access to Maps SDK for Android, Places API, and Directions API.
    • Billing is needed for the Places API to return search results.
  • (Optional) Add a Spotify API Client ID to ~/.gradle/gradle.properties as a property named AndroidAutoIdrive_SpotifyApiKey.
    • The client secret is not needed, and no spaces or quotes are needed around the property value: AndroidAutoIdrive_SpotifyApiKey=36b6...
    • It needs the Redirect URI set to me.hufman.androidautoidrive://spotify_callback
    • It may also need the package fingerprint added, follow these instructions to configure it
  • (Optional) Add a Sentry DSN to ~/.gradle/gradle.properties as a property named AndroidAutoIdrive_SentryDsn to capture crash reports.
    • No spaces or quotes are needed around the DSN: AndroidAutoIdrive_SentryDsn=https://e40...@sentry.io/0123...
  • After downloading the source code, follow the instructions in external/README.md to prepare the needed APK files from official apps.
  • Android Studio makes it easy to build this project:
    • File > New > Project From Version Control > Git
    • Use the Build Variants panel to change which version is built
    • Build > Make Project to build the APK artifacts
    • Plug in your phone and click Run
  • Commandline builds should work too:
    • Make sure Android SDK Build Tools version 28 is installed
    • git clone https://github.com/hufman/AndroidAutoIdrive.git && cd AndroidAutoIdrive
    • git submodule init && git submodule update
    • ./gradlew assembleNomapNonalyticsDebug This step will fail without the Build Tools installed

The built APKs should be found in app/build/outputs/apk/*/*/*.apk

Privacy

This project contains no advertising or user tracking, and is developed entirely for fun and to enhance the usefulness of the BMW/Mini infotainment system.

The app uses the Internet Permission to make a TCP connection to the car, which is reachable through a localhost socket on the main Connected app. Additionally, some cover art and incoming picture notifications (such as from Hangouts) may be fetched from Internet URLs. No other Internet access is required for the app's functionality.

The analytics-enabled version automatically reports some information to Sentry to assist with development and debugging. Besides any rare and unfortunate crashes, the app reports any installed music apps and the capabilities each app provides, as well as the model and capabilities of any connected car.

Each release provides both an analytics-enabled and analytics-disabled option.

Example Analytics Data

Music App

{
  "appId": "github.daneren2005.dsub",
  "appName": "DSub",
  "controllable": "false",
  "connectable": "true",
  "browseable": "true",
  "searchable": "false",
  "playsearchable": "false"
}

Car Connection

{
  "a4axl": "true",
  "alignment_right": "true",
  "hmi_display_height": "480",
  "hmi_display_width": "1280",
  "hmi_role": "HU",
  "hmi_type": "MINI ID5",
  "hmi_version": "EntryEvo_ID5_1903_Release ID5_1903-490-1837K Build 47 - Rev:203015 2018-11-14 08:39:42",
  "inbox": "true",
  "map": "true",
  "navi": "true",
  "pia": "true",
  "speech2text": "true",
  "speedlock": "true",
  "touch_command": "false",
  "tts": "true",
  "vehicle_country": "US",
  "vehicle_productiondate": "03.00",
  "vehicle_type": "F56",
  "voice": "false"
}