Frequently Asked Questions (FAQ)


How does "Mobile Applications -> Find New Applications" work?

When "Find New Apps" is selected, the following occurs:
  1. A SDP inquiry is performed against the current Bluetooth-connected device looking for endpoints with a specific service class UUID (This only applies to Android devices)
  2. The discovered entries (each a listening RFCOMM port) are connected from the head unit to the device.
  3. If the application accepts a connection, SYNC Proxy will send the appropriate messages (protocol establishment and RegisterAppInterface RPC) within 20 seconds.
  4. Applications that are successfully registered will appear in the Mobile Applications menu.
Given that, SYNC® will fail to find an application for the following reasons:
  • The application does not have an active SDP record with specific UUID tied to AppLink™.
  • The application has the aforementioned SDP record, but is not accepting connections.
  • The application has the SDP record and accepts the connection, but does not successfully register its interface within 20 seconds.
Note: When an instance of the SyncProxy is created, it will set up the appropriate SDP record and will automatically accept ONE (and only one) connection. When this connection is accepted, the application will be notified via the onProxyOpened method in IProxyListener, after which the application must register its interface within 20 seconds.
Calling the dispose method will tear down the connection and SDP record. Even if the proxy listener has received the onProxyClosed callback, it is necessary to call the dispose or close method.

Can more than one device have active AppLink connections to SYNC® at the same time?

No. Only the device with an active Hands-Free Profile (HFP) connection to SYNC® can have active AppLink connections. SYNC® only permits one device at a time to have an active HFP connection.
There are situations in SYNC® where the user can choose an Advanced Audio Distribution Profile (A2DP) source other than the active HFP connected device, but that does not change the active HFP connection.

What should happen when a user quits the application on the mobile device?

The application should know it is being shut down and issue an UnregisterAppInterface. If the application does not issue UnregisterAppInterface, SYNC® will verbally report "...a problem and has stopped communication with..."

Is it possible to read out the global Media Settings menu via AppLink where one can turn on and off settings like Shuffle, etc.?

At this time, you cannot read the system or media settings via AppLink™. Apps do not have access to any form of persistent information currently, neither system nor application specific.

What is the relationship between AVRCP and AppLink apps?

When AppLink applications are in use with an HMI Level of FULL or LIMITED, Audio/Video Remote Control Profile (AVRCP) events will not be sent from SYNC®. The SubscribeButton mechanism replaces this (and provides additional information about button activity). These should be used to play and pause, as well as seeking forward or backward while your application is connected.
If your application is not being used by AppLink, it will receive AVRCP commands. For example, if the user is in your application and pushes the AUX button, button presses will arrive to your device as AVRCP commands.

When should I pause/resume audio when connected to SYNC?

See question below "How Does HMI Status Work?"

Are there any times the application CANNOT customize SYNC's default prompts?

The application cannot override the initial prompt that occurs when the user presses the PTT button. This prompt will always be "<appName>: Please say a command". This cannot be changed because it is a system pattern that brings consistency to the SYNC® user experience. Most other in-app prompts can be customized as needed.

What VR commands should a media playing application implement?

There is not a canonical list of VR commands, but the most prevalent convention, which has come into use, is to preface all the individual station names with a VR command "Play Station ...." in front of it. For example, "Play Station Cat Stevens" or "Play Station Jazz" or "Play Station My Favorites" or "Play Station Detroit Michigan" or "Play Top Ten"
Beyond this sort of "station identification", it pretty much boils down to a 1:1 mapping of what the user can do while the media stream is underway, so you might introduce VR commands like "Skip", "Hate it", "Love it", "Thumbs up", "Thumbs down" etc. You might also have some list-based activities, like "List my stations", "List my favorites".
We highly recommend that apps have ways for users to discover and bookmark new media sources, not just play the canned lists previously setup before drive time. "Bookmark song" and "find similar" might be commands that could help.
Look at existing SYNC® AppLink™ partner apps from the App Store or Google Play Marketplace for more ideas.

What is the startup delay time for SYNC® to be ready to accept a connection to the device when the head unit is powered on?

After the ignition is turned on, SYNC® should be ready to connect within 4-5 seconds. If the battery is disconnected and then reconnected, SYNC® can take as long as 30 seconds to be ready.

TDK Related

Why isn't the Head Unit "powering up?"

Make sure the TDK switches Power, HS_CAN, and I_CAN are switched on (up or highlighted). Additionally, ensuring the ignition switch is switched on will light up the display.
There are two microcontrollers in the TDK box. They mimic vehicle CAN signals on the medium speed and high speed CAN buses. The HS_CAN and MS_CAN switches control whether those microcontrollers are receiving power. As you can see, many of the radio functions do not work properly if the radio thinks the car is off.

RPC Related

What is the significance of SUCCESS in responses?

SYNC distinguishes 3 different states for responses:
  • success=true, errorcode != SUCCESS
    • The request was processed without any issues. This is regarded as FULL SUCCESS.
  • success=true, errorcode != SUCCESS
    • The request was processed, but some minor issues occurred (one of the issues is reflected in the errorcode). There are a number of errorcodes, which can convey the meaning of what occurred.
  • success=false, (errorcode will never be SUCCESS) 
    • The request could not have been processed because a non-recoverable error occurred. This is regarded as an error and the result code provided will explain what occurred. 
The request could not have been processed because a non-recoverable error occurred. This is regarded as an error and the result code provided will explain what occurred.

Is incrementing the clock handled automatically by the timer?

Yes, updates occur once per second in increments of one second. These update modes support elapsed time and remaining time use cases. You may want to consider calling SetMediaClockTimer regularly with an updated startTime.

How does updateMode PAUSE | RESUME work?

When you call SetMediaClockTimer, you can provide a startTime and specify that it should COUNTUP or COUNTDOWN, or you can provide no startTime and specify that it should PAUSE or RESUME counting at the current value.

Is there a limit to how fast I can send AddCommand requests?

If you need to send a large number of requests to set up your application up when leaving HMI Level of NONE, the following is recommended:
  • Send a small number of the most important requests immediately. These usually include button subscriptions, custom prompts (SetGlobalProperties), and four or five of the most important commands.
  • Using a timer or background thread, send the remaining AddCommand requests in batches of 5 or 10 every second or so.
  • The most AddCommands any application has sent at startup is around 200, which takes about 10-15 seconds. Commands sent first will be available as voice commands first. So, it’s recommended to send more important commands first. It is technically possible to send more than 200 commands, but this will increase loading time for the application and decrease SYNC®’s response time to user input.
SYNC® will disconnect on these conditions:
  • More than 200 RPC requests in 2 seconds.
  • Mobile application sends more than 5 requests within 5 seconds in the HMI Level of NONE.
Since requests, while they are transmitting / receiving responses asynchronously, block the thread of execution, the SyncProxy should be treated like any other high-latency network connection.
As such, blocking the UI thread with the SyncProxy commands may create delays, which invoke the non-responsive termination rule on the mobile platform.

Are the two levels available in the menu display both dynamic?

Yes. You can add commands and submenus to the top-level menu. You can add or delete commands to any of the submenu. There are two entries pre-populated into the top-level menu that cannot be removed: "Exit <app_name>" and, on some displays, "Return" that will bring you back to the previous menu.

Can SYNC® display 150 list items and allow user to "scroll" through them with the tuner?

This is possible, but not preferred for driving conditions. The menu can be scrolled using the tuner or 5-way controllers, so you could add each item as a command and then browse the menu (or submenu). Note that driver distraction rules in the vehicle may limit a user’s ability to browse through the menu. Alternatively, you could create the list of city choices using CreateInteractionChoiceSet and trigger the interaction from the application by calling PerformInteraction.

Can the system call out the first letters of the item list as the user "scrolls" through them?

No. This feature is not available in current versions of AppLink™ nor will it be in the near future. You are not the first developer to request this, so we will add it to our list of potential future features.

Can we have freestyle VR? For example, I want to register for "Play station [anything]", and have the transcription of the [anything] value passed to me for handling...like the way voice command on Android works.

Yes and No. AppLink™ 2.0 added the feature called PerformAudioPassThru, which will give your application the raw audio from the vehicle microphone. Using this API, you will be able to ask the user a question and present information onto the display. It will capture raw audio from the microphone in-vehicle. It will be your application’s responsibility to have the voice transcribed via an off-board API.

When does onProxyClosed get called?

There are two types of disconnection resulting in onProxyClosed:
  • Requested disconnection: through UnregisterAppInterface
  • Forced disconnection: usually from communication failure, protocol error or SYNC® rule violations (e.g. more than 200 requests in 2 seconds, or more than 5 requests in 5 seconds during the HMI Level of NONE)

I am seeing onProxyOpened called twice. My app's registration is being rejected because of a duplicate name. What's going on?

You may have instantiated two instances of the SyncProxy connected to the same listener, or you have the listener registered twice with the SyncProxy. If you have two instances, SYNC® connects to the endpoint advertised by each SyncProxy object, and sets up two connections.
The first registration will succeed, and the second registration will fail because it uses the same application name as the first. You will find it very difficult to manage the app's state if you have two connected proxies sending triggering callbacks on the same listener.
Make sure you only create one instance of the SyncProxy at a time. Dispose of it properly before creating another instance.
This is for non-ALM implementations only.

Why was my Alert rejected?

An Alert will be rejected if it is requested while another Alert is in progress. Speaks may be interrupted by a second Speak or Alert request, but Alerts will not be interrupted for other Speak or Alert requests.

Why do I receive the response info string "A mandatory label in the JSON message is missing: .type..."?

You may be creating your TTSChunks improperly. Each TTSChunk object must contain a "text" and "type" parameter. You might be currently creating the TTSChunk like this:

TTSChunk chunk = new TTSChunk();
chunk.setText("custom help prompt");
You should be creating it like this:

TTSChunk chunk1 = TTSChunkFactory.createChunk(SpeechCapabilities.TEXT, "custom help prompt");
Or you could create the collection of chunks all at once:

Vector chunk2 = TTSChunkFactory.createSimpleTTSChunks("custom help prompt");

HMI Related

What happens to an application when the user selects Exit (or Quit) on that application's menu in SYNC®?

SYNC® will issue a HMI Level of NONE.

What is the expected initialization procedure with respect to HMI Status to set up menus and commands?

The expected procedure with respect to HMIStatus for initialization is that when the application first receives a HMI Level other than NONE, it can and should begin creating resources, such as commands/menus through AddCommands, ChoiceSets, and button subscriptions.
The application should begin creating resources at this time because the user could expect interaction to be possible at any time through PTT or menus (user initiated).


How does the SYNC® head unit trigger an ACTION_ACL_CONNECTED intent?

ACL_CONNECTED and ACL_DISCONNECTED are seen when BT connections to the Android device are established or destroyed. The most common time this is seen is when HFP is connected (i.e. with the [phone icon] button) pressed or disconnected (i.e. switch the KEY OFF and wait 30-60 seconds if needed.)

Can an application that was connected auto re-connect/register to the SyncProxy? It seems that I have to go through the "find SYNC apps" process on the head unit every time I shut the application down even though the device remains connected.

To make sure that your application appears promptly in the Mobile Applications menu, it is recommended to instantiate the SyncProxy during startup (i.e. before the phone connects to SYNC® via HFP). Mobile apps are automatically discovered when the HFP connection is established.