30

Metody takie jak ActivityCompat.requestPermissions wymagają, aby przekazać im kod żądania, który mogę później przetestować w wywołaniu zwrotnym (w tym przypadku onRequestPermissionsResult). Czy jest jakaś dobra praktyka, jakąś wartość, którą powinienem podać w kodzie żądania? Zauważyłem, że jeśli po prostu wprowadzić losowy int czasami pojawia się błąd jak poniżej:Android: co wybrać dla wartości kodu żądania?

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)  
+3

Wpisz kod żądania od 1 do 255. –

+1

co to znaczy? Czy teoretycznie nie można mieć więcej niż 256 żądań działających równolegle? (byłoby to śmieszne) – Jon

+0

Myślę, że ta liczba jest wystarczająca w realnym scenariuszu. –

Odpowiedz

77

dokumentowania ustaleń dla przyszłości:

Poniższy kod są od 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"); 
    } 
} 


ZAKRES
startActivityForResult() w FragmentActivity wymaga requestCode się z 16 bitów, to znaczy w zakresie od 0 do 65535 .

Również validateRequestPermissionsRequestCode w FragmentActivity wymaga requestCode się z 16 bitów, to znaczy w zakresie od 0 do 65535 .

+1

Zasięg zmienił się. https://android.googlesource.com/platform/frameworks/support/+/86f3b80ddf7f9aa5c5b7afe77217cb75632d62a2 – Toris

+0

@Toris Thanks. Zaktualizowałem moją odpowiedź. – Henry