Android元数据:大型int不被视为String

时间:2014-12-04 09:47:08

标签: android manifest

Android提供了在清单中定义meta-data的解决方案。我认为对于正在构建SDK的人来说,这是一个非常好的解决方案。 为什么?因为如果你必须在String文件中定义一组特定的键,那么只在Manifest中设置它们会更好。它们更适合应用程序,并且对于在项目中实现SDK的开发人员更友好,因为他们只需要在清单中添加一些而不是编辑两个或者只有api key/sender_id的更多文件。

所以到了

我希望用户在其清单中放置一个大号,以便我可以检索它并从SDK中检索它。

<meta-data
        android:name="com.example.projectId"
        android:value="385167817594" />

这是我检索元数据的代码。其中META_PROJECT_ID = com.example.projectId

String pkgName = mContext.getPackageName();
Bundle bundle = mContext.getPackageManager().getApplicationInfo(pkgName, PackageManager.GET_META_DATA).metaData;
String projectId = bundle.getString(META_PROJECT_ID); 

此代码适用于清单中定义的所有其他值。但有趣的是,从清单中检索值时,看起来有些解析是在中间完成的。即使我getString(..),它也会返回int而不是String,因为projectId只包含数字且不是alphanumric。如果我在清单中定义的projectId值中添加一个字母,它将返回一个String。 示例: 385167817594 a

我认为这对我们大多数人来说不是问题。他们将执行getInt,然后在必要时将其转换为String。 但是这个int太大了。 Bundle甚至没有在调试器中显示正确的值。它显示一个大的负数(Integer.MIN_VALUE),可能表示解析出错了?

其他人是如何做到的?

Facebook我遇到了同样的问题。他们做了以下几点:

清单(例如)

<meta-data
        android:name="com.example.projectId"
        android:value="@string/project_id" />

的strings.xml

<string name="project_id">385167817594</string>

有谁知道为什么Facebook决定像这样解决它?我的意思是现在你必须编辑两个文件并从清单引用到字符串清单。

Facebook真的没有解决方案,或者Facebook做了什么best practice

现在我会像Facebook那样做,但我真的很好奇,如果有任何解决方案,如果Facebook做了最佳实践

2 个答案:

答案 0 :(得分:1)

更改

<meta-data android:name="com.example.projectId" android:value="385167817594" />

<meta-data android:name="com.example.projectId" android:value="38516781759\u0034" />

用数字4代替\ u0034

替换数字4

答案 1 :(得分:-1)

我用Facebook SDK检查了这个,他们不用它作为int,它是String。 从facebook sdk for Android查看以下代码。

public static String getMetadataApplicationId(Context context) {
    Validate.notNull(context, "context");

    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(
                context.getPackageName(), PackageManager.GET_META_DATA);
        if (ai.metaData != null) {
            return ai.metaData.getString(Session.APPLICATION_ID_PROPERTY);
        }
    } catch (PackageManager.NameNotFoundException e) {
        // if we can't find it in the manifest, just return null
    }

    return null;
}

如果要使用它,请将其用作String。然后尝试将其转换为double或long类型。我希望这会对你有所帮助。