it-swarm.com.de

Android M-Anforderungsberechtigung, keine Aktivität

Mein Widget führt Aufrufe zum Sichern von Berechtigungen außerhalb eines Activity-Bereichs aus. Ist es möglich, Berechtigungen für Android M außerhalb einer Activity anzufordern?

32
Dave Honly

Nein, es ist nicht möglich. Sie können eine Benachrichtigung senden, in der der Benutzer antippen und dann eine Aktivität zum Anfordern/Verwalten der Berechtigung verwenden kann (möglicherweise mit einem Dialogdesign).

5
greywolf82

Ich denke, es ist möglich, eine Genehmigung außerhalb einer Aktivität anzufordern, solange Sie die Methode verwenden

ActivityCompat.requestPermissions (Aktivitätsaktivität, String [] -Berechtigungen, int requestCode)

aus der Support-Bibliothek und übergeben Sie die Aktivität als Parameter der Methode.

Zum Beispiel:

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

dabei ist targetActivity die Aktivität, die die Methode implementieren soll:

onRequestPermissionsResult (int requestCode, String [] -Berechtigungen, int [] grantResults)

Dies ist die Methode, die das Ergebnis der Berechtigungsanforderung behandelt.

3
Fede

Sie könnten die Bibliothek Easy Permissions verwenden. 

Android erfordert, dass diese Anforderungen von einer Activity stammen. Mit einfachen Berechtigungen ist dies kein Problem mehr. Sie können von überall eine Genehmigung anfordern, solange Sie Context angeben. Wenn Sie eine Berechtigung anfordern, die bereits erteilt wurde, wird der Benutzer nicht aufgefordert.

 enter image description here

Vollständige Offenlegung, verwaltet und entwickelt unser Unternehmen diese frei nutzbare Bibliothek. Wir sind jedoch zuversichtlich, dass es ein nützliches Instrument ist, und wir würden es nicht anders teilen. 

2
Newtron Labs

Sie können nur die Berechtigung entweder von Activity oder von Fragment anfordern.

Finden Sie einen Punkt in Ihrer Aktivität oder Ihrem Fragment heraus, an dem Sie der Meinung sind, dass App eine Berechtigung benötigt, und rufen Sie dann die requestPermission-Methode auf. Das Senden von Benachrichtigungen funktioniert nicht, da Sie möchten, dass Ihr Code verarbeitet wird, bis Sie die angeforderten Berechtigungen erhalten, und dann Ihre Funktionalität über die onRequestPermissionResult () - Methode wieder aufnehmen.

1
dex

Ich habe einen Workaround gefunden, der gut zu funktionieren scheint. Der Trick besteht darin, eine transparente Aktivität zu erstellen, die nur dazu dient, die Berechtigungen anzufordern, und wird unmittelbar danach beendet. Natürlich benötigen Sie noch einen Kontext, aber es muss sich nicht um eine Aktivität handeln. Die Aktivität kann das Ergebnis (gewährt oder abgelehnt) über einen Broadcast zurückgeben (da startActivtyForResult außerhalb einer Aktivität nicht möglich ist).

Sie können diese Aktivität verwenden:

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)
        }
    }
}

Und dieser Stil für die Aktivität

<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>

Im Manifest:

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

Und dann verwenden Sie es so (Kontext erforderlich)

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