I am creating an app where I need to analyse spector of my signal. And when this service is on I got some filtered HZs, When I stop this service everything is ok.
In my app I need to disable Google play services by code when my app runs.
Is there any idea how can disable the services (Force Stop) by code ?
Your code is not allowed to force a stop of Google Play services by design and by contract. You can connect and disconnect your own clients at-will, but other apps on the device may be using the services and you are not allowed to interfere with them.
What services on the phone are you using that you suspect Google Play services is interfering with?
According to the android documentation: The GoogleApiClient class is The main entry point for Google Play services integration.
So in order to disable Google Play Services functionality. Try calling GoogleApiClient.disconnect(); on your GoogleApiClient object.
Hopefully that should work.
Related
I had an android application working fine in all average smartphones, but only one client is using a custom phone from Huawei, he received this error Can't connect to google play service, and also Google Maps not working, so my question there's any way programmatically to send a request to download the missed google play service ?
You can't install Google Play Services like a normal application, since it isn't a normal application. It's actually at least 3.
It needs to be a system app (ie in /system/priv-app/) to work, and relies on certain other frameworks that can't simply be installed.
If this user is rooted, tell them to flash Google Play Services from something like OpenGApps or MicroG. Otherwise, if you need people without Google Services to use your app, you need to find another maps API that isn't from Google.
I am trying to get Current location using Fusedlocationservice.
In my gradle file i have put below playservice version
compile 'com.google.android.gms:play-services:9.4.0'
Now if in device have latest version of google playservice then its work well. it give proper location.
But if device have lower version then its not give current location.
Its also give warning in logcat like below:
W/GooglePlayServicesUtil: Google Play services out of date. Requires 9452000 but found 6184738
So its mandatory to have latest version of playservice in device to get current location..?
If yes then i need alternet solution for this. because every user not able to update service in device so.
my code you can see here .Get Current Location 0 in marshmallow where below 23 API its give exact current Location using fused Location
Any Help will highly appreciated.
as far as i know FusedLocation was added in Play Service 7.0 and the one you posted is 6184738 is 6.1 i guess, you can check here all the release changelog, so it should work on devices with play services 7.0 or higher
You might want to check this document: Ensure Devices Have the Google Play services APK
As described in the Google Play services overview, Google Play delivers service updates for users on Android 2.3 and higher through the Google Play Store app. However, updates might not reach all users immediately, so your app should verify the version available before attempting to perform API transactio
You are strongly encouraged to use the GoogleApiClient class to access Google Play services features. This approach allows you to attach an OnConnectionFailedListener object to your client. To detect if the device has the appropriate version of the Google Play services APK, implement the onConnectionFailed() callback method. If the connection fails due to a missing or out-of-date version of the Google Play APK, the callback receives an error code such as SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, or SERVICE_DISABLED. To learn more about how to build your client and handle such connection errors, see Accessing Google APIs.
Another approach is to use the isGooglePlayServicesAvailable() method. You might call this method in the onResume() method of the main activity. If the result code is SUCCESS, then the Google Play services APK is up-to-date and you can continue to make a connection. If, however, the result code is SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, or SERVICE_DISABLED, then the user needs to install an update. In this case, call the getErrorDialog() method and pass it the result error code. The method returns a Dialog you should show, which provides an appropriate message about the error and provides an action that takes the user to Google Play Store to install the update.
Note: Because it is hard to anticipate the state of each device, you must always check for a compatible Google Play services APK before you access Google Play services features.
Hope it helps!
I have put google play service version to 7.3 in gradle instead of latest version.
Because every user not have latest version of play service so if you put latest version of play service in application it always take null location if device have lower version play service. else user have to update play service to match application play service version.
So I have put lower version of playservice in app. build so its supports in each device which have equal or higher version.
got reference from doc. https://developers.google.com/android/guides/setup#ensure_devices_have_the_google_play_services_apk
I am looking to use the Google Play Service ActivityRecognition API as part of an Android app which will be offline for most of its usage; users will generally be out and about and a data connection is not guaranteed.
Looking at the docs, the requestActivityUpdates method requires a connected GoogleApiClient.
My question is, is the Activity Recognition API guaranteed to work if there is no data connection present?
Sure it works without data connection.
Google Play services is basically the background app that is running in the Android OS. Thus by requesting connection to GoogleApiClient you are connecting to this Google Play services app.
It is said that Google Play services apk does silent updates, however it is better to check if it is updated to the latest version, since sometimes services fail to update (happened with me only on Android 2.3).
We developed an application that uses the Google Play Services extension.
I assume that people without Google Play Services installed on their device side will not be able to use these services.
However if people does not have Google Play Services installed on their device, they probably cannot download it in the first place, because they dont have Google Play App itself.
So is it safe to assume that most people who install the app have Google Play Service installed and make a more general verification in our app for other rare cases?
For example, check if Google Play Services availability and if not installed, simply write a message and exit the app.
What is your opinion on that ?
Thanks
One of the things that can happen is that Google Play Services is present on the device, but not up to date. Or the user could have disabled Google Play Services. In both these cases connection to Google Play Services will fail, so you really have to check for it, no excuses :)
The answer can be found on Android's developers website
Important: Because it is hard to anticipate the state of each device, you must always check for a compatible Google Play services APK before you access Google Play services features. For many apps, the best time to check is during the onResume() method of the main activity.
Google Play services is an Android library whose goal is to provide:
OAuth 2.0 authentication
Google+ sign-in
Google+ +1 button
various other goodies
If I were to use it (for instance because I want Google+ sign-in), what would happen to users whose device does not have Google Play? (Nook, Cyanogenmod, China Mobile, old devices, maybe Huawei?, etc)
QUESTION: Will my app become incompatible with such devices? Will it be displayed as compatible but then crash, or not work?
Is there a best practice to keep this in mind when using Google Play services?
GooglePlayServicesUtil.isGooglePlayServicesAvailable(android.content.Context)
is deprecated!
Use:
GoogleApiAvailability api = GoogleApiAvailability.getInstance();
int code = api.isGooglePlayServicesAvailable(activity);
if (code == ConnectionResult.SUCCESS) {
// Do Your Stuff Here
} else {
AlertDialog alertDialog =
new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle).setMessage(
"You need to download Google Play Services in order to use this part of the application")
.create();
alertDialog.show();
}
If the feature from Google Play Services is essential for your app there would be no way to get your App working.
You can check if the services are enabled from within your app with GooglePlayServicesUtil.isGooglePlayServicesAvailable(android.content.Context)
which returns ConnectionResult.SUCCESS if Play Services is available.
You can now try to convince the user to install it (if possible) or disable the feature that is using the service.
As the Google Play Services is not a feature declared in the manifest your app should install fine on any device but may crash later on if you are using the APIs without checking if they are available.
You can try the behaviour with the emulator. Just create an AVD without the Google APIs and put your App on it.
As others stated, your code should ideally check for Google Mobile Services. If you don't, it will crash with a java.lang.RuntimeException wrapping android.content.ActivityNotFoundException because you'll be invoking a function on a non-existing activity.
Good apps don't crash but instead spam users with notifications in all the places they rely on on play services as other answers suggested. If possible send only a single notification to users instead of spamming them with the same notification in every place you rely on play services - or close the app after a dialog explaining why it's closing.
Better apps (e.g. Signal) contain alternative logic for handling things like notifications without making play services a hard requirement.
To which degree you can make your app work without play services is almost entirely up to your use case. If you use Firebase for instance it will be very hard to make your app work without GMS.
In most cases it's possible to avoid GMS, in some cases it's maybe not the best idea (e.g. allowing users to use arbitrary location on a dating app).
Try searching for alternatives before you lock yourself in though: OpenStreetMap will work on more devices than Google Maps, it's not as complete as Google Maps in some regions though (it's good enough for picking a delivery location though).
The recommendation that you use GMS comes from Google. I'd personally recommend you to support more devices, vendors and OSs if it doesn't require doubling your code base.
If you are somehow required to use Play Services, or if you maintain a legacy app that makes calls to Play Services, then I would recommend this strategy:
On app start, check whether Play Services is available or not
If not available, redirect Play Services calls to microG
microG is an open source implementation of Google Play Services.
It lacks many features, but is under active development. Many features are still stubs.
For location services, there is also LOST, a drop-in replacement for the Google Play services location APIs.
You app might not work perfectly, but at least it is better than crashing.
Of course, the best is to NOT use Google Play Services, from the start.
If your app uses GMS features like Google Sign-In or Firebase Cloud Messaging, it won't work well on the devices that don't have GMS.
It's recommended that you use GMS if a device supports GMS; otherwise, use HMS (Huawei Mobile Services).
Please refer to the following links:
To check whether GMS is available
HMS Overview
HUAWEI Account Kit
So you can use Google+ Sign-In on the devices where GMS is available; otherwise, use HUAWEI Account Sign-In.