Des méthodes comme ActivityCompat.requestPermissions
requiert que je leur transmette un code de requête que je pourrai tester ultérieurement lors d'un rappel (dans ce cas onRequestPermissionsResult
). Existe-t-il une sorte de valeur de meilleure pratique que je suis censé transmettre dans le code de demande? J'ai remarqué que si je saisis simplement un int
aléatoire, j'obtiens parfois une erreur comme celle-ci:
Java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: FATAL EXCEPTION: main
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: Process: my package, PID: 8315
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: Java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage.myactivity}: Java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2416)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2476)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.-wrap11(ActivityThread.Java)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1344)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.os.Handler.dispatchMessage(Handler.Java:102)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.os.Looper.loop(Looper.Java:148)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.main(ActivityThread.Java:5417)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Java.lang.reflect.Method.invoke(Native Method)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: Caused by: Java.lang.IllegalArgumentException: Can only use lower 8 bits for requestCode
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.support.v4.app.FragmentActivity.validateRequestPermissionsRequestCode(FragmentActivity.Java:799)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompat23.Java:29)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.Java:316)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at mypackage.myactivity.checkReadPhoneState(PermissionsGatewayActivity.Java:48)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at mypackage.myactivity.onCreate(PermissionsGatewayActivity.Java:36)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.Activity.performCreate(Activity.Java:6237)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1107)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2369)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2476)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.-wrap11(ActivityThread.Java)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1344)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.os.Handler.dispatchMessage(Handler.Java:102)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.os.Looper.loop(Looper.Java:148)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Android.app.ActivityThread.main(ActivityThread.Java:5417)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at Java.lang.reflect.Method.invoke(Native Method)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
10-25 16:47:43.652 8315-8315/? E/AndroidRuntime: at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Documenter les résultats pour référence future:
Voici le code de Android.support.v4.app.FragmentActivity
/**
* Modifies the standard behavior to allow results to be delivered to fragments.
* This imposes a restriction that requestCode be <= 0xffff.
*/
@Override
public void startActivityForResult(Intent intent, int requestCode) {
if (requestCode != -1 && (requestCode&0xffff0000) != 0) {
throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
}
super.startActivityForResult(intent, requestCode);
}
@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");
}
}
PLAGE startActivityForResult()
dans FragmentActivity
requiert que le requestCode soit de 16 bits, ce qui signifie que la plage est de à 65535.
De plus, validateRequestPermissionsRequestCode
dans FragmentActivity
requiert que requestCode soit de 16 bits, ce qui signifie que la plage va de à 65535.