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

Missing Meta data in com.googlecode.libphonenumber:libphonenumber:8.8.2 while building signed APK

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

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

可能您已经修复了它,但它可能会对其他人有所帮助。我有同样的问题,我已将其修复为库 FAQs - 如何在我的 Android 应用程序中加载 libphonenumber 资源?

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

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;
}