谷歌Play服务升级到13版后,我遇到了一个错误。

70

我该如何解决这个错误?

错误原因:java.lang.illegalargumentexception 11-01 11:08:12.845: E/AndroidRuntime(28885): 错误原因:java.lang.IllegalStateException: 您应用程序的AndroidManifest.xml文件中的meta-data标签没有正确的值。期望值为4030500,但找到了0。您必须在<application>元素内声明以下内容:


google-play-services_lib Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.android.gms"
    android:versionCode="4030530"
    android:versionName="4.0.30 (889083-30)" >

    <uses-sdk android:minSdkVersion="8"/>

</manifest>


public void loginGooglePlus() {
    aHelper.setup(this, GameHelper.CLIENT_APPSTATE | GameHelper.CLIENT_GAMES);
    mHelper = aHelper.getAppStateClient();
    //crash is here
    mHelper.connect();
}


完整的错误日志:

11-01 11:38:13.507: E/AndroidRuntime(31297): FATAL EXCEPTION: main
11-01 11:38:13.507: E/AndroidRuntime(31297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.application.android.aja/com.company.application.android.aja.BeetleBattleAndroidActivity}: java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value.  Expected 4030500 but found 0.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2077)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.os.Looper.loop(Looper.java:154)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread.main(ActivityThread.java:4624)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at java.lang.reflect.Method.invokeNative(Native Method)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at java.lang.reflect.Method.invoke(Method.java:511)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:965)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:732)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at dalvik.system.NativeStart.main(Native Method)
11-01 11:38:13.507: E/AndroidRuntime(31297): Caused by: java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value.  Expected 4030500 but found 0.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.google.android.gms.common.GooglePlayServicesUtil.n(Unknown Source)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.google.android.gms.internal.de.connect(Unknown Source)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.google.android.gms.appstate.AppStateClient.connect(Unknown Source)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.company.application.android.aja.BeetleBattleAndroidActivity.loginGooglePlus(BeetleBattleAndroidActivity.java:153)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at com.company.application.android.aja.BeetleBattleAndroidActivity.onCreate(BeetleBattleAndroidActivity.java:143)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.Activity.performCreate(Activity.java:4509)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1050)
11-01 11:38:13.507: E/AndroidRuntime(31297):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2041)
11-01 11:38:13.507: E/AndroidRuntime(31297):    ... 11 more

1
我也遇到了这个问题,自从今天发布最新的Android SDK工具更新以来。 - Ivo
8
如果你能阅读完整的错误信息,它对于它所期望的内容是相当清晰的,这将有所帮助。你可以直接将其复制粘贴到你的应用程序项目清单中。 - MH.
2
或者安装并使用“Froyo的Google Play服务”。 - Tim
8个回答

154

您需要在清单文件中添加以下内容:

<application>
    <meta-data 
       android:name="com.google.android.gms.version" 
       android:value="@integer/google_play_services_version" />
    ...
</application>

编辑:

这些信息也可以在logcat错误消息以及设置Google Play服务页面中找到 (感谢 Brais Gabin)


4
@ErichDouglass 是的,没错。设置使用Google Play服务的项目。提供带有源引用的答案始终更好 ;). - Brais Gabin
谢谢提供源代码,但是如果你仔细查看logcat,你也可以在那里获取信息。 - Benoit
2
@Benoit 你好,我按照这个答案操作后,出现了一个logcat错误,提示使用Google Play服务需要在您的清单文件中的应用程序标记中添加一个名为“com.google.android.gms.games.APP_ID”的元数据标记 - Ogen
有更多的元数据标签,这个看起来像是您正在使用服务的游戏部分的特定内容。请检查他们的文档。 - Benoit
你需要在清单文件中加入以下两个<meta-data/>元素:
  1. 用于Google API密钥
  2. 用于google_play_services_version。
- Raj Trivedi
@Benoit,你能告诉我吗?我将我的SDK更新到了5.0的棒棒糖版本,并在我的工作区导入了最新的Google Play服务库并添加到项目中以使用地图,但现在出现了错误02-02 01:34:49.659: E/AndroidRuntime(10438): Caused by: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />。 - Erum

23

@Benoit的回答已经给出了确切的解决方案,我在此补充一些知识:

1. 一种方法,就像Benoit所回答的那样,在AndroidManifest.xml文件的应用程序标签中添加以下内容:

<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

2. 我们可以直接添加版本代码,例如:

<meta-data android:name="com.google.android.gms.version" android:value="4030500" />

4030500是版本代码,存储在google-play-services_lib>res>values>version.xml中。

类似于:

<integer name="google_play_services_version">4030500</integer>

结论:最新的Google Play服务需要版本名称,该版本名称需在AndroidManifest.xml文件中使用<meta-data .. />标签来声明。

注意:我强烈建议使用第一种方式。


@JanshairKhan google-play-services_lib>res>values>version.xml - Tarsem Singh
之前我的清单文件中有这个元数据标签: android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyC2IpI158TISY8sV6DyJUkIFv-L_kGpkwE" /> 我收到了这个错误信息。您应用程序的 AndroidManifest.xml 文件中的元数据标记没有正确的值。我更改了元标记,现在出现以下错误:Caused by: java.lang.RuntimeException: API 密钥未找到。请检查 <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/> 是否位于 AndroidManifest.xml 的 <application> 元素中。 - ozmank

4
自您提出问题以来,有一些变化。如果您使用的是Google Play服务7.0或更高版本,则Gradle会自动合并清单并为您包含所需的元数据。
引用Ian Lake的话:

(...) 如果您正在使用Gradle,则Google Play服务7.0还具有另一个节省时间的功能:它会自动包含所需的元数据。

<meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version"/>

对于您的 AndroidManifest.xml,我们会为您添加入口 - 无需手动添加!这是简单清晰的清单合并的完美例子,库可以添加所需的元数据、接收器、权限和其他任何可能需要的内容 - 少了一件要忘记的事情!

注意:这不适用于完整的 play-services 或 play-services-all-wear AARs - 只有粒度更细的 AARs 中内置了此功能。


2

请确保将以下两个元数据标签添加到“您”的应用程序的AndroidManifest.xml中

<meta-data 
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="YOUR_API_KEY"/>
<meta-data 
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/>

这个解决方案对我很有用。

这个回答对一年多以前已经存在并被接受的答案没有任何有意义的补充。 - Mephy
是的,可能吧。但我按照帖子做了,却感到困惑。我们在谷歌游戏服务库的清单文件中也有<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>。对于初学者来说,他们可能会困惑是否要将此标签添加到自己的应用程序的androidManifest.xml中(因为它已经存在于谷歌游戏服务库中,该库已添加到我们的项目库中,可能会导致重复)。我希望这两个语句能更清楚地解释现有和接受的答案。 :) - vaaa
@vaaa:你最好将那个解释融入到答案中,这样会更有机会;评论应该是相对容易被忽略的。 - Nathan Tuggy
至少,我已经发布了比直接发布评论更好的东西...这个博客旨在发布您的编码经验,可以是任何形式的评论或答案。 :) - vaaa

2

我将我的现有项目从Eclipse导入到Android Studio中,在Eclipse项目中,Integers.xml包含以下硬编码值:

<integer name="google_play_services_version">5089000</integer>

在使用Android Studio构建最新版本的Play服务时,可能会导致版本冲突。如果从Integers.xml文件中删除这行代码,则可以解决该问题。


2

我在包含的Google服务副本的res/values文件夹中创建了一个名为"version.xml"的文件,并复制了以下代码:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
<integer name="google_play_services_version">4030500</integer>
</resources>

原始副本缺少文件,这并没有解决我的问题。


1
这是一个不好的做法,因为你可能拥有不同版本的Play服务。 - Benoit

1
如果您仍然遇到错误,请尝试这个方法。 它对我有效。
<meta-data
    tools:replace="android:value"
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

-1
<application> 标签闭合后添加 <meta-data>,这样可以解决我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接