Google analytics problems after play services upgrade to 7.5 - android

After we upgraded Google Play Services to:
compile 'com.google.android.gms:play-services-base:7.5.0'
compile 'com.google.android.gms:play-services-analytics:7.5.0'
Note that docs say we have to use play-services-analytics:7.3.0,
however since we are using play services 7.5, we have used the configurations stated at the start.
The app compiles fine but we've noticed our Google Analytics no longer send to our server. And also whenever we make call Tracker.send() the following lines will appear in the error log per event:
06-30 10:51:43.188 13623-13752/com.fairfax.domain E/SQLiteLog﹕ (1032) statement aborts at 31: [INSERT OR REPLACE INTO properties(cid,app_uid,hits_count,adid,params,tid) VALUES (?,?,?,?,?,?)]
06-30 10:51:43.198 13623-13752/com.fairfax.domain E/GAv4﹕ Error storing a property: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
06-30 10:51:44.348 13623-13752/com.fairfax.domain E/SQLiteLog﹕ (1032) statement aborts at 31: [INSERT OR REPLACE INTO properties(cid,app_uid,hits_count,adid,params,tid) VALUES (?,?,?,?,?,?)]
06-30 10:51:44.358 13623-13752/com.fairfax.domain E/GAv4﹕ Error storing a property: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
06-3
We proxied the traffic and saw that indeed it did not seem to send the GA events.
As a workaround for now we made the change to manual dispatching:
analytics.setLocalDispatchPeriod(0);
and manually calling:
GoogleAnalytics.getInstance(appContext).dispatchLocalHits();
But of course this is less than ideal, how would we let Google Analytics Handle storing/sending based on configurations and not get the errors?
UPD: It is probably worth mentioning that we're upgrading from play services 6.5.
UPD2: We proxied network again and now it appears that GA does send /batch request after a while. Those SQLite errors are still present though:
8273-8329/com.fairfax.domain E/SQLiteLog﹕ (1032) statement aborts at 29: [INSERT OR REPLACE INTO properties(cid,app_uid,hits_count,adid,params,tid) VALUES (?,?,?,?,?,?)]

Is SQLiteLog a class you wrote or Google Analytics provides? If you're using a DBHelper you could try getWritableDatabase() on it.
Do you have any long running services that might be using the old database, or have some lock in it?
You could also try bumping your build number on the app, and looking into a SQL migration.

Related

Room database Error: IllegalStateException: Room cannot verify

I have been getting this error as of lately while using room database. It tells me to upgrader the room version, but when I do this I get another error.
java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
This is what I get when changing the database version number from: version = 1 -> version = 2.
java.lang.IllegalStateException: A migration from 1 to 2 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
How can I solve this ?

java.io.IOException: FIS_AUTH_ERROR in Android Firebase

I'm getting following error with Firebase services.
E/FirebaseInstanceId: Topic sync or token retrieval failed on hard failure exceptions: FIS_AUTH_ERROR. Won't retry the operation.
D/AndroidRuntime: Shutting down VM
com.google.android.gms.tasks.RuntimeExecutionException: java.io.IOException: FIS_AUTH_ERROR
at com.google.android.gms.tasks.zzu.getResult(Unknown Source:15)
at com.myApp.MainActivity$2.onComplete(MainActivity.java:349)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7804)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
Caused by: java.io.IOException: FIS_AUTH_ERROR
at com.google.firebase.iid.zzs.zza(com.google.firebase:firebase-iid##20.1.0:82)
at com.google.firebase.iid.zzs.zza(com.google.firebase:firebase-iid##20.1.0:96)
at com.google.firebase.iid.zzx.then(com.google.firebase:firebase-iid##20.1.0:4)
at com.google.android.gms.tasks.zzd.run(Unknown Source:5)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Here is the part of the code where crash occurs:
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
#Override
public void onComplete(#NonNull Task<InstanceIdResult> task) {
if (task.getResult() != null && task.isSuccessful()) {
// Get new Instance ID token
firebaseToken = task.getResult().getToken();
prefs.edit().putString("firebaseToken", firebaseToken).apply();
registerToken();
}
}
});
The error occurs in onComplete. Here is firebase dependencies which I use:
// FIREBASE
implementation 'com.google.firebase:firebase-analytics:17.2.3'
implementation 'com.google.firebase:firebase-messaging:20.1.2'
implementation 'com.google.firebase:firebase-appindexing:19.1.0'
implementation 'com.google.firebase:firebase-ads:19.0.0'
implementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta01'
I found this issue on Github related with my crash but there is no conclusive solution at all. Does anybody encountered this kind of issue? Thanks in advance.
Note: I don't use Flutter however the error occurs without flutter too. Device is Samsung A51 with Android 10.
Note 2: Firebase removed firebase-core. Problem can be related with that.
All you have to do is just make the API key you are using has permission to the following APIs:
Firebase Installations API
Firebase Cloud Messaging API
FCM Registration API
Cloud Messaging
You can change the restrictions from your google cloud -> APIs & Services -> Credentials
All of a sudden the same error (FIS_AUTH_ERROR) appeared in one of my apps, where I use Firebase Cloud Messaging. Everything was working without any issues, and suddenly the app was not able to get the app/device token with getToken(). After hours of research I discovered something, which solved the problem for me. I decided to check the values in the file google-services.json to see if they match the corresponding parameters in the Firebase Console at the settings of my project. First I downloaded a brand new google-services.json, which I compared with the one I already had in my app's folder, and they both were simply the same without any difference. In the Firebase Console I was checking one by one the Project ID, the Project number, etc. When I got to the Web API Key its value looked quite similar to api_key from google-services.json, but still both values were different. Then I decided to edit the file, and in the place of api_key I've put the value from Web API Key. Then I've cleaned the project and rebuilt, and afterwards everything again started working just perfectly.
Update 08.2022
After more than a year later I can confirm that the above is still valid. Though I decided to check the key restrictions in Google Cloud Console following the advise of Ambrose Bako. Then I discovered that the mess with the different keys available in my account is even bigger.
The last key (Maps API key) is the one which gets into the Firebase file google-services.json. I've downloaded a fresh copy, and it is still the same, no change since then. Obviously this key has pretty tight restrictions, but it is intended to be used somewhere else (google maps flutter), and it works properly on its place.
Now guess what! The key which gets into Firebase as "Web API Key" is the first one - Android key (auto created by Firebase). I don't understand too much how different stuff is organized between Firebase and Google Cloud Console, but considering the name of the key, I though that the second one - Browser key (auto created by Firebase) - should find its place as "Web API Key" in Firebase.
Anyway in my particular case the Web API Key from Firebase worked properly in my google-services.json because it was actually the Android key which I needed. I'm writing all this because in some other cases it might not be exactly the same. So, if needed, one should look inside Google Cloud Console > APIs & Services > Credentials > API Keys, and take from there the right Android key (click on "SHOW KEY" on the right), then place it into the Firebase file google-services.json. Hope this can help.
Temporary but working solution. Just downgrade com.google.firebase:firebase-messaging:20.1.2 to com.google.firebase:firebase-messaging:20.1.0. Apperantly, there is some kind of bug in 20.1.1 and 20.1.2 versions. App doesn't crash anymore.
UPDATE (11.04.2020): I tested in com.google.firebase:firebase-messaging:20.1.5 and apperantly problem has been fixed.
UPDATE (26.04.2020):
I found a permanent solution. First upgrade firebase dependencies to com.google.firebase:firebase-messaging:20.1.6. After that download google-services.json from firebase. Replace it with the current one. After that build > clean project otherwise you can get
API key expired. Please renew the API key
error. There is no problem with the key, it's some kind of bug of Google. If you completed these steps, add following code into onCreate of your top Application class which is you declared in manifest at the application tag.
FirebaseOptions options = new FirebaseOptions.Builder()
.setApplicationId("APP ID") // Required for Analytics.
.setProjectId("PROJECT ID") // Required for Firebase Installations.
.setApiKey("GOOGLE API KEY") // Required for Auth.
.build();
FirebaseApp.initializeApp(this, options, "FIREBASE APP NAME");
You can found your app id in the firebase > project settings. Also if you're debugging, don't forget to add the debug SHA-256 key to firebase.
Now I don't get crash anymore. Firebase services work perfectly.
If you have recently changed google-services.json file, you need to remove build file of your project and rebuild the project.
update: I got this error when I was testing my app in debug mode. In release version it was solved and worked correctly.
https://stacklearn.ir/course/android-introductory-training-course
The FIS_AUTH_ERROR means Authentication for Firebase installation sdk has failed. If you use a service that depends on Firebase installation sdk (or FIS), you need a valid authorization.
According to Firebase cloud messaging v20.1.1 release note:
Apps that use the Firebase auto-initialization process and the Gradle plugin to convert google-services.json into resources are unaffected. However, apps that create their own FirebaseOptions instances must provide a valid API key, Firebase project ID, and application ID.
So if you (or a service using fcm added by you) uses FirebaseOptions, it has to pass some additional values for the FIS.
Solutions
Downgrade to v20.1.0 of firebase-messaging (Not recommended though. It's like running from the problem)
Provide additional keys if you use FirebaseOptions
I found a solution to this problem
1) in Android Studio , in left panel "Project" swich Android view to Project view
2) copy file google-services.json NOT into "app" folder (like it says in instruction) ... but copy this file into the upper root folder
and it will work
In addition to Steeve's answer, the Firebase Messaging credentials should be restricted to these 3 Selected APIs:
Firebase Cloud Messaging API
Firebase Installations API
FCM Registration API
Go to the credentials on Google Cloud Console (APIs & Services -> Credentials), Click on the relevant key and select the 3 APIs above.
If you restrict usage to your Android apps, make sure to add SHA-1 fingerprints for your specific app. If you use internal app sharing, make sure to also add the SHA-1 of the internal app bundle as described here.
The correct fix is to add "Firebase Installations API" to the restrictions of your Google API Key (see google-services.json).
In your Google Cloud console, it's in APIs & Services, then Credentials. Open the API Key is look at "Restrictions".
No need to recompile.
This is for sure, (if you finished all configuration) then version of firebase messaging is not compatible with other dependencies.
you can check dependencies here, my solution was to downgrade from implementation 'com.google.firebase:firebase-messaging:20.1.3' to implementation 'com.google.firebase:firebase-messaging:20.1.0'
#mahdi-malv, #ambrose-bako, #steeve are right.
Firebase Android SDK updates on February 27 (M65) and afterwards introduced a new infrastructure service, the Firebase Installations SDK which comes with a dependency on the Firebase Installations API.
Firebase Installations requires valid Firebase options API key, project ID, and application ID (a.k.a. "appId") in order to successfully communicate with Firebase servers.
Errors during communication with the Firebase Installations API indicate invalid Firebase options or misconfigurations regarding API keys.
To mitigate the issue
make sure that your application is using valid Firebase options from the latest google-services.json file from your Firebase console:
Firebase options: instructions and background.
If you use API restrictions, make sure that the API key used by your application is white-listed for the Firebase Installations API (and for your application):
API restrictions: instructions and background
Regarding Application restrictions: Either set the radio button to None or make sure that your app is white-listed (with the correct SHA-1 certificate).
For details, please visit:
https://firebase.google.com/support/privacy/init-options
Just in case, renamed the package name, deleted google-services.json,
and going into firebase checked firebase-database (read\write).
Then deleted the old package and its hash from the firebase project settings,
after adding a new package and hash, received a new google-services.json, after that everything worked
I think the error is that a package was specified in firebase but there was no hash
Hope this helps someone:
In my situation, I used self-signed ca.
So I need to use network-security-config.xml
After huge try and error, finally I add system directory in trust-anchors like below, FIS_AUTH_ERROR is gone and Firebase worked.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" /> <!-- for Firebase -->
<certificates src="user" /> <!-- for tooling. Ex:Charles -->
<certificates src="#raw/ca_1"/> <!-- my self-signed ca-->
</trust-anchors>
</base-config>
</network-security-config>
For me, it just was:
build > clean project
Because I was changing google-services.json file many times.
Maybe a bit late, but hopefully this info may help someone out there.
I had the problem too with firebase-messaging:21.0.1.
I followed all the instructions given in this thread, but nothing helped.
What was curious is that before the error E/FirebaseInstanceId: Topic sync or token retrieval failed on hard failure exceptions: FIS_AUTH_ERROR. Won't retry the operation
appeared the logcat showed Firebase Installations Service is unavailable.
After some investigation the solution was as follows.
I used a self-signed certificate on my dev-server and trusted it in my app as described here: https://developer.android.com/training/articles/security-ssl.html#CommonProblems
Somehow this broke the whole SSL handshake stuff in android and I couldn't authenticate to the Firebase Installations Service anymore.
After removing this and using plain http for my dev environment everything works again like a charm. (of course, for my prod server I'm using a ROOT trusted certificate, so no problems here)
I had fight with this exception almost 2 days, and now solved.
First make sure the restrictions API as mentioned Ambrose's answer
add ALL SHA-1 on firebase console and cloud console credential,
in my case I need 4 SHA-1, from:
debug keystore
release keystore
firebase distribution (if using .AAB )
release certified from playstore's signing like this:
I think add the last SHA-1 to cloud console make my app works nicely.
Hope this answer will help other.
Happy code!
I had the same problem when I redownloaded Android Studio on a new computer. I hadn't set up Google Play services in my SDK Tools, and my emulator didn't have the Google Play store. See this discussion https://github.com/firebase/firebase-android-sdk/issues/1286#issuecomment-951403455
Also note that FirebaseInstanceId requires Google Play services to
create a token and it will fail on devices without it.
After creating a new Emulator with Google Play and restarting my IDE, the problem was solved.
you need to add
apply plugin: 'com.google.gms.google-services'
implementation platform('com.google.firebase:firebase-bom:x.x.x')
implementation 'com.google.firebase:firebase-analytics'
to your app/build.gradle ,
these code will give to you when create google.services file on firebase console
To remove this line:
FirebaseApp.initializeApp(getApplicationContext());
and let the SDK auto-initialize with the google-services.json solved it for me.
it's very-very confused, how I search a soltion for this error (with FIS_AUTH_ERROR), but with #Andreas Rayo Kniep's answer, especially with CURL command test, I know what's wrong with my problem.
CURL command to test firebase conf :
curl -H "content-type: application/json" -d "{appId: 'YOUR-APP-ID', sdkVersion: 't:1'}" https://firebaseinstallations.googleapis.com/v1/projects/PROJECT-NAME/installations/?key=API-KEY;
I must change API key at google-services.json, because it's status : PERMISSION_DENIED, message : Requests from referer are blocked.
so I create new API key from google console, with restrict API for : Cloud Messaging, FCM Registration API, Firebase Cloud Messaging API, Firebase Installations API.
and application restriction : None.
and problem was fixed!
I use :
com.google.firebase:firebase-messaging:20.1.0
firebase_messaging: ^10.0.2
In my case Crashlytics reports this only on a few Samsung devices, I think this is something with how Google services are implemented on certain Samsung devices so there is not much you can do.
Best solution worked for me is upgrading dependencies and clean & re-build project
Tried all solutions above. They didn't work for me. But then I deleted the app from the device and installed again. This helped.
Method 1
Go to your google cloud console https://console.cloud.google.com/
Then choose your project and check auto-created by firebase token in credentials -> API keys. Select your key and check if there are any restrictions you have to configure. Clear the restrictions and again build your app newly.
Method 2
Check your fingerprints -> project settings -> in firebase console and cross check with your keystore file's fingerprint algorithms. Then download your new google-services.json file and replace it with your existing file in android/app
For me, I forgot we had implemented SSL pinning in the early stages of our app, so we had to download and trust the root Google Trust Services CA.
Thanks to this GitHub thread for reminding me to consider SSL pinning: https://github.com/invertase/react-native-firebase/issues/5522#issuecomment-884960850
I guess a good giveaway was that curl would work fine, but it would fail on Android.
I was getting this error when I installed the application on my phone. The emulator did not give an error. I tried almost every solution, but in my case it was enough to delete the application, compile and build it again. I realized this after 1 day
My dependencies :
implementation platform('com.google.firebase:firebase-bom:26.4.0')
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.firebase:firebase-analytics:17.3.0'
implementation 'com.google.firebase:firebase-installations:17.0.1'
implementation "com.google.android.gms:play-services-base:16.1.0"
implementation "com.google.firebase:firebase-core:16.0.8"
implementation "com.google.firebase:firebase-messaging:20.1.0"
After having tried all above suggestions, the only way I could fix this was to create a new Firebase project.
The problem started for me after creating a new Angular Ionic project as a way to upgrade to Angular 14, Capacitor 4 and Ionic 6.
Copying the same google-service.json to the new project (along with all src code files) and adjusting the package/applicationId in build.gradle and AndroidManifest.xml - created this issue.
Anyways, as said, a 3 minutes new Firebase project process resolved everything eventually.
You should use the following code to obtain SHA 1 and SHA 256 and go to the Firebase panel and add new SHAs there and also download and replace the Firebase Jason file again and clean and rebuild the project. Do it and this way your problem will be solved.
The code to get SHA is below.
keytool -list -v -keystore "I:\AndroidProject\Busnet\example.jks" -alias example -storepass example -keypass example
Add the fingerprints from the play store.
Replace the google-services.json.
It worked for me.
I started getting this all of a sudden when running integration tests on a local emulator. Turns out it had something to do with the hotel wifi I was on. I tethered to my phone and it started working again.
sometimes it's too simple to be realized.
in my case, that happened because of missing INTERNET CONNECTION

E/com.facebook.appevents.RestrictiveDataManager: updateRulesFromSetting failed

When I launch my app from Android Studio, with Facebook SDK installed on my device, Xiaomi Mi A2, it triggers the same error trhee times. It does not stop the app, but I don't know if I am missing something or simply, it is not important, but in the end, it is an error and I want to clarify it.
I am using Android Studio 3.4.1, Android 9 on the Xiaomi A2 and the new clause in build.gradle file is implementation 'com.facebook.android:facebook-android-sdk:5.1.0'. Error has not appeared before upgrading Facebook SDK.
This is what appears in Logcat:
2019-06-24 18:24:31.202 25105-25136/com.myapp
E/com.facebook.appevents.RestrictiveDataManager:
updateRulesFromSetting failed
org.json.JSONException: End of input at character 0 of
at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
at org.json.JSONTokener.nextValue(JSONTokener.java:97)
at org.json.JSONArray.(JSONArray.java:92)
at org.json.JSONArray.(JSONArray.java:108)
at com.facebook.appevents.RestrictiveDataManager.updateFromSetting(RestrictiveDataManager.java:32)
at com.facebook.internal.FetchedAppSettingsManager.parseAppSettingsFromJSON(FetchedAppSettingsManager.java:323)
at com.facebook.internal.FetchedAppSettingsManager.access$000(FetchedAppSettingsManager.java:63)
at com.facebook.internal.FetchedAppSettingsManager$1.run(FetchedAppSettingsManager.java:181)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
EDIT
The issue has been fixed in version 5.1.1.
Revert to 5.0.3 to get rid of this.
5.1.0 is actually crashing in production at this method (there's a bug report here). GitHub commits of this file show its rather flawed, the method is called from multiple threads concluding to a concurrency crash because it's using a static ArrayList.
Lately the core FB SDK is kinda bloated with useless stuff and low-quality code. The codeless stuff "feature" that simply can't even be turned off is especially a horror to look at. If you don't strictly need the FB SDK in your app, I'd avoid it until they get their shit figured out.

Unity Auth Error With Firebase

I implemented Firebase into a Unity app I am creating. There are two buttons that will run the two functions to create a new user and login an existing user. So far this functionality works on my PC, however whenever I try to deploy it to my android phone or Mac I end up getting the following error in the console.
DllNotFoundException: FirebaseCppApp-5.1.0
Firebase.AppUtilPINVOKE+SWIGExceptionHelper..cctor ()
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for SWIGExceptionHelper
Firebase.AppUtilPINVOKE..cctor ()
Rethrow as TypeInitializationException: An exception was thrown by the type initializer for Firebase.AppUtilPINVOKE
Firebase.AppUtil.SetLogFunction (Firebase.LogMessageDelegate arg0)
It appears there is a missing .dll file, however I cannot for the life of me find out how to include it within the project file. I also have double checked the package name and it is the exact same name as the one made for my Firebase project, the google-services JSON in the root of the project, and the Api compatibility level is set to .NET 2.0. On top of that I also uninstalled and reinstalled the app a few times. I also tried using the Play Services Resolver which didn't help much at all either.
Similar error here, only with Firebase Cloud Messaging. After tinkering around in a fashion similar to yours I concluded that it was caused by corruption during import of Firebase Package.
What worked for me:
Deleted each and every folder created while importing Firebase Package.
Reimported Firebase Package

App crash when connecting to google play games - A fatal developer error has occurred

My game stops when I try to connect it with the google play games. It was working. But suddenly this is happening. It's showing development error occurred. Here's the logcat.
07:34.150 2144-2144/com.sennovations.countermaster E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sennovations.countermaster, PID: 2144
java.lang.IllegalStateException: A fatal developer error has occurred. Check the logs for further information.
at com.google.android.gms.common.internal.zze.zzs(Unknown Source)
at com.google.android.gms.common.internal.zzi.zzrk(Unknown Source)
at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5637)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
I have added the meta tags in the manifest.
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="#string/app_id" />
<meta-data android:name="com.google.android.gms.version" android:value="#integer/google_play_services_version" />
Any help would be appreciated. Thanks
Based on your comments I infer that this wasn't your issue, but as I encountered a similar error that I resolved as follows, I'll add this answer:
Google's documentation (here, for instance) currently instructs us to add
compile 'com.google.android.gms:play-services:11.0.4'
to build.gradle. Notice that it currently advises version 11.0.4. Google adds:
Be sure you update this version number each time Google Play services is updated.
This one line appears to be quite possibly some of the worst advice ever given.
Why? Two reasons.
Suppose you use their free BaseGameUtils, which Google itself encourages. Its build.gradle is set up to use version 8.4.0:
ext.gms_library_version = '8.4.0'
I did this, and used the webpage's advice to use version 11.0.4. The disagreement in library numbers caused the app to crash on both Android Studio emulator and a test device with a stack trace similar to the one above.
To be fair, Android Studio will warn you that things can go wrong with the different version numbers: if you open the Manifest file, it will underline the version numbers and whine that it finds two different version numbers, and it will even tell you which version numbers disagree, but -- this is key -- it won't tell you where to find the other file(s) with different version numbers. If you are importing several libraries, and/or compiling dependencies on GitHub or elsewhere, it can be a bit of a challenge to find the cause.
If your app requests Play Games services 11.0.4, but your emulator and/or phone have a lower version number (e.g., 11.0.2 as on my emulator), then the Games API's connect() will give status RESULT_CANCEL to onActivityResult(). The documentation on these result codes leaves something to be desired, so this can take a while to debug -- in fact, I think I think the crashes above were my only clue that the problem might be with the API version number.
There is a way to check that the device supports the requested API, but most of Google's documentation doesn't tell you to do it, and even BaseGameUtils doesn't seem to check for it. (You want to look at GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE.)
In my particular case, the problem was solved by changing my app's play-services version to 8.4.0. Works beautifully now.

Categories

Resources