仅限华为手机上的多个NotFoundException

mak*_*tar 5 android android-resources

我已经注意到我的应用程序在华为手机的生产中有很多崩溃报告,这些报告与复数处理完全相关.没有其他手机有这个问题,只有华为.

所有复数形式都存在并在其他设备上正常工作.

似乎华为根本无法处理复数:

android.content.res.Resources$NotFoundException: Plural resource ID #0x7f060000 quantity=4 item=few
       at android.content.res.Resources.getQuantityText(Resources.java:290)
       at android.content.res.Resources.getQuantityString(Resources.java:397)
       ...

android.content.res.Resources$NotFoundException: Plural resource ID #0x7f060000 quantity=6 item=many
       at android.content.res.Resources.getQuantityText(Resources.java:290)
       at android.content.res.XResources.getQuantityText(XResources.java:667)
       at android.content.res.Resources.getQuantityString(Resources.java:397)
       ...
Run Code Online (Sandbox Code Playgroud)

有人也有这个问题吗?

sky*_*sky 2

根据分析报告,我遇到过此类问题。同样的问题 - 没有华为设备。

\n\n

给定的设备列表上发生了这种情况:\n- 华为 G700-U10 Ascend G700\n- 华为 G700-U20 Ascend G700\n- 华为 G610-U20 Ascend

\n\n

堆栈跟踪:

\n\n
android.content.res.Resources$NotFoundException: Plural resource ID #0x7f0d0000 quantity=5 item=many\n    at android.content.res.Resources.getQuantityText(Resources.java:290)\n    at android.content.res.Resources.getQuantityString(Resources.java:397)\n    at com.sixthsensegames.client.android.app.activities.TournamentInfoActivity2$a$1.run(SourceFile:2233)\n    at android.os.Handler.handleCallback(Handler.java:725)\n    at android.os.Handler.dispatchMessage(Handler.java:92)\n    at android.os.Looper.loop(Looper.java:153)\n    at android.app.ActivityThread.main(ActivityThread.java:5341)\n    at java.lang.reflect.Method.invokeNative(Native Method)\n    at java.lang.reflect.Method.invoke(Method.java:511)\n    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)\n    at dalvik.system.NativeStart.main(Native Method) \n
Run Code Online (Sandbox Code Playgroud)\n\n

我查看了资源类来澄清问题并找到任何解决方法。

\n\n
public CharSequence getQuantityText(@PluralsRes int id, int quantity)\n        throws NotFoundException {\n    NativePluralRules rule = getPluralRule();\n    CharSequence res = mAssets.getResourceBagText(id,\n            attrForQuantityCode(rule.quantityForInt(quantity)));\n    if (res != null) {\n        return res;\n    }\n    res = mAssets.getResourceBagText(id, ID_OTHER);\n    if (res != null) {\n        return res;\n    }\n    throw new NotFoundException("Plural resource ID #0x" + Integer.toHexString(id)\n            + " quantity=" + quantity\n            + " item=" + stringForQuantityCode(rule.quantityForInt(quantity)));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据此代码,如果给定数量没有找到复数规则,则将给出规则为“OTHER”的复数(在我们得到例外之前)。我将“其他”项(规则)添加到 strings.xml 中的复数定义中。更新了应用程序,从那时起我没有从该设备列表中收到任何此类异常的报告。

\n\n

就我而言,它是俄语语言环境:

\n\n
<plurals name="career_tournament_goal_wins_left">\n    <item quantity="one">\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbb\xd0\xb0\xd1\x81\xd1\x8c %1$s \xd0\xbf\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4\xd0\xb0</item>\n    <item quantity="few">\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8c %1$s \xd0\xbf\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4\xd1\x8b</item>\n    <item quantity="many">\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8c %1$s \xd0\xbf\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4</item>\n    <item quantity="other">\xd0\xbe\xd1\x81\xd1\x82\xd0\xb0\xd0\xbb\xd0\xbe\xd1\x81\xd1\x8c %1$s \xd0\xbf\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4</item> <!-- for Huawei G700-u20 -->\n</plurals>\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不是万能药,但至少可以作为解决方法。

\n\n

快乐编码...

\n