构建签名 APK 时 com.googlecode.libphonenumber:libphonenumber:8.8.2 中缺少元数据

Ash*_*bHi 5 android libphonenumber android-gradle-plugin

我在我的项目中添加了 com.googlecode.libphonenumber:libphonenumber:8.8.2。在调试模式下,它正常工作。但在签名的 apk 中,当调用库方法时会生成以下异常。

Caused by: java.lang.IllegalStateException: missing metadata: /com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BD
    at com.google.i18n.phonenumbers.e.getMetadataFromSingleFileName(SourceFile:188)
    at com.google.i18n.phonenumbers.e.getMetadataFromMultiFilePrefix(SourceFile:116)
    at com.google.i18n.phonenumbers.g.getMetadataForRegion(SourceFile:64)
    at com.google.i18n.phonenumbers.PhoneNumberUtil.getMetadataForRegion(SourceFile:2211)
    at com.google.i18n.phonenumbers.PhoneNumberUtil.getMetadataForRegionOrCallingCode(SourceFile:1330)
    at com.google.i18n.phonenumbers.PhoneNumberUtil.parseHelper(SourceFile:3197)
    at com.google.i18n.phonenumbers.PhoneNumberUtil.parse(SourceFile:3025)
    at com.google.i18n.phonenumbers.PhoneNumberUtil.parse(SourceFile:3015)
    at com.revesoft.itelmobiledialer.util.aq.b(SourceFile:697)ode here
Run Code Online (Sandbox Code Playgroud)

Geo*_*lev 1

也许您已经修复了它,但它可能对其他人有帮助。我遇到了同样的问题,并且已将其修复为库常见问题解答 - 如何在 Android 应用程序中加载 libphonenumber 资源?

一个可能的问题可能是您正在从主线程加载元数据。如果不是这种情况,那么您可以复制应用程序中包含元数据的数据文件夹。创建一个资产文件夹src/main/assets/data。在您首先想要读取数据的应用程序中,创建您自己的元数据加载器,该加载器将从新的目的地读取元数据。这在我发布的链接中进行了描述。库常见问题解答建议从库中删除元数据文件,以免文件重复。

private static PhoneNumberUtil getPhoneNumberUtilInstance()
{
    if(mPhoneNumberUtil == null)
    {
        mPhoneNumberUtil = PhoneNumberUtil.createInstance(new MetadataLoader()
        {
            @Override
            public InputStream loadMetadata(String metadataFileName)
            {
                try
                {
                    String[] stringPieces = metadataFileName.split("/");

                    String metadataName = stringPieces[stringPieces.length - 1];

                    InputStream is = Factory.get().getApplicationContext().getAssets().open("data/" + metadataName);

                    return is;
                }
                catch (IOException e)
                {
                    // Handle somehow!
                    return null;
                }
            }
        });
    }

    return mPhoneNumberUtil;
}
Run Code Online (Sandbox Code Playgroud)