使用带有SDK 25的startIntentSenderForResult的资源ID无效

时间:2017-05-31 17:16:20

标签: android android-activity android-support-library android-resources android-7.1-nougat

我的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的范围限制在所有框架支持的范围内,但我没有看到这样做的方法。

1 个答案:

答案 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));

也许这是有逻辑的,但我不知道这是什么。