I have one specific user whose crashing all the time on this error (full stacktrace included). I'm pointing out that it's only one user because others have no problem whatsoever using the app and experience no such crash.
My manifest doesn't include the READ_GSERVICES permission anymore because my understanding was that it was no longer necessary for google maps (as per this doc). Any ideas why this issue is happening to this one particular user and to nobody else?
My original theory was that this was because the user was using an ancient version of Google Play Services on their phone (see this issue), but the user writes that they are using the "latest version". I am targeting play services version 8.4.0 in my gradle file at the moment. User is running android 6.0.1 and the latest version of my app.
Edit: I made a special apk for this user including the line:
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
and it solved the problem. However, I don't want to add what ought to be a useless line for all my users just to solve the problem of one user so the question still remains why this happens for this user at all?
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{[myPKG]}: java.lang.SecurityException: Permission Denial: opening provider com.google.android.gsf.gservices.GservicesProvider from ProcessRecord{myPKG} (pid=4, uid=3539) requires com.google.android.providers.gsf.permission.READ_GSERVICES or com.google.android.providers.gsf.permission.WRITE_GSERVICES
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by java.lang.SecurityException: Permission Denial: opening provider com.google.android.gsf.gservices.GservicesProvider from ProcessRecord{myPKG} (pid=4, uid=3539) requires com.google.android.providers.gsf.permission.READ_GSERVICES or com.google.android.providers.gsf.permission.WRITE_GSERVICES
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3550)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4783)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2018)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1468)
at android.content.ContentResolver.query(ContentResolver.java:475)
at android.content.ContentResolver.query(ContentResolver.java:434)
at aff.b(:com.google.android.gms.DynamiteModulesB:225)
at aff.a(:com.google.android.gms.DynamiteModulesB:244)
at jx.(:com.google.android.gms.DynamiteModulesB:80)
at jw.(:com.google.android.gms.DynamiteModulesB:139)
at if.(:com.google.android.gms.DynamiteModulesB:159)
at maps.af.av.a(Unknown Source)
at maps.af.t.a(Unknown Source)
at maps.af.M.a(Unknown Source:2000)
at vw.onTransact(:com.google.android.gms.DynamiteModulesB:107)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source)
at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source)
at com.google.android.gms.dynamic.zza.zza(Unknown Source)
at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
at android.support.v4.app.Fragment.performStart(Fragment.java:1996)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1234)
at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:2051)
at android.support.v4.app.FragmentController.dispatchStart(FragmentController.java:185)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:607)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237)
at android.app.Activity.performStart(Activity.java:6268)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)