Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Maps Android v2 not working with ActionBarSherlock Fragment Activity

I've followed the steps on Using ActionBarSherlock With the New SupportMapFragment to use the new Google Maps Android v2 API, but I'm getting some errors that is causing the application to crash on startup.

I'm using Maven on my application, so I'm posting my AndroidManifest and POM files too.

Can you help me please?

Here's the error from logcat:

12-22 14:35:41.319: ERROR/AndroidRuntime(8565): FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source) at com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown Source) at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:269) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563) at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) at android.view.LayoutInflater.inflate(LayoutInflater.java:408) at android.view.LayoutInflater.inflate(LayoutInflater.java:320) at android.view.LayoutInflater.inflate(LayoutInflater.java:276) at com.actionbarsherlock.internal.ActionBarSherlockCompat.setContentView(ActionBarSherlockCompat.java:853) at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:262) at br.com.myapp.activities.MainActivity.onCreate(MainActivity.java:19) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667) at android.app.ActivityThread.access$1500(ActivityThread.java:117) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3687) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) at dalvik.system.NativeStart.main(Native Method)

AndroidManifest:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="br.com.myapp" android:versionCode="1" android:versionName="2.0.0">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"></uses-sdk>
<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<permission android:name="br.com.myapp.permission.MAPS_RECEIVE"
            android:protectionLevel="signature" />
<uses-permission android:name="br.com.myapp.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />


<application android:label="@string/app_name" android:icon="@drawable/rp_icon"
             android:logo="@drawable/logo_actionbar" android:theme="@style/Theme.Sherlock.Light.DarkActionBar">

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

    <activity android:name=".activities.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>
    </manifest>

POM.xml:

    <?xml version="1.0" encoding="UTF-8"?>

http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 br.com.myapp myapp-android 2.0.0 apk myapp

<properties>
    <platform.version>4.2
        </platform.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>android</artifactId>
        <version>4.2</version>
    </dependency>
    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>async-http-client</artifactId>
        <version>1.4.2</version>
    </dependency>
    <dependency>
        <groupId>com.google.android</groupId>
        <artifactId>support-v4</artifactId>
        <version>r7</version>
    </dependency>
    <dependency>
        <groupId>com.actionbarsherlock</groupId>
        <artifactId>actionbarsherlock</artifactId>
        <version>4.2.0</version>
        <type>apklib</type>
    </dependency>
    <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>google-play-services</artifactId>
        <version>4</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
                <assetsDirectory>${project.basedir}/assets</assetsDirectory>
                <resourceDirectory>${project.basedir}/res</resourceDirectory>
                <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
                <sdk>
                    <platform>10</platform>
                </sdk>
                <undeployBeforeDeploy>true</undeployBeforeDeploy>
            </configuration>
            <extensions>true</extensions>
        </plugin>

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>
</build>

like image 414
Juliano Nunes Silva Oliveira Avatar asked Dec 22 '12 16:12

Juliano Nunes Silva Oliveira


2 Answers

Found same issue on my project.
Solution is to add 2 dependencies for com.google.android.gms both apklib and jar to maven build script:

    <!-- google-play-services. -->
    <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>google-play-services</artifactId>
        <version>4</version>
        <type>apklib</type>
    </dependency>

    <dependency>
        <groupId>com.google.android.gms</groupId>
        <artifactId>google-play-services</artifactId>
        <version>4</version>
        <type>jar</type>
    </dependency>

Also, dependency com.google.android.maps not needed for maps v2.

like image 170
Sash0k Avatar answered Nov 05 '22 16:11

Sash0k


Did you include the full source from the Google Maps library? There are resources there (hence the reference to java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)).

It's not enough to just reference the google-play-services.jar file. Double check the README.txt file at the root of the Google Play Services project.

like image 22
Roger Heim Avatar answered Nov 05 '22 14:11

Roger Heim