2

I've been trying to compile my project using Google Play Services such as Maps and GCM.

After following these instructions, my project now compiles successfully and includes all the libs I need. Android Studio also has added auto-completion for GCM and Maps functions. Build target is set to Google APIs 18

But then, when I intent to start my app, it crashes when it hits

if(GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) != ConnectionResult.SUCCESS){
                setContentView(R.layout.error_no_play);
                return;

or when it hits the map fragment

<fragment
    android:id="@+id/map"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    tools:layout="@layout/fragment_gmap"
    class="com.google.android.gms.maps.MapFragment"/>

The errors thrown are :

  • When checking if GooglePlayServices is available : java.lang.NoClassDefFoundError: com.google.android.gms.common.GooglePlayServicesUtil

  • For the fragment :

    .......

      08-22 20:17:56.565  20356-20356/<MY_APP> E/AndroidRuntime: FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{<MY_APP>/<MY_APP>.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2178)
        at android.app.ActivityThread.access$700(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5118)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
        at dalvik.system.NativeStart.main(Native Method)
        Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
        at <MY_APP>.SearchFragment.newTab(SearchFragment.java:71)
        at <MY_APP>.SearchFragment.setupTabs(SearchFragment.java:54)
        at <MY_APP>.SearchFragment.onCreateView(SearchFragment.java:28)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
        at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:551)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1163)
        at android.app.Activity.performStart(Activity.java:5068)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2113)
        ... 11 more
        Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment: make sure class name exists, is public, and has an empty constructor that is public
        at android.support.v4.app.Fragment.instantiate(Fragment.java:401)
        at android.support.v4.app.Fragment.instantiate(Fragment.java:369)
        at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
        ... 26 more
        Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.maps.MapFragment" on path: /data/app/<MY_APP>-2.apk
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
        at android.support.v4.app.Fragment.instantiate(Fragment.java:391)
        ... 29 more
    

The Manifest file is as following :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="<MyApp>"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- Permissions required for GMap and Facebook to work -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <permission android:name="<MyApp>.permission.C2D_MESSAGE"
                android:protectionLevel="signature" />
    <uses-permission android:name="<MyApp>.permission.C2D_MESSAGE" />

    <!-- Require OpenGL ES2 for GMap -->
    <uses-feature android:glEsVersion="0x00020000"
                  android:required="true" />


    <!-- Because this app is using the GCM library to send messages, the min SDK cannot be lower
    than 8. Using SDK11-->
    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />


    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MyTheme" >
        <receiver
            android:name=".MyPushReceiver"
            android:permission="com.google.android.gcm.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="<MyApp>" />
            </intent-filter>
        </receiver>

        <activity
            android:name="<MyApp>.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <!-- Facebook specific activities -->
        <activity android:name="com.facebook.LoginActivity" />

        <!-- GMap API key -->
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="<MY_KEY>" />
        <!-- Facebook App ID -->
        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id" />
    </application>

</manifest>

I've been dealing with this issue for 1 month now, and i still have no way to deal with it. Is it a known issue of AndroidStudio? Am i forgetting something? From what i'm reading from the error logs, it looks like the libs are not compiled with the project.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Jivay
  • 1,034
  • 3
  • 10
  • 23

2 Answers2

1

Problem solved.

First i doubled checked that JAVA_HOME system env variable was set.

When set, i got compile errors stating that one library was already added : Support v4.

Then i remembered that i was also using Facebook SDK for android studio, and that their build.gradle is as following and outdated :

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}

apply plugin: 'android-library'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}

SOLUTION : Now my facebook's build.gradle is as following :

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android-library'

dependencies {
    compile 'com.android.support:support-v4:13.0.+'
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}

I simply replaced gradle plugin's version with the most recent one, and set the new support-v4 dependencies with the updated ones.

tl;dr: If you're using facebook SDK for Android Studio, double check that FacebookSDK's build.gradle is up to date.

Jivay
  • 1,034
  • 3
  • 10
  • 23
0

May be your problem is

Fragments are not supported below 3.0 versions.But you are used

Use your minimumSDk version 3.0 are above 3.0

or

Use SupportMapFragment instead of MapFragment

If you want Tutorial see this http://venkoolit.blogspot.in/2013/05/tutorial-for-develop-google-maps-in-api.html

Venky
  • 226
  • 1
  • 5
  • I've updated the question and added the manifest file. Also the project compiles without any problem, it just looks like the activity can't access the Google Play classes. – Jivay Aug 23 '13 at 18:05