【发布时间】:2017-05-31 17:16:20
【问题描述】:
我的 Android 应用从片段中启动应用内购买界面,如下所示:
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));
在我将 targetSdkVersion 从 23 增加到 25 以添加一些 Android 7 功能之前,这一切正常。现在startIntentSenderForResult 行抛出这个异常:
java.lang.IllegalArgumentException: 只能使用低 16 位 请求代码
这意味着请求代码(该方法的第二个参数)的限制为 65,535。但是从 ids.xml 文件随机生成的R.id.buyUpgradeResponse 的值类似于 20,000,000。有没有办法限制 Android 用于随机生成的资源 ID 的范围?
Another SO answer 表示此错误仅在使用 android.support.v4.app.FragmentActivity 时发生。我的活动都使用扩展AppCompatActivity 的基本活动,扩展android.support.v7.app.AppCompatActivity,扩展android.support.v4.app.FragmentActivity。所以另一种方法是消除我对 support.v4 类的依赖。但我害怕做出可能对我的应用程序的任何部分产生意想不到的后果的全局更改。 (如果重要的话,我的 minSdkVersion 是 15。)
我也可以将 R.id.buyUpgradeResponse 替换为硬编码的 ID,但恐怕应用程序中的其他地方也有同样的问题,这并不能解决问题的所有实例。
更新
我刚刚确认我的构建设置的更改是引发问题的原因。我之前的设置没有出现这个问题:
compileSdkVersion 23
buildToolsVersion '25.0.2'
minSdkVersion 15
targetSdkVersion 23
compile "com.android.support:appcompat-v7:23.0.0"
当我更新这些设置时问题开始了:
compileSdkVersion 25
buildToolsVersion '25.0.2'
minSdkVersion 15
targetSdkVersion 25
compile "com.android.support:appcompat-v7:25.3.1"
更新 2
我在实现Storage Access Framework 时又遇到了这个问题。 startActivityForResult 生成了无效 ID 异常,因为随机生成的 ID 是 2000 万左右。我的应用程序中的其他功能,例如在弹出窗口中打开片段,使用这些 ID 没有任何抱怨,但 SAF 意图不会。我最终为 SAF 意图硬编码了更多 ID。我认为最好的解决方案是将随机生成的 ID 的范围限制在所有框架都支持的范围内,但我看不到这样做的方法。
【问题讨论】:
-
框架片段/活动对其 requestCode 有相同的要求,因此不使用支持库对您没有帮助。为什么你一开始就使用 id 而不是你定义的几个常量?
-
“你为什么使用 ids” - 我有几十个带有 ID 参数的警报和弹出窗口,所以我刚刚将项目添加到 ids.xml 文件中。跨度>
-
看起来
Fragment.startActivityForResult()和DialogFragment.setTargetFragment()仍然可以正常使用自动生成的 ID,所以也许我只需要为Activity. startIntentSenderForResult()硬编码一个 ID,我只使用它目前在一个地方。
标签: android android-activity android-support-library android-resources android-7.1-nougat