How to Fix the CANNOT_BIND Error While Integrating Amazon Game Circle on Kindle Fire

Has anyone else tried implementing Amazon’s GameCircle into their Kindle Fire app lately well, I did and let me tell you, it didn’t go as smoothly as I’d hoped.

When I was integrating GameCircle to enable leaderboards in my game, I got stuck at the initialization stage. The SDK refused to connect, throwing a CANNOT_BIND error. If you’re facing the same, let me walk you through what happened, what it means, how I fixed it, and how I improved the integration with extra functionality.

The First Code I Use

Here’s the basic setup I initially used inside my onCreate() method:

EnumSet<AmazonGamesFeature> myGameFeatures = EnumSet.of(AmazonGamesFeature.Leaderboards);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

AmazonGamesClient.initialize(getApplication(), new AmazonGamesCallback() {
@Override
public void onServiceReady() {
// Successfully connected
}

@Override
public void onServiceNotReady(AmazonGamesStatus reason) {
switch (reason) {
case CANNOT_BIND:
Log.d(Globals.sApplicationName, "onCreate: CANNOT_BIND");
break;
case CANNOT_AUTHORIZE:
Log.d(Globals.sApplicationName, "onCreate: CANNOT_AUTHORIZE");
break;
case NOT_AUTHORIZED:
Log.d(Globals.sApplicationName, "onCreate: NOT_AUTHORIZED");
break;
case NOT_AUTHENTICATED:
Log.d(Globals.sApplicationName, "onCreate: NOT_AUTHENTICATED");
break;
}
}
}, myGameFeatures);
}

But when I ran this code on my Kindle Fire device, I got these logs:

E/AGC_ServiceProxy: Amazon Games Service is not available  
D/AGC_ServiceProxy: Changing Status from: INITIALIZING to: CANNOT_BIND
E/GC_AmazonGamesClient: Failed to enable softkey button:
android.content.pm.PackageManager$NameNotFoundException: com.amazon.ags.app

What Does the CANNOT_BIND Error

The key part of the error is this:

NameNotFoundException: com.amazon.ags.app

The Amazon Games service (GameCircle) is not installed on the device, or it’s not properly accessible.

GameCircle depends on a separate system app (com.amazon.ags.app) that must be present for the SDK to work. If it’s not there, the SDK tries to bind to a service that doesn’t exist and you get hit with CANNOT_BIND.

How I Solve It

Check If Amazon Games Is Installed

The first thing I did was check whether the Amazon Games app was installed on my device. It wasn’t.

Prompt the User to Install Amazon Games

So I added a prompt that opens the Amazon Appstore to the GameCircle install page if it’s missing.

Updated Code with Fix and Extra Feature

I refactored my code to handle the missing service gracefully and offer more functionality once GameCircle connects.

private void initGameCircle() {
EnumSet<AmazonGamesFeature> features = EnumSet.of(AmazonGamesFeature.Leaderboards);

AmazonGamesClient.initialize(getApplication(), new AmazonGamesCallback() {
@Override
public void onServiceReady() {
Log.d("GameInit", "Amazon GameCircle is ready.");
Toast.makeText(getApplicationContext(), "GameCircle connected!", Toast.LENGTH_SHORT).show();
fetchPlayerAlias(); // extra functionality
}

@Override
public void onServiceNotReady(AmazonGamesStatus reason) {
switch (reason) {
case CANNOT_BIND:
Log.e("GameInit", "CANNOT_BIND: Can't connect to GameCircle service.");
Toast.makeText(getApplicationContext(), "Amazon Games not found. Please install it.", Toast.LENGTH_LONG).show();
redirectToAmazonGamesApp();
break;
case CANNOT_AUTHORIZE:
Log.e("GameInit", "CANNOT_AUTHORIZE: Could not authorize user.");
break;
case NOT_AUTHORIZED:
Log.e("GameInit", "NOT_AUTHORIZED: App is not authorized.");
break;
case NOT_AUTHENTICATED:
Log.e("GameInit", "NOT_AUTHENTICATED: User is not authenticated.");
break;
}
}
}, features);
}

private void redirectToAmazonGamesApp() {
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("amzn://apps/android?p=com.amazon.ags.app"));
startActivity(intent);
} catch (ActivityNotFoundException e) {
Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.amazon.com/gp/mas/dl/android?p=com.amazon.ags.app"));
startActivity(webIntent);
}
}

Bonus Practice Feature I Added

Check if GameCircle is Available

boolean isAvailable = AmazonGamesClient.isServiceAvailable();
Log.d("GameInit", "GameCircle Available: " + isAvailable);

Display Player Alias

private void fetchPlayerAlias() {
AmazonGamesClient.getPlayerClient().getLocalPlayer().setListener(player -> {
Log.d("GameInit", "Logged in as: " + player.getAlias());
});
}

Submit a Leaderboard Score

public void submitScore(long score) {
AmazonGamesClient.getLeaderboardsClient().submitScore("leaderboard_id", score);
}

Final Thoughts

So, was it frustrating at first absolutely theCANNOT_BIND error is cryptic and doesn’t explain that the Amazon Games app is required. But once I diagnosed the issue, built a fallback, and added a few cool features like displaying the player’s alias and submitting scores it turned into a polished GameCircle integration I’m proud of.

Related blog posts