#FragmentActivityのstart~ForResult()などは、requestCodeの範囲に制限がある。
リファレンスに書いてないので、(support.v4を使う場合は)要注意。
##requestCodeの範囲
[support.v4.app.FragmentActivity]
startActivityFromFragment()に関連するもの:16bit(0~65535?)
onActivityResult()に関連するもの:16bit(0~65535?)
requestPermissionsFromFragment()、
onRequestPermissionsResult()などに関連するもの:16bit(0~65535?)
※旧ソースでは8bit(0~255)
※詳細は・・FragmentActivityなどの、ソースコードを参照。
該当箇所は、あちこちに散らばっている。
(FragmentActivity以外では、BaseFragmentActivityGingerbreadなど。)
検索キーワード:
checkForValidRequestCode
requestCode
ffff
>> 16
-1
など。
##処理待ちのフラグメント数の上限
support.v4.app.FragmentActivityの処理待ちのフラグメント数は、
allocateRequestIndex()で制限されている。
(管理用のインデックスの上限は65534。requestCodeの上位16bitに、このインデックスを格納している。)
#補足1 エラーの例
この制限にかかると、startIntentSenderForResult()などを呼んだ時に、
java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
などが表示されます。
#補足2 範囲制限の原因
FragmentActivityで、requestCodeの一部を、フラグメントの管理(上側16bit)などに使っているから。
※旧ソースでは、24(16+8)bit
#補足3 FragmentのstartActivityForResult()なども、requestCodeに制限がある
android.app.Fragment、android.support.v4.app.Fragmentともに、
startActivityForResult()、startIntentSenderForResult()、startIntentSenderForResult()などの引数のrequestCodeは、-1のみに制限されている。
Fragment.startActivityForResult()
-> FragmentHostCallback.onStartActivityFromFragment()
が呼ばれて、ここで制限される。
詳細は、ソース参照で。
#参考
[Stackoverflow - Android: what to choose for requestcode values?]
http://stackoverflow.com/questions/33331073/android-what-to-choose-for-requestcode-values
※一部、旧ソースが含まれるので注意
変更があったのは、このあたり。
[Git repositories on android]
変更ログ - 86f3b80 Dispatch onRequestPermissionsResult to child fragments
https://android.googlesource.com/platform/frameworks/support/+/86f3b80ddf7f9aa5c5b7afe77217cb75632d62a2
[FragmentActivity.javaの変更ログ]
https://android.googlesource.com/platform/frameworks/support/+log/refs/heads/master/v4/java/android/support/v4/app/FragmentActivity.java