web-dev-qa-db-fra.com

Android M demande permission non activité

Mon widget effectue des appels pour sécuriser les autorisations en dehors d'une étendue Activity. Est-il possible de demander des autorisations pour Android M en dehors d'une Activity?

32
Dave Honly

Non, ce n'est pas possible Ce que vous pouvez faire est d’envoyer une notification par laquelle l’utilisateur peut appuyer sur puis utiliser une activité pour demander/gérer l’autorisation (peut-être avec un thème de dialogue).

5
greywolf82

Je pense qu'il est possible de demander une autorisation en dehors d'une activité, tant que vous utilisez la méthode

ActivityCompat.requestPermissions (Activité, String [] permissions, int requestCode)

à partir de la bibliothèque de support et passez l'activité en tant que paramètre de la méthode.

Par exemple:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);

où targetActivity est l'activité qui doit implémenter la méthode:

onRequestPermissionsResult (int requestCode, permissions String [], int [] grantResults)

C'est la méthode qui gérera le résultat de la demande d'autorisation.

3
Fede

Vous pouvez utiliser la bibliothèque Easy Permissions

Android nécessite que ces requêtes proviennent d'une Activity. Avec les autorisations simples, ce n’est plus un problème, vous pouvez demander l’autorisation de n’importe où, à condition de fournir Context. De plus, si vous demandez une autorisation déjà accordée, l'utilisateur ne sera pas invité.

 enter image description here

Divulgation complète, notre société gère et développe cette bibliothèque gratuite. Cela étant dit, nous sommes convaincus que c'est un outil utile et nous ne le partagerions pas autrement. 

2
Newtron Labs

Vous ne pouvez demander l'autorisation à Activity ou à fragment.

Identifiez un point de votre activité ou de votre fragment où, selon vous, l'application nécessitera une autorisation, puis appelez la méthode requestPermission. l'envoi de notification ne fonctionnera pas parce que vous voulez que votre code soit traité jusqu'à ce que vous obteniez les autorisations demandées, puis reprenez votre fonctionnalité à partir de la méthode onRequestPermissionResult ().

1
dex

J'ai trouvé une solution de contournement qui semble fonctionner correctement. L'astuce consiste à créer une activité transparente qui ne sert qu'à demander les autorisations et qui est terminée immédiatement après. Vous aurez toujours besoin d'un contexte bien sûr, mais il ne doit pas s'agir d'une activité . L'activité peut renvoyer le résultat (accordé ou refusé) via une diffusion (puisque startActivtyForResult n'est pas possible en dehors d'une activité).

Vous pouvez utiliser cette activité:

import Android.content.Intent
import Android.content.pm.PackageManager
import Android.os.Bundle
import Android.support.v4.app.ActivityCompat
import Android.support.v7.app.AppCompatActivity

internal const val PERMISSIONS_KEY = "permissions"
internal const val ACTION_PERMISSIONS_GRANTED = "GetPermissionsActivity.permissions_granted"
internal const val ACTION_PERMISSIONS_DENIED = "GetPermissionsActivity.permissions_denied"

class GetPermissionsActivity: AppCompatActivity() {

    private val permissionRequestCode = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ActivityCompat.requestPermissions(
            this,
            intent.getStringArrayExtra(PERMISSIONS_KEY),
            permissionRequestCode
        )
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        if (requestCode == permissionRequestCode) {
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                sendBroadcast(Intent(ACTION_PERMISSIONS_GRANTED))
            } else {
                sendBroadcast(Intent(ACTION_PERMISSIONS_DENIED))
            }
            finish()
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }
}

Et ce style pour l'activité

<style name="Theme.Transparent" parent="Theme.AppCompat">
    <item name="Android:windowIsTranslucent">true</item>
    <item name="Android:windowBackground">@Android:color/transparent</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:backgroundDimEnabled">false</item>
    <item name="Android:windowAnimationStyle">@null</item>
</style>

Dans le manifeste:

<activity Android:name="GetPermissionsActivity" Android:theme="@style/Theme.Transparent" />

Et ensuite, utilisez-le comme ceci (contexte requis)

class SomeClass : BroadcastReceiver() {

    private fun someFunction(context: Context) {
        val intentFilter = IntentFilter()
        intentFilter.addAction(ACTION_PERMISSIONS_GRANTED)
        intentFilter.addAction(ACTION_PERMISSIONS_DENIED)
        context.registerReceiver(this, intentFilter)
        val intent = Intent(context, GetPermissionsActivity::class.Java)
        intent.putExtra(PERMISSIONS_KEY, arrayOf(<your permissions>))
        context.startActivity(intent)
    }

    override fun onReceive(context: Context, intent: Intent) {
        when {
            intent.action == ACTION_PERMISSIONS_GRANTED -> {
                context.unregisterReceiver(this)
                onPermissionsGranted()
            }
            intent.action == ACTION_PERMISSIONS_DENIED -> {
                context.unregisterReceiver(this)
                onPermissionsDenied()
            }
            else -> super.onReceive(context, intent)
        }
    }

    private fun onPermissionsGranted() {
        // ...
    }

    private fun onPermissionsDenied() {
        // ...
    }
}
0
Benni Bsngr