Java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable 这是一个关于IT技术的问题标题。

53

我正在使用谷歌地图创建一个安卓应用,以下是代码:

MapFragActivity.java

 import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.SupportMapFragment;

    public class MapFragActivity extends FragmentActivity {

    private GoogleMap map;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map_frag);

        map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
     }
    }

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.him.mapfrag_rnd"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="11"
            android:targetSdkVersion="15" />


        <permission
            android:name="com.him.mapfrag_rnd.permission.MAPS_RECEIVE"
            android:protectionLevel="signature" />

        <uses-permission android:name="com.him.mapfrag_rnd.permission.MAPS_RECEIVE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

          <uses-feature
            android:glEsVersion="0x00020000"
            android:required="true" />


        <application
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MapFragActivity"
                android:label="@string/title_activity_map_frag" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <meta-data
                android:name="com.google.android.maps.v2.API_KEY"
                android:value="my_api_key" />

        </application>

    </manifest>

活动地图片段.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

    <fragment
      android:id="@+id/map"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

    </RelativeLayout>
当我尝试运行这段代码时,出现了错误,以下是日志记录:
01-17 10:01:17.685: E/AndroidRuntime(8923): FATAL EXCEPTION: main
    01-17 10:01:17.685: E/AndroidRuntime(8923): java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown Source)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:279)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:272)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.Activity.setContentView(Activity.java:1835)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.him.mapfrag_rnd.MapFragActivity.onCreate(MapFragActivity.java:16)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.Activity.performCreate(Activity.java:4470)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.os.Looper.loop(Looper.java:137)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at android.app.ActivityThread.main(ActivityThread.java:4511)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at java.lang.reflect.Method.invoke(Method.java:511)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:986)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:753)
    01-17 10:01:17.685: E/AndroidRuntime(8923):     at dalvik.system.NativeStart.main(Native Method)

我在MapFragActivity.java中做了一些更改,然后地图显示了出来。这里是更改的内容:

package com.him.mapfrag_rnd;

    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;

    import com.google.android.gms.maps.SupportMapFragment;

    public class MapFragActivity extends FragmentActivity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //setContentView(R.layout.activity_map_frag);
          SupportMapFragment fragment = new SupportMapFragment();
          getSupportFragmentManager().beginTransaction().add(android.R.id.content, fragment).commit();
        }
    }
我所做的更改是注释掉了setContentView。我已经按照所有必要的步骤进行操作,但仍然出现错误。如果取消注释setContentView(),那么我就会再次遇到错误。
请帮忙!

1
我已经在这里回答了关于这个问题的内容。 - Ramz
1
我有同样的问题。这是答案的链接 https://dev59.com/5uo6XIcBkEYKwwoYNBln#15894284 对我有用! - Marian
@Ramz,你忘记了重要的问题,即共识需要你的代码扩展类并正确实现接口以达到不可否认的条件的重要性。这是我公司的优先事项。我通过这个解决方案减少了85%的代码重构。 - user4536971
我想补充一点:你的工作区路径不应该包含空格。我曾经把我的工作区放在Windows的Google Drive桌面文件夹中,由于"Google"和"Drive"之间有空格,我的GoogleMap项目一直崩溃并显示错误信息“R stylable not found”。我尝试了Stack Overflow和互联网上的所有解决方案,但都没有成功。后来我在Dropbox文件夹中创建了一个新的工作区(感谢某个评论),然后它就奇迹般地正常运行了。 - Ashok Bijoy Debnath
https://dev59.com/UJLea4cB1Zd3GeqP5Kgt - Shirish Herwade
12个回答

74
如果你正在使用Intellij Idea,
  1. 从项目面板中选择您的项目
  2. 按F4键打开项目结构窗口
  3. 从左侧面板选择模块,然后点击+按钮,选择“导入模块”,并导航到ANDROID-SDK/extras/google/google_play_services/libproject/google-play-services_lib。通过这样做,此项目将与您的项目一起添加到模块中
  4. 选择您的项目,然后从右侧面板选择“依赖项”(它是一个选项卡)。单击+按钮,然后选择“3个模块依赖项...”,并选择“google-play-services_lib”。
  5. 再次单击+按钮,然后选择“1个jar或目录...”,并导航到上述路径中的“/libs”文件夹,选择“google-play-services.jar”。
  6. 单击确定并关闭项目结构窗口。
注意:确保您没有将“google-play-services_lib”项目添加为“库”在“库”中(模块下的左侧面板)。 如果您有,则可以进入“”并将其删除。 Google Play Library不应出现在库中注意2:如果您希望将其纳入版本控制或类似事项中,则可以将整个google-play-services_lib目录复制到自己的项目中。

我还必须勾选google-play-services.jar的导出框才能让我的项目正常工作。 - NightWatchman
1
我在IntelliJ中尝试了这些步骤,但出现了以下构建错误:“ Android Dex:UNEXPECTED TOP-LEVEL EXCEPTION:Android Dex:java.lang.IllegalArgumentException:already added:Landroid/UnusedStub;” - IgorGanapolsky
1
@dart 请确保您没有重复的库文件。例如,如果您正在使用Facebook的SDK,则在其libs文件夹中有自己的支持库。如果您在项目中使用支持库,则编译器会抛出错误。解决方案是将您的项目和Facebook(以及其他模块,如果您有)指向一个支持库文件。 - Hesam
我已经解决了这个问题,将Android SDK设置为8(原本是18)。这可能是一个提示。 - Pavel Vyazankin

40

1
嗨..我只导入了jar文件,因为当我导入整个play服务库时遇到了一个非常大的问题,它会给我一个“找不到要导入的项目”的错误。 - Gaurav Arora
@GauravArora 你说的“找不到要导入的项目”是什么意思?你使用的是哪个IDE——Android Studio还是Eclipse?你是否从sdk/android/extras/google/google_play_services/libproject导入了google-play-services库? - IgorGanapolsky
是的,从SDK位置。 - Gaurav Arora
@Himanshu 但是你如何解决组织代码层面的问题?监控消费者偏好有助于发现许多错误和问题。涉及哪些变量的调查? - user4536971

6

我遇到了同样的错误。我使用的是Android Studio和Gradle,因此没有太多需要配置或改进的东西。我已经尝试了几乎所有的方法,但它们都对我无效。最后一个方法有效:用较小的包替换整个play-services包。在我的情况下:

替换(在build.gradle文件中):

compile 'com.google.android.gms:play-services:8.4.0'

by:

// Google Cloud Messaging
compile 'com.google.android.gms:play-services-gcm:8.4.0'

// Google Location
compile 'com.google.android.gms:play-services-location:8.4.0'

6
我认为你需要将整个Google Play服务库导入到你的IDE中,而不仅仅是.jar文件。
试一下吧;-)

嗨..我只导入了一个jar文件,因为当我导入整个play服务库时遇到了一个非常大的问题,它给我报“找不到要导入的项目”的错误。 - Gaurav Arora
尝试解决它,我认为这是正确的解决方案!加油! - cesards

6
我也在Android Studio中遇到了这个错误,我已经使用Gradle Alpha5包含了Play Services Alpha 3,但我的错误在于我还包含了Multidex。
在Gradle中:
multiDexEnabled true 并且在Application类的onCreate方法中:

MultiDex.install(this);

但我忘记了使用MultiDexApplication扩展Application类

因为MultiDexApplication没有被扩展,所以它不能包括gms和任何其他dex类,因此在启动gms String时出现错误。

希望this有所帮助


5

我解决了这个问题,首先检查播放服务库是否被正确添加,并在应用程序标签下的清单文件中添加以下数据:<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />


4
检查你的google-play-services_lib项目的AndroidManifest.xml文件。应该是这样的:
package="com.google.android.gms"

包名称对于不同的项目是否有所不同?如果是这样的话,那么这是错误的,切勿作弊。 - user2649058

2
  1. 使用Android SDK管理器下载“Google Play服务”。

  2. 将其导入到您的工作区中(路径:android-sdk根目录/ extras / google / google_play_service / libproject / google-play-service_lib)。

  3. 项目属性 -> Android -> 库添加google-play-service_lib。

  4. 构建路径 -> 顺序和导出选中Android私有库。


1
如果您正在使用分离的Google Play服务(请参见此处: https://developers.google.com/android/guides/setup#split),您需要将基本播放服务包含在gradle文件中:
compile 'com.google.android.gms:play-services-base:7.5.0'

使用Google Play服务可以防止65k错误并使您的应用程序更小


1

这对我有用。实际上,我只是从我的以前的工作区导入了Google Play服务,但没有复制到现有的工作区:D 无论如何,谢谢:) - Darshan Gowda

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