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做了最佳实践
答案 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类型。我希望这会对你有所帮助。