Permissions Request dialog persist on application restart when permission is revoked - android

My application is targeted to Android Marshmallow (API level 23) and implemented Run-time Permissions by following the developer guide in the below link.
https://developer.android.com/training/permissions/requesting.html.
This requesting Permission model is working fine.
When there is a permission request popup on the screen, If user revoke the permissions which are already granted by accessing Settings -> Apps -> My Application name -> permission and switch to my application, Application is getting restarted.
But that permission Request dialog which is already opened still persist.
So, Please suggest some solution to close that permission request dialog which is already there in the screen, when it is getting restarted.

Related

ACCESS_MEDIA_LOCATION permission request is not showing prompt

I've set my app to target AP 29 and removed requestLegacyExternalStorage=true from manifest.
Now I'm checking if the user has this permission and if result is denied I request for permission.
My problem is that the request for permission is returning Granted without showing the prompt... I know the flow is working since I'm able to read the GPS location from picture after being granted.
I see permission status = Denied and as soon as I explicitly request this permission, it returns Granted without any user interaction.
Eveything looks OK but I'm confused about not seeing the prompt... is this expected? I saw this permission qualifies as "Dangerous" so I was expecting a prompt. I'm testing on a Android 10 device.
I'm not showing any code since the project is Xamarin and the permission logic is handled through a third party library, don't think my code will help as the platform logic to request the permission is hidden by the component.
From
Android 10: fetch the gallery via MediaStore with location information :
This requires holding the ACCESS_MEDIA_LOCATION permission. Note, this permission is not "user visible in the settings UI" (source), which means the user won't see a popup asking for permission, even though it is a runtime permission. This means you have to ask for permission during runtime (in contrast to just the manifest file) but the user won't have to consent to it. Adding this here because you might be wondering why no extra UI popups are shown.
I'm still getting my head around the logic though. I'm in favour of the user being asked for permission but I don't understand why it should be necessary to "request" it if the user doesn't actually grant permission.
I was able to reproduce the issue in a simpler app. I have posted a slightly different question with code snippets.
This is an answer by HilaryN that I believe should not have been deleted (I removed the off-topic bits).

(ANDROID) "requires appop SYSTEM_ALERT_WINDOW" even though already granted

I have an Android app that uses the SYSTEM_ALERT_WINDOW permission. I have a runtime check to make sure the permission is granted. When I sideload the app (for dev), it prompts me for the permission as usual. However, when a user installs it from the Play Store, the permission is (allegedly) automatically granted, but when they try to use it, an error is logged saying: Appop Denial: Accessing service ComponentInfo{<package>} from pid=<pid>, uid=<uid> requires appop SYSTEM_ALERT_WINDOW (basically saying the permission isn't granted). The weird part is, if the user goes to the app's settings and revokes and then permits the permission, it works. Any ideas why this is happening??
I have seen this same problem a number of times and found various answers to the problem. One solution that I recall had to do with the fact that when you request permission for SYSTEM_ALERT_WINDOW and then prepare a Toast after the result of the permissions, it would throw this same error. It has to do with the fact that the Android system perceives the toast as a secondary 'alert' and throws the above exception when it happens in succession.
If you are creating any type of Toast after the result check of the permission (usually in the onRequestPermissionsResult method), try removing it and see if you have the same issue.

Monitoring app?

I am currently designing an Android application which monitor the users activity I need to access the camera the thing is in order to use the camera the application needs to request permission from the user but I am designing a monitor application the user does not no that the application is running so is there any way to bypass the user request permission and gain the permission
is there any way to bypass the user request permission and gain the permission ?
You cannot, for security reason.
On API 22 and lesser, permissions are granted on app installation.
Moreover, on API 23 and higher you have to check and ask for permission when your app is launched for all dangerous level permission (like CAMERA permission). See this guide to request permissions.

Android handling permission disabling from system settings

From app I gave the required permission for my app. While my app is running, I went to system settings page and revoked the permission. The app is crashing. Will we be able to handle this?.
Android 6.0 (Marshmallow, API 23) switched from an install-time permission model to a runtime permission model. Now instead of the user granting all permissions at runtime, you the developer are responsible for requesting permissions at runtime and responding appropriately.
You should begin by reading the Requesting Permissions at Run Time documentation. So that you can properly request permissions on devices running Marshmallow.
To prevent your app from crashing, you need to call ContextCompat.checkSelfPermission() to see if you have a permission before attempting to call a method that requires a permission. However, this is only half the equation since you still need to request the permission if you don't already have it.

Displaying images from SDCard in a Widget from MarshMallow

In a widget I display images from SDCard using remoteView.setImageViewUri(). This strategy works correctly except with MarshMallow:
The error is:
Unable to open content: file:///storage/emulated/0/Android/data/applicaitonPackage/files/file.png
open failed: EACCESS (Permission denied)
It's clear that this is a permission problem, but I don't know how to give permissions to the widget container and in theory (see Note 1) the images are already stored in shared storage.
Note 1: The directory where images are stored is shared storage under Environment.getExternalStorageDirectory()
Note 2: Application is not adapted to MarshMallow and uses targetSdkVersion=15
Note 3: Don't just reply explaining about new runtime permissions in MarshMallow. I already know permissions changes and that is not the problem because application is targeted SDKVersion 15 and the app hasn't any problem accessing the external storage, the problem is with the widget container that is the one that I suspect that doesn't has the permissions.
#Docs says
Requesting Permissions at Run Time
Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.
This approach streamlines the app install process, since the user does not need to grant permissions when they install or update the app. It also gives the user more control over the app's functionality;
Therefore this make sense although you declare permission in manifest but still getting permission denied
I suggest you to read how to get runtime permission
http://developer.android.com/training/permissions/requesting.html
Here is the example provided by Docs
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Change permission as per you requirement
Hope it leads you to right direction
Did you have this permisstion in your Manifest file?
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
If I set the targetSdkVersion to 15 instead of 23 - will the android M users see the app and be able to download it (granting all permissions at runtime)?
Yes, the app will be available to M users and every permission is granted at install time.
`targetSdkVersion=15`
which is less than 23.User will able to download the app and use it it grants all the permission at run time. If you want to check the permission go to settings and grant the permission. If you want to use the android M permission module at run time you have to set the target SDK version to 23.
If set the targetSdkVersion=15 on android M and higher devices app getting crashed.
If you want to support android M users set targetSdkVersion=23and
handle permission runtime.

Categories

Resources