java.lang.IllegalArgumentException: 请求代码只能使用低16位

65

我正在编写一个应用程序,其中Activity A使用

startActivity()

启动Activity B

startActivityForResult(intent, -101);

但是当调用时,它会返回以下错误日志:

E/AndroidRuntime( 1708): java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
E/AndroidRuntime( 1708):    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:837)

可能是-101,但我不确定。有人对此有任何想法吗?


1
将-101变成一个正数? - Simas
1
只能使用低16位作为requestCode:这意味着请求代码应该大于0 尝试startActivityForResult(intent, 101); - zapdroid
1
尝试这个解决方案:https://dev59.com/vZjga4cB1Zd3GeqPKG5b#44271392 - Maher Abuthraa
9个回答

141

在使用android.app.Activity时不会出现此异常,而只有在android.support.v4.app.FragmentActivity中使用时才会出现。

FragmentActivity中的startActivityForResult()要求requestCode为16位,即范围为0-65535。

此外,FragmentActivity中的validateRequestPermissionsRequestCode要求requestCode为16位,即范围为0-65535。

更多信息(如果您想查看源代码): https://dev59.com/u1wX5IYBdhLWcg3w0iUc#33331459


3
谢谢Henry,这是一个更完整的回答。 - darkangelo

90

如果您正在使用 ActivityResult API,请添加此依赖项以解决此问题:

implementation "androidx.fragment:fragment:1.3.4"

谢谢!你应该把这个放到一个自问自答的问题里,这样其他人就可以很容易地找到它了。 - LukeWaggoner
3
不知怎么的,但你需要将这两个依赖项合并在一起。implementation 'androidx.activity:activity-ktx:x.x.x' implementation 'androidx.fragment:fragment-ktx:x.x.x' - Mina Samir
为什么他们告诉我们需要多少依赖项来添加新功能?Google文档太烂了!顺便说一声,谢谢你的帮助。 - Maulik Dodia
不知道为什么错误信息不够具体。无论如何,谢谢你。你是我的英雄 <3 - Victor Ude

35

值得一提的是,如果您使用的数字大于2^16 / 2(即32768),那么可能会出现这种情况,因此基本上有2^15个选项可以避免出错。

解释:16位可以表示65536个数字之一,但其中一半是负数。


1
限制是65535而不是32768。 - Henry
@Henry 是的,负数没有被使用。 - Afrig Aminuddin

29
你需要向 startActivityForResult 方法传递一个正数。

2
虽然这是正确的,但下面的答案更具体。+1 - Julius

28

对于那些正在使用新的ActivityResult API的人,

如果您正在使用新方式(ActivityResult)打开新的Activity。

registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 
    result ->
}

你需要同时使用以下两个依赖项

implementation 'androidx.activity:activity-ktx:1.2.0-rc01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-rc02'

7
当不使用片段实现时使用它有点奇怪,但是它可以与其一起使用。 - Ivan Lopes
我认为稳定版本会解决这个问题。 - Shaon
3
抱歉让你失望了,他们并不会这样做。 - Zacki
1
这些改动只是让事情变得越来越混乱。 - Bitwise DEVS

13

在requestCode中,您只能使用低16位 -- 用二进制术语表示 -- 您可以使用

0000000000000000 (16位) 到 1111111111111111 (16位) [ 二进制 ].

同样地,

0 到 65535 [ 十进制 ].

以十进制 ("数字") 表示,这允许 2^16 = 65536 种组合。因此,您只能使用从0到65535的数字。

您也不能使用负数。


4

正确的答案是你应该使用16位数字来完成这个目的。最安全的解决方案是始终将请求代码设置为short。如果程序员尝试编写超过16位的数字,那么IDE将不允许您继续进行,因为会出现错误。


2

只需添加activityforresult API的两个主要依赖项

对于kotlin

implementation 'androidx.activity:activity-ktx:1.3.0-alpha03'
implementation 'androidx.fragment:fragment-ktx:1.3.0'

对于Java

implementation 'androidx.activity:activity:1.3.0-alpha03'
implementation 'androidx.fragment:fragment:1.3.0'

检查此处获取最新版本。


1

只需添加

对于 Kotlin

implementation 'androidx.fragment:fragment-ktx:1.3.3'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接