Android M-Berechtigungen: onRequestPermissionsResult () wird nicht aufgerufen

291

Ich aktualisiere unsere App, um das neue M-Laufzeitberechtigungssystem zu verwenden. Es funktioniert alles außer onRequestPermissionsResult (). Ich muss eine Berechtigung bei einem Tastendruck überprüfen und, wenn dies erfolgreich ist, eine Textnachricht senden. Wenn ich die Erlaubnis dazu erteile, wird der Dialog geschlossen, aber der Text senden wird erst ausgelöst, wenn ich die Taste erneut drücke.

Ich habe in der Methode onRequestPermissionsResult () debuggt und Haltepunkte gesetzt, aber es wird nie darauf eingegangen.

Diese Methode wird zuerst aufgerufen:

    private void askForPermission() {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

Und dann sieht mein Rückruf so aus:

    @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == PERMISSIONS_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            int grantResult = grantResults[i];

            if (permission.equals(Manifest.permission.SEND_SMS)) {
                if (grantResult == PackageManager.PERMISSION_GRANTED) {
                    onPPSButtonPress();
                } else {
                    requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
                }
            }
        }
    }
}

Ist jemand auf ein ähnliches Problem gestoßen? Schätzen Sie jede Hilfe dabei. Vielen Dank

AndyOHart
quelle

Antworten:

576

Ich bin auf dasselbe Problem gestoßen und habe gerade die Lösung gefunden. Wenn Sie die Support-Bibliothek verwenden, müssen Sie die richtigen Methodenaufrufe verwenden. Beispielsweise:

  • In AppCompatActivity sollten Sie ActivityCompat.requestPermissions verwenden .
  • In android.support.v4.app.Fragment sollten Sie einfach requestPermissions verwenden (dies ist eine Instanzmethode von android.support.v4.app.Fragment).

Wenn Sie ActivityCompat.requestPermissions in einem Fragment aufrufen , wird der Rückruf onRequestPermissionsResult für die Aktivität und nicht für das Fragment aufgerufen.

Hoffe das hilft!

yavor87
quelle
13
Es tritt auch bei noHistory-Aktivitäten auf: code.google.com/p/android-developer-preview/issues/…
Anthony Bobenrieth
11
"Wenn Sie sich in android.support.v4.app.Fragment befinden, sollten Sie einfach requestPermissions verwenden" - danke!
Tigran Sarkisian
5
@AnthonyBobenrieth also was ist hier die Lösung für noHistory-Aktivitäten? Wir können einfach keine Berechtigungen von ihnen anfordern?
Dean Wild
2
Der Link ist @AnthonyBobenrieth unterbrochen. Gibt es eine Lösung für keine Geschichte?
Fersarr
3
Bei Verwendung Fragment.requestPermissions()erhält die übergeordnete Aktivität tatsächlich die onRequestPermissionsResult(). (Dies ist mit Support-Bibliothek 23.3.0)
Jemand irgendwo
101

Sie können dies versuchen:

requestPermissions(permissions, PERMISSIONS_CODE);

Wenn Sie diesen Code aus einem Fragment aufrufen, verfügt er über eine eigene requestPermissions-Methode. Ich glaube, das Problem ist, dass Sie statische Methode aufrufen.

Pro Tipp, wenn Sie das onRequestPermissionsResult()in einem Fragment wollen: FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)

Tieru
quelle
Danke für die Hilfe. Ich habe festgestellt, dass es eine requestPermissions-Methode gibt, wenn sie sich in einem Fragment befindet. Ich bin in einem Fragment und habe versucht, nur requestPermissions aufzurufen, leider hat es nicht funktioniert. Ich habe auch versucht, was Sie erwähnt haben, und es hat auch nicht funktioniert.
AndyOHart
Dies funktionierte für mich in Android M. Aber ich frage mich nur, ob es Probleme mit Pre-M-Geräten verursachen würde?
Bala Vishnu
4
@goodgamerguy Stellen Sie sicher, dass Sie den Anforderungscode nicht in onRequestPermissionsResult der Aktivität verwenden. Wenn Ihre Aktivität auch den Rückruf onRequestPermissionsResult verwendet, sollten Sie den Standardwert angeben: super.onRequestPermissionsResult (requestCode, permissions, grantResults);
Timmy Simons
68

Ich hoffe es funktioniert gut

Für Aktivität:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

Für Fragment:

 requestPermissions(permissionsList,REQUEST_CODE);
Sanjay Mangaroliya
quelle
Was ist mit SDK 15 und niedriger?
Zulkarnain Shah
4
Sie benötigen keine Erlaubnis für SDK 15, nur Marshmallow und eine
höhere
50

Ich bin auch auf dieses Problem gestoßen. Wenn Sie die Aktivität möchten, die Berechtigungen verarbeitet, die nicht im Verlauf / in den letzten Jahren enthalten sind, werden Sie versucht sein, Ihren AndroidManifest.xmlEintrag zu ändern .

Wenn Sie die Aktivität festlegen, die Sie aufrufen requestPermissionsoder AppCompatActivity.requestPermissionsmit der Sie arbeiten

android:noHistory="true"
android:excludeFromRecents="true"

in deinem AndroidManifest.xmldann onRequestPermissionsResult()wird nicht gerufen. Dies gilt, wenn Ihre Aktivität von Activityoder abgeleitet ist AppCompatActivity.

Dies kann behoben werden, indem Sie beide Flags aus 'AndroidManifest.xml' entfernen und finishAndRemoveTask()stattdessen Ihre Aktivität mit beenden .

Simon Featherstone
quelle
Ich hätte das noHistory-Attribut lieber nicht entfernen müssen, aber dies war die Lösung, die für mich funktioniert hat. Vielen Dank!
Eric Schlenz
1
Ich hatte das Problem auf Marshmallow, aber nicht auf Nougat, danke, es hat bei mir funktioniert
Yohan Dahmani
37

Wenn Sie onRequestPermissionsResultsowohl Aktivität als auch Fragment haben, stellen Sie sicher, dass Sie super.onRequestPermissionsResultAktivität aufrufen . Es ist nicht in Fragment erforderlich, aber es ist in Aktivität.

Dusan Zivkovic
quelle
Beachten Sie außerdem, dass Sie sich, wenn Sie auf eine API abzielen (z. B. 19), weiterhin unter dem alten Berechtigungsmodellsystem befinden und daher keine Funktionsaufrufe im Zusammenhang mit der Anforderungsberechtigung erhalten
Bonatti,
siehe meine Antwort, wenn Sie eine andere Aktivität erweitert haben, die nicht super
aufruft
3
Stolperte über diesen. FragmentActivity.onRequestPermissionsResult(..)Hier wird der Aufruf an Fragmente onRequestPermissionsResult(..)weitergeleitet.
23.
@Bonatti Wenn ich also versuche, eine Erlaubnis in Android 4.4.2 anzufordern, bekomme ich kein Ergebnis? Somit kann ich die Berechtigungen nicht ändern, sondern nur sehen?
Alex Fragotsis
@AlexanderFragotsis Sie erhalten ein Ergebnis. Der einzige Unterschied besteht darin, dass Sie nicht aufgefordert werden, eine Berechtigung zu erteilen, sondern automatisch vom System erteilt werden.
Dusan Zivkovic
33

Antwort veraltet finden Sie unter: https://developer.android.com/training/permissions/requesting

Innerhalb des Fragments müssen Sie Folgendes aufrufen:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

Nicht:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);
Ben.Slama.Jihed
quelle
2
Bezieht sich auf android.support.v13.app.FragmentCompat
Udi Oshi
1
FragmentCompat ist ab API 27.1.0 veraltet.
Big McLargeHuge
Meine Antwort ist veraltet.
Weitere Informationen finden
15

Wenn Sie requestPermissions in Fragment verwenden, werden 2 statt 3 Parameter akzeptiert.

Du solltest benutzen requestPermissions(permissions, PERMISSIONS_CODE);

AkKi
quelle
1
Eigentlich gibt es eine Antwort auf die Frage. Beim Aufrufen von requestPermissions (Instanzmethode des Fragments) anstelle von ActivityCompat.requestPermissions wird die Ergebnismethode ausgelöst. Welches ist das Hauptproblem hier. Vielen Dank, dass Sie Don
Waclock
15

Wenn Sie aus irgendeinem Grund eine benutzerdefinierte Aktivität in einer externen Bibliothek erweitert haben, die den Super nicht aufruft, müssen Sie das Fragment super.onRequestPermissionsResult in Ihrer Aktivität onRequestPermissionsResult manuell aufrufen.

YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestingFragment!=null)
            requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
...
TouchBoarder
quelle
12

Sie haben die Funktion checkPermissions für Geräte vor Marshmallow in FragmentCompat . Ich benutze so:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
Marta Rodriguez
quelle
2
Dies funktioniert nur, wenn die Berechtigung in android.app.fragment abgefragt wird und Sie die support-v13-Bibliothek importieren müssen!
MohammadReza
4
FragmentCompat.requestPermissions () funktioniert nicht mit android.support.v4.app.Fragment. Jeder weiß, wie man damit umgeht.
Jutikorn
12

Ich habe herausgefunden, dass das wichtig ist, wo Sie anrufen android.support.v4.app.Fragment.requestPermissions.

Wenn Sie es in tun onCreate(),onRequestPermissionsResult() wird nie aufgerufen.

Lösung: Rufen Sie es an onActivityCreated();

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) 
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);

}
almisoft
quelle
1
Ich habe das gleiche Problem, kann aber onActivityCreated()meinen Code nicht eingeben. SDK 23.
kAmol
Ich bin nicht in Fragment, ich versuche es auf onCreate einer Aktivität zu tun
kAmol
Hmm oder verwenden onPause()?
Almisoft
10

Dieses Problem wurde tatsächlich von NestedFragments verursacht. Grundsätzlich haben die meisten Fragmente ein HostedFragment erweitert, das wiederum ein CompatFragment erweitert. Diese verschachtelten Fragmente verursachten Probleme, die schließlich von einem anderen Entwickler des Projekts gelöst wurden.

Er hat ein paar Sachen auf niedriger Ebene gemacht, wie zum Beispiel Bit-Switching, damit das funktioniert, also bin ich mir der tatsächlichen endgültigen Lösung nicht sicher

AndyOHart
quelle
Dies half mir, mein Problem zu lösen: Ich musste das onRequestPermissionsResult vom übergeordneten Fragment zum untergeordneten (verschachtelten) Fragment umleiten. Danke für den Tipp!
Murphy
9
 /* use the object of your fragment to call the 
 * onRequestPermissionsResult in fragment after
 * in activity and use different request Code for 
 * both Activity and Fragment */

   if (isFragment)
    mFragment.requestPermissions(permissions.toArray(new
    String[permissions.size()]),requestPermission);

   else
    ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
    String[permissions.size()]),requestPermission);
Shahab Rauf
quelle
6

Das wird funktionieren..

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
Sumit khare
quelle
Die Super-Implementierung nennt die Fragment-Implementierung nicht das Framework
Mohammad Yahia
5

Wenn Sie diesen Code aus einem Fragment aufrufen, verfügt er über eine eigene requestPermissions-Methode.

Das Grundkonzept lautet also: Wenn Sie sich in einer Aktivität befinden, rufen Sie an

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

und wenn in einem Fragment, rufen Sie einfach an

requestPermissions(permissionsList,
                            permissionscode);
PounKumar Purushothaman
quelle
1
Erfordert API-Level 23 ... Bei früheren Anwendungen FragmentCompat.requestPermissions().
Minas Mina
5

Ich hatte ein ähnliches Problem, außer dass ich eine Taste drückte, um einen Anruf zu tätigen, der den callIntent auslöst. Ich habe zuerst die Berechtigung überprüft. Wenn sie nicht erteilt wurde, bitte ich um Erlaubnis und onRequestPermissionResult rufe die Überprüfungsberechtigung auf und rufe erneut auf.

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
            if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                checkPermissionsAndCall();
            }
        }
    }
}

public void checkPermissionsAndCall(){
    if (Build.VERSION.SDK_INT > 22) {
        if(ContextCompat.checkSelfPermission(getContext(),
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
        }
        else{
            callIntent();
        }
    }
}
Ndheti
quelle
2

Bevor Sie alles gemäß den obigen Antworten überprüfen, stellen Sie sicher, dass Ihr Anforderungscode nicht 0 ist !!!

Überprüfen Sie den Code von onRequestPermissionsResult () in FragmentActivity.java:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    int index = (requestCode>>16)&0xffff;
    if (index != 0) {
        index--;

        String who = mPendingFragmentActivityResults.get(index);
        mPendingFragmentActivityResults.remove(index);
        if (who == null) {
            Log.w(TAG, "Activity result delivered for unknown Fragment.");
            return;
        }
        Fragment frag = mFragments.findFragmentByWho(who);
        if (frag == null) {
            Log.w(TAG, "Activity result no fragment exists for who: " + who);
        } else {
            frag.onRequestPermissionsResult(requestCode&0xffff, permissions, grantResults);
        }
    }
}
Chandler
quelle
2
private void showContacts() {
    if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {
        doShowContacts();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        doShowContacts();
    }
}
user2002721
quelle
2

Ich habe eine erstaunliche Lösung, um dies zu erreichen. Machen Sie eine BaseActivity wie diese.

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                CustomToast.getInstance().setCustomToast("Now you can share the Hack.");

            } else {
                Toast.makeText(this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

}}

Jetzt können Sie den Code aufrufen, um eine solche Erlaubnis anzufordern

 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

Jedes Mal, wenn dies irgendwo passiert, egal ob in Ihrem Fragment oder in einer Aktivität, wird die Basisaktivität aufgerufen.

Vielen Dank

Abhishek Dubey
quelle
1

Sie können verwenden requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);. Verwenden Sie FragmentCompat nicht, wenn Sie v4 verwenden.

Remario
quelle
Bitte erläutern Sie warum.
Platzierbar
1

Einzelheiten

  • Kotlin 1.2.70
  • eingecheckt in minSdkVersion 19
  • Android Studio 3.1.4

Algorithmus

Modul - Kamera, Ort, ....

  1. Überprüfen Sie, ob hasSystemFeature vorhanden ist (falls das Modul im Telefon vorhanden ist).
  2. Überprüfen Sie, ob der Benutzer Zugriff auf das Modul hat
  3. Berechtigungsanforderung senden (Benutzer bitten, die Modulnutzung zuzulassen )

Eigenschaften

  1. Arbeiten Sie mit Aktivitäten und Fragmenten
  2. Hat nur eine Ergebnisantwort
  3. Kann mehrere Module in einer Anfrage prüfen

Lösung

class PermissionType(val manifest_permission: String, val packageManager: String) {
    object Defined {
        val camera = PermissionType(Manifest.permission.CAMERA, PackageManager.FEATURE_CAMERA)
        val currentLocation = PermissionType(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.FEATURE_LOCATION_GPS)
    }
}

class  Permission {

    enum class PermissionResult {
        ACCESS_ALLOWED, ACCESS_DENIED, NO_SYSTEM_FEATURE;
    }

    interface ManagerDelegate {
        fun permissionManagerDelegate(result: Array<Pair<String, PermissionResult>>)
    }

    class Manager internal constructor(private val delegate: ManagerDelegate?) {

        private var context: Context? = null
        private var fragment: Fragment? = null
        private var activity: AppCompatActivity? = null
        private var permissionTypes: Array<PermissionType> = arrayOf()
        private val REQUEST_CODE = 999
        private val semaphore = Semaphore(1, true)
        private var result: Array<Pair<String, PermissionResult>> = arrayOf()


        constructor(permissionType: PermissionType, delegate: ManagerDelegate?): this(delegate) {
            permissionTypes = arrayOf(permissionType)
        }

        constructor(permissionTypes: Array<PermissionType>, delegate: ManagerDelegate?): this(delegate) {
            this.permissionTypes = permissionTypes
        }

        init {
            when (delegate) {
                is Fragment -> {
                    this.fragment = delegate
                    this.context = delegate.context
                }

                is AppCompatActivity -> {
                    this.activity = delegate
                    this.context = delegate
                }
            }
        }

        private fun hasSystemFeature(permissionType: PermissionType) : Boolean {
            return context?.packageManager?.hasSystemFeature(permissionType.packageManager) ?: false
        }

        private fun hasAccess(permissionType: PermissionType) : Boolean {
            return if (Build.VERSION.SDK_INT < 23) true else {
                context?.checkSelfPermission(permissionType.manifest_permission) == PackageManager.PERMISSION_GRANTED
            }
        }

        private fun sendRequest(permissionTypes: Array<String>) {

            if (fragment != null) {
                fragment?.requestPermissions(permissionTypes, REQUEST_CODE)
                return
            }

            if (activity != null){
                ActivityCompat.requestPermissions(activity!!, permissionTypes, REQUEST_CODE)
            }
        }

        fun check() {

            semaphore.acquire()
            AsyncTask.execute {
                var permissionsForSendingRequest: Array<String> = arrayOf()
                this.result = arrayOf()

                for (it in permissionTypes) {
                    if (!hasSystemFeature(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.NO_SYSTEM_FEATURE)
                        continue
                    }

                    if (hasAccess(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                    } else {
                        permissionsForSendingRequest += it.manifest_permission
                    }
                }

                if (permissionsForSendingRequest.isNotEmpty()) {
                    sendRequest(permissionsForSendingRequest)
                } else {
                    delegate?.permissionManagerDelegate(result)
                }
            }
        }

        fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
            when (requestCode) {
                REQUEST_CODE -> {
                    if (grantResults.isEmpty()) {
                        return
                    }
                    for ((i,permission) in permissions.withIndex()) {
                        for (item in this.permissionTypes) {
                            if (permission == item.manifest_permission && i < grantResults.size) {
                                result += if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                                } else {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_DENIED)
                                }
                                break
                            }
                        }
                    }
                    delegate?.permissionManagerDelegate(result)
                }
            }
            semaphore.release()
        }
    }
}

Verwendung in Aktivität (in Fragment gleich)

class BaseActivity : AppCompatActivity(), Permission.ManagerDelegate {

    private lateinit var permissionManager: Permission.Manager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.base_activity)

        permissionManager = Permission.Manager(arrayOf(PermissionType.Defined.camera, PermissionType.Defined.currentLocation), this)
        permissionManager.check()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        permissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    override fun permissionManagerDelegate(result: Array<Pair<String, Permission.PermissionResult>>) {
        result.forEach {
            println("!!! ${it.first} ${it.second}")
//            when (it.second) {
//                Permission.PermissionResult.NO_SYSTEM_FEATURE -> {
//                }
//
//                Permission.PermissionResult.ACCESS_DENIED  -> {
//                }
//
//                Permission.PermissionResult.ACCESS_ALLOWED -> {
//                }
//            }
        }
    }
}
Wassili Bodnarchuk
quelle
1

Hier möchte ich meinen Code zeigen, wie ich das geschafft habe.

public class CheckPermission {

public Context context;

public static final int PERMISSION_REQUEST_CODE =  200;

public CheckPermission(Context context){
    this.context = context;
}

public boolean isPermissionGranted(){
    int read_contact = ContextCompat.checkSelfPermission(context.getApplicationContext() , READ_CONTACTS);
    int phone = ContextCompat.checkSelfPermission(context.getApplicationContext() , CALL_PHONE);

    return read_contact == PackageManager.PERMISSION_GRANTED && phone == PackageManager.PERMISSION_GRANTED;
   }
}

Hier in dieser Klasse möchte ich überprüfen, ob die Erlaubnis erteilt wurde oder nicht. Ist nicht dann werde ich Erlaubnis von meiner MainActivity wie nennen

public void requestForPermission() {
       ActivityCompat.requestPermissions(MainActivity.this, new String[]    {READ_CONTACTS, CALL_PHONE}, PERMISSION_REQUEST_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
                    showMessageOKCancel("You need to allow access to both the permissions",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE},
                                                PERMISSION_REQUEST_CODE);
                                    }
                                }
                            });
                    return;
                }
            }
    }
}

Jetzt müssen Sie in der onCreate-Methode die Funktion requestForPermission () aufrufen.

Das war's auch. Sie können mehrere Berechtigungen gleichzeitig anfordern.

pavel
quelle
1

UPDATE: Die Antwort eines anderen über das Aufrufen super.onRequestPermissionResult()von Activity wurde angezeigt. Dadurch wurde das von mir erwähnte Problem mit dem Anforderungscode behoben und das onRequestPermissionResult des Fragments aufgerufen.

ignoriere dieses Zeug:

Für mich rief es die onRequestPermissionResultAktivität auf, obwohl ich anrief fragment.requestPermission(...), ABER es gab das Ergebnis mit einem falschen requestCode zurück (111 wurde zu 65647 warum ??? Ich werde es nie erfahren).

Glücklicherweise ist dies die einzige Erlaubnis, die wir auf diesem Bildschirm anfordern, daher ignoriere ich einfach den Anforderungscode (ich habe keine Zeit herauszufinden, warum er momentan nicht korrekt ist).

grgrssll
quelle
Fügen Sie 65536 und 111 hinzu und Sie werden es bekommen. Dies liegt an Bitmasken. Siehe einige Themen.
CoolMind
0

Ich habe auch ein Problem festgestellt, dass dieses Problem auch dann auftreten kann, wenn Sie korrekte requestPermissions aufrufen. Das Problem ist, dass übergeordnete Aktivitäten diese Methode möglicherweise überschreiben, ohne super aufzurufen. Füge super hinzu und es wird behoben.

VolodymyrH
quelle