我的Android应用程序从片段启动应用内购买界面,如下所示:
[@disabled="disabled"]
此操作正常,直到我将Bundle responseBundle = this.billingService.getBuyIntent(3, getPackageName(), id, "inapp", StringUtils.randomString(32));
PendingIntent pendingIntent = responseBundle.getParcelable("BUY_INTENT");
fragment.getActivity().startIntentSenderForResult(pendingIntent.getIntentSender(), R.id.buyUpgradeResponse, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
从23增加到25以添加一些Android 7功能。现在targetSdkVersion
行引发了这个异常:
java.lang.IllegalArgumentException:只能使用低16位 requestCode
这意味着请求代码(该方法的第二个参数)的限制为65,535。但是,从{ids.xml文件中随机生成的startIntentSenderForResult
的值大约为20,000,000。有没有办法限制Android用于随机生成的资源ID的范围?
Another SO answer表示只有在使用R.id.buyUpgradeResponse
时才会出现此错误。我的所有活动都使用扩展android.support.v4.app.FragmentActivity
的基本活动,扩展AppCompatActivity
,扩展android.support.v7.app.AppCompatActivity
。所以另一种方法是消除我对support.v4类的依赖。但是我害怕做出一个全局性的改变,可能会在我的应用程序的任何部分产生意想不到的后果。 (我的minSdkVersion是15,如果重要的话。)
我也可以用硬编码的ID替换R.id.buyUpgradeResponse,但我担心应用程序中还有其他地方存在同样的问题,并且无法解决问题的所有实例。
更新
我刚刚确认对构建设置的更改是触发问题的原因。我之前的设置没有出现此问题:
android.support.v4.app.FragmentActivity
更新这些设置时问题就出现了:
compileSdkVersion 23
buildToolsVersion '25.0.2'
minSdkVersion 15
targetSdkVersion 23
compile "com.android.support:appcompat-v7:23.0.0"
更新2
我在实施Storage Access Framework时又遇到了这个问题。 compileSdkVersion 25
buildToolsVersion '25.0.2'
minSdkVersion 15
targetSdkVersion 25
compile "com.android.support:appcompat-v7:25.3.1"
生成了无效ID异常,因为随机生成的ID为2000万。我的应用程序中的其他功能,比如在弹出窗口中打开片段,使用这些ID而没有投诉,但SAF意图不会。我最终为SAF意图硬编码了更多的ID。我认为最好的解决方案是将随机生成的ID的范围限制在所有框架支持的范围内,但我没有看到这样做的方法。
答案 0 :(得分:0)
我发现,如果我从片段而不是片段的活动开始活动,则不会发生此问题。因此,这引发了问题:
fragment.getActivity().startIntentSenderForResult(pendingIntent.getIntentSender(), R.id.buyUpgradeResponse, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
但这很好:
fragment.startIntentSenderForResult(pendingIntent.getIntentSender(), R.id.buyUpgradeResponse, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
也许这是有逻辑的,但我不知道这是什么。