Java 为什么ActivityCompat.requestPermissions()只接受0-255之间的整数请求代码?
我最近将一个应用程序更新为targetSdkVersion 23,并实现了对各种权限的请求。我最初尝试使用导致从FragmentActivity的内部抛出IllegalArgumentException:Java 为什么ActivityCompat.requestPermissions()只接受0-255之间的整数请求代码?,java,android,android-support-library,android-permissions,Java,Android,Android Support Library,Android Permissions,我最近将一个应用程序更新为targetSdkVersion 23,并实现了对各种权限的请求。我最初尝试使用导致从FragmentActivity的内部抛出IllegalArgumentException: int REQUEST_CODE_A = 9001; ActivityCompat.requestPermissions(new String[ {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_A); // crashes java.la
int REQUEST_CODE_A = 9001;
ActivityCompat.requestPermissions(new String[ {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_A); // crashes
java.lang.IllegalArgumentException:只能对请求代码使用较低的8位
但是,如果请求代码在0-255之间,则一切正常,权限请求按预期工作
int REQUEST_CODE_B = 101;
ActivityCompat.requestPermissions(new String[ {Manifest.permission.WRITE_CONTACTS}, REQUEST_CODE_B); // works correctly
所以问题是,在API中限制整数的可能值有什么原因?同样的信息可以用字节来提供,但是(显然)有意识地决定用整数来代替。这仅仅是允许将来扩展的一种情况吗?引用出现此异常的地方:
// We use 8 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.
startActivityForResult()
对请求代码有16位限制,至少在FragmentActivity
这种情况下,8位和16位限制优化是否可能重复?我不确定为什么两个“独立”的值会存储在一个变量中。@Fractal扳手:“我不确定为什么两个“独立”的值会存储在一个变量中”--因为startActivityForResult()
是IPC,就像onActivityResult()
一样。并且,协议表示请求代码是一个值,在startActivityForResult()
中提供,在onActivityResult()中返回。一种更灵活的方法是让我们传递任意的可包裹的东西,然后把可包裹的东西(或者,从技术上说,一份副本)拿回来,但是,不管出于什么原因,他们十年前没有这样做。