Approval for background location on Android? - android

I developed an Android App with Qt. Some time ago I got an E-Mail "Approval for background location" from Play Store. I'm not familiar with Java and I don't understand the problem.
My App uses GPS only if the app is visible (in foreground), but not if it is invisible (background).
My Manifest.xml looks like this:
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="28"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.vending.BILLING"/>
Now I found on Play Store
...the ACCESS_BACKGROUND_LOCATION permission only affects an app's access to location when it runs in the background.
For me this means because I don't use ACCESS_BACKGROUND_LOCATION my App only uses GPS if it is visible (foreground). So what is the problem? Thanks...

I had a very similar problem. I double checked my AndroidManifest.xml, there was no ACCESS_BACKGROUND_LOCATION in it.
I use the QGeoPositionInfoSource from C++ to get periodic location updates. I never called the stopUpdates() function, that had to be fixed. It must be called when the app goes to background, e.g.: onPause.
Here is a very useful video with the clue, and some other useful reading material:
https://youtu.be/xTVeFJZQ28c?t=394
https://developer.android.com/training/location/permissions
https://youtu.be/xTVeFJZQ28c?t=394
https://developer.android.com/about/versions/oreo/background-location-limits
There is a signal QGuiApplication::applicationStateChanged which can be utilized for this, an example code:
if (const auto *const gui =
qobject_cast<const QGuiApplication *const>(qApp)) {
connect(gui, &QGuiApplication::applicationStateChanged, this,
[&](Qt::ApplicationState state) {
switch (state) {
case Qt::ApplicationState::ApplicationActive:
source->startUpdates();
break;
default:
source->stopUpdates();
}
});
}
The source is a pointer for the QGeoPositionInfoSource.

Related

Android Badger for every android device

hello I have android application and I need to add badger to app launcher I searched on the internet and found this library
compile 'me.leolin:ShortcutBadger:1.1.4#aar'
is working but not for all device I tried at Samsung and HTC and its working but on Hawaii or sony not working how I can make this work for every Android device?
this is my code
int badgeCount = 0;
try {
badgeCount = Integer.parseInt(bundle.getString("badge"));
} catch (NumberFormatException e) {
e.printStackTrace();
}
try {
ShortcutBadger.applyCount(getApplicationContext(), badgeCount);
} catch (Exception e) {
e.printStackTrace();
Log.d("BADGE","BADGE");
}
then I tried to add permission to manifest like this, also not working
<!--for Samsung-->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>
<!--for htc-->
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/>
<!--for sony-->
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/>
<uses-permission android:name="com.sonymobile.home.permission.PROVIDER_INSERT_BADGE"/>
<!--for apex-->
<uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>
<!--for solid-->
<uses-permission android:name="com.majeur.launcher.permission.UPDATE_BADGE"/>
<!--for huawei-->
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
<uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>
<!--for ZUK-->
<uses-permission android:name="android.permission.READ_APP_BADGE"/>
<!--for OPPO-->
<uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/>
<!--for EvMe-->
<uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_READ"/>
<uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_WRITE"/>
how i can make this work for every android device ?
You can't.
The decision of how to display things on the home screen is up to the developers of the home screen, not you. There are hundreds of different home screen implementations for Android, both pre-installed and user-installed. None have to offer any sort of API for app developers to set a badge on a launcher icon.
Some will have such an API and will document it. Some will have such an API for internal use, and developers of libraries like the one that you are trying to use may try to help you use those internal APIs. But many home screens will not have any sort of API for this.
Your primary choices are:
Stop trying to deal with launcher icon badges entirely.
Settle for what your library offers you.
Write your own home screen and attempt to force users to use your home screen, just so that you can have launcher icon badges.

ACTIVITY_RECOGNITION permission is not autocompleted

I want to use the ACTIVITY_RECOGNITION
However when i type
<uses-permission android:name="com.google.android.gms.ACTI
Android Studio doesn't autocomplete this to
<uses-permission android:name="com.google.android.gms.ACTIVITY_RECOGNITION
Is that a problem? why wouldn't it autocomplete? how can i solve this issue?
thank you
Try to change your code to :
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
Following the instruction in the ActivityRecognition document and the How to Recognize User Activity With Activity Recognition tutorial.
Hope this helps.
use this permission in menifest file com.google.android.gms.permission.ACTIVITY_RECOGNITION"

Start an activity even if we lock the device

I'm developing an alarm aplication, so when the alarm goes on it start an activity with an off button
It's very simple, but my question, is there a way to start the activity even if the device is locked???
You need to use the WakeLock and also disable your keyboard for the respective Activity. They can be achieved by help of WindowManager.LayoutParams class.
WakeLock allows your app to wake up the screen i.e. turn the display on while your Activity or your complete app is running in the foreground. To learn more about implementing the WakeLock go through the following link:
http://developer.android.com/training/scheduling/wakelock.html
To disable your keyguard you need to use WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED and/or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD flags for the respective Activity.
To know more about them, go to the following links:
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_DISMISS_KEYGUARD
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED
You will also need to use the following permissions in the Manifest file of your Android Project:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
You need the following permission in AndroidManifest.xml file:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
Check this link

Android M permission dialog not showing

I'm currently trying to adapt my application to the new permissions model of Android M.
I'm collecting all the permissions I require, then run
Log.i("Permissions", "Requesting permissions: " + permissions);
requestPermissions(requiredPermissions.toArray(new String[requiredPermissions.size()]), requestCodeForPermissions);
requiredPermissions holds the permissions I need like android.permission.WRITE_EXTERNAL_STORAGE.
That routine is definitely executed as I have the Log line in the logcat:
08-07 12:52:46.469: I/Permissions(1674): Requesting permissions: android.permission.RECEIVE_BOOT_COMPLETED; android.permission.WRITE_EXTERNAL_STORAGE
But the permissions dialog never shows, let alone is onRequestPermissionsResult() called.
What am I doing wrong? Based on some tutorials I found I'm not missing anything.
I only have the emulator for testing, no physical device. This is the about screen from settings:
Image
It might be worth mentioning something else: If I try to open the overview of installed apps from the home screen I only get launcher3 has exited. I'm not sure if that might be related.
Does anybody have an idea why it's not showing?
I experienced the same issue but later I realized I forgot to add the permission to the manifest file. After adding the uses-permission tag, the system showed the dialog. Maybe helps someone.
The original answer helped me.
I fixed by adding tools:remove="android:maxSdkVersion" like this:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
I experienced the same issue because I was using the negative value as a REQUEST_CODE.
requestPermissions(new String[]{android.Manifest.permission.CAMERA}, -1)
After using positive value, the system showed the dialog.
Hope it helps someone.
Based on the comment from Hilal (thanks a lot!):
In my case my app is indeed using tabhost and the permissions were requested from an Activity inside the tabhost. After starting a separate activity that requests the permissions it is working.
I just had the same problem.
My issue was that I wrote the permission at the wrong place in the manifest.
Make sure the uses permission is outside of application:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.google.android.gms.samples.vision.face.photo"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:hardwareAccelerated="true"
android:label="FacePhotoDemo"
android:allowBackup="true"
android:icon="#drawable/icon">
add
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
in AndroidManifest.xml
Note : The Permission which you want to get. Eg: android.permission.ACCESS_FINE_LOCATION etc.
I have also come across a situation where the permission dialog doesn't appear or the application crashes when using the <uses-permission-sdk23> element, however the cause appears to be a system bug on current 6.0 devices:
https://code.google.com/p/android/issues/detail?id=189841
Crash exception:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity}: java.lang.NullPointerException: Attempt to get length of null array
I have the same issue and the problem is solved after adding the shouldShowRequestPermissionRationale like this:
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
} else {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
To add to #shanraisshan's answer, the REQUEST_CODE actually has to be greater than 0, not just non-negative.
In our code, it was a simple spelling mistake.
We had:
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION" />
It should be:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
I was doing two calls to requestPermissions(), one right after the other. This error message appeared in Logcat (note the misspelling on "request"):
Can reqeust only one set of permissions at a time
requestPermissions() is actually designed to take multiple requests at once; that's what the String array is for.
In my case, the permission I was requesting (WRITE_SETTINGS) was more special and required Settings Activity to launch. So dialog was not showing up.
I had to get its permission using the following code:
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
startActivityForResult(intent, CODE_WRITE_SETTINGS_PERMISSION);
Yet another cause for not getting the permission dialog to show when requesting a dangerous permission...
I had to do Build -> Clean Project and then Build -> Rebuild Project. I guess Android Studio didn't pick up on the changes I made in the manifest.
I had a similar issue caused by the wrong case of the permission constant in the manifest, I was using read_contacts in lower case:
<uses-permission android:name="android.permission.read_contacts" />
After changing read_contacts to uppercase it started working as expected
<uses-permission android:name="android.permission.READ_CONTACTS" />
Permissions are organised into categories so non-critical ones are granted without the dialog being shown.
I found this the hard way with internet permission, if you're having this issue then changing to a critical permission such as read_contacts will allow you to test your flow and reveal whether the issue is the permission being non-critical or something else.
Normal protection permissions are listed here
In the manifest, I changed
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="22" />
to
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
Maybe that helps.
Add permission in the manifest file as well.
If anyone of you guys has an application that changes/modifies WRITE_SETTINGS and are facing this issue. Check out CommonsWare's Answer to WRITE_SETTINGS Ambiguity
I was facing this issue for 2 weeks and later realised that this issue was due to the fact that requestPermissions doesn't work for requesting WRITE_SETTINGS permission.
Hope this helps :D
In my case I had requested "ACCESS_COARSE_LOCATION" in my manifest file and then request for "ACCESS_FINE_LOCATION" permission in code that's why the Permission Dialog was not opening.
After searching a while it appears it is required to set the value compileSdkVersion to "android-MNC" or as of today to 23. That requires the Gradle build system which then seems to require Android Studio.
At least I couldn't find a single manual about how to set it outside the gradle files.
I did all the things said in above answers but still dialog was not showing and then I changed targetSdkVersion to 23 in gradle and it appeared . Hope this helps someone
#Override
public final void validateRequestPermissionsRequestCode(int requestCode) {
// We use 16 bits of the request code to encode the fragment id when
// requesting permissions from a fragment. Hence, requestPermissions()
// should validate the code against that but we cannot override it as we
// can not then call super and also the ActivityCompat would call back to
// this override. To handle this we use dependency inversion where we are
// the validator of request codes when requesting permissions in
// ActivityCompat.
if (!mRequestedPermissionsFromFragment
&& requestCode != -1 && (requestCode & 0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
}
Had the same issue. Later I realized that we have to declare each and every permission in manifest (even if one is a subclass of another).
In my case I declared
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
in my manifest and was trying to access user's coarse location.
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
Fixed the problem by adding coarse permission as well in manifest.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Set your targetSdkVersion to 22.
had the same (i guess) problem and the solution was removing
import <app package>.Manifest;
autoimported by Android Studio at the top of the file and substitute it with
import android.Manifest;
and started working
In my case the solution is the string itself
android.permission.READ_CONTACTS
I did Manifest.permission.READ_CONTACTS which caused silence error (Noting show on the screen).
Make sure that this is correct
My Android targetSDK version is 28.
I don't see any pop ups shown to user requesting for permission which are listed in android Manifest.xml as .
During both installation, installing .apk using USB and installing app from google play store.
So I added below code in my activity it will ask user permission during runtime
ActivityCompat.requestPermissions(MyActivity.this,
new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
I was requesting permission through code, but had missed adding the <uses-permission ..> tag in manifest !
Change the final constant value to 1.
private static final int REQUEST_PERMISSION_WRITE = 1;
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_PERMISSION_WRITE);

android.permission.CALL_PHONE for tablets

I am developing an app and in the manifest I have:
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
When I click on the button to execute this code:
Intent intentcall = new Intent();
intentcall.setAction(Intent.ACTION_CALL);
intentcall.setData(Uri.parse("tel:" + phonenumber)); // set the Uri
startActivity(intentcall);
It will run fine on phones, and on tablets it pops up with a display where you can view or add the number to contacts. However, if I keep the permission in the manifest, it isn't available for tablets in the market. How can I keep the code behavior and still have it display in the market for tablets as well as phones?
In the AndroidManifest you need:
<uses-feature android:name="android.hardware.telephony" android:required="false" />
The CALL_PHONE permission implies telephony is required, but if you specify that is not you won't be filtered.
Try to use Intent.ACTION_DIAL instead Intent.ACTION_CALL.
For example:
try {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phone_number));
startActivity(intent);
} catch (Exception e) {
//TODO smth
}
And in this case you can completely remove these tags from AndroidManifest.xml:
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-feature android:name="android.hardware.telephony" android:required="false" />
Regarding "uses-feature" and it crashing - are you checking that telephony is available before actually making the call? It might be you need to do that extra step for the case when the app is on tablets. All you are saying in the manifest is that the feature is not required. It probably relies on you to actually implement the logic around that.
Instead of adding a user with the ACTION_CALL identifier, change it to ACTION_INSERT_OR_EDIT.
You'll need these permissions too, instead of the CALL_PHONE permission:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
Take a look at this related question:
can't find app on market
From google docs:
Declared elements are informational only, meaning that
the Android system itself does not check for matching feature support
on the device before installing an application
usage is only for google play

Categories

Resources