{"_id":"58aad9dd8f862f250076f9fc","parentDoc":null,"version":{"_id":"58aad9dd8f862f250076f9f4","project":"54aa7f773b56130b0056c86e","__v":2,"createdAt":"2017-02-20T11:58:21.765Z","releaseDate":"2017-02-20T11:58:21.765Z","categories":["58aad9dd8f862f250076f9f5","58aad9dd8f862f250076f9f6","58aad9dd8f862f250076f9f7","58aad9dd8f862f250076f9f8","58aad9dd8f862f250076f9f9","58aad9dd8f862f250076f9fa","58aad9dd8f862f250076f9fb","58ac26b3d460ce2500185d26"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":false,"codename":"Locate","version_clean":"6.0.0","version":"6.0"},"user":"54aa7f3f9bb00c0b00cb899b","__v":0,"category":{"_id":"58aad9dd8f862f250076f9f8","project":"54aa7f773b56130b0056c86e","version":"58aad9dd8f862f250076f9f4","__v":0,"sync":{"url":"","isSync":false},"reference":false,"createdAt":"2015-01-05T12:44:00.338Z","from_sync":false,"order":4,"slug":"android-sdk","title":"Android SDK"},"project":"54aa7f773b56130b0056c86e","updates":[],"next":{"pages":[],"description":""},"createdAt":"2015-01-05T12:56:01.793Z","link_external":false,"link_url":"","githubsync":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":0,"body":"Locate Android SDK is a static library. It's a bridge between your customers' mobile devices and the Pulsate server.\nIt's very easy to use, and takes about 5 minutes to install.\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Step 1: Setup Android Studio\"\n}\n[/block]\n**Make sure you are using latest version of Android Studio.**\n\n1. Make sure your project uses jcenter as a dependency repository (default on latest version of the Android Gradle plugin). \n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"buildscript {\\n    repositories {\\n        jcenter()\\n    }\\n}\\n\\nallprojects {\\n    repositories {\\n        jcenter()\\n    }\\n}\",\n      \"language\": \"text\",\n      \"name\": \"build.gradle\"\n    }\n  ]\n}\n[/block]\n2. Add *compile 'com.pulsatehq.sdk:LocateSdk:2.9.5'* to the dependencies of your project\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"dependencies {\\n\\tcompile 'com.pulsatehq.sdk:LocateSdk:2.9.5'\\n}\",\n      \"language\": \"text\",\n      \"name\": \"build.gradle\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Updating the SDK\",\n  \"body\": \"To update to the newest version of the SDK all you need to do is change the number at the end of \\\"*compile 'com.pulsatehq.sdk:LocateSdk:2.9.5'*\\\". The current version is 2.9.5.\"\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Step 2: Configure Gradle\"\n}\n[/block]\nSet *compileSdkVersion* to *25*, *buildToolsVersion* to *“25.0.2”*, *minSdkVersion* to *14* and *targetSdkVersion* to *25*.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"android {\\n\\t\\t\\t\\tcompileSdkVersion 25\\n    \\t\\tbuildToolsVersion '25.0.2'\\n\\n        defaultConfig {\\n                minSdkVersion 14\\n                targetSdkVersion 25\\n        }\\n\\n        ...\\n}\",\n      \"language\": \"text\",\n      \"name\": \"build.gradle\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"danger\",\n  \"body\": \"If you use *play-services* you must use the *10.0.1* version of the library.\",\n  \"title\": \"Google Play Services\"\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Step 3: Configure AndroidManifest.xml\"\n}\n[/block]\nYou need to add following to your application manifest:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<uses-permission android:name=\\\"android.permission.INTERNET\\\" />\\n<uses-permission android:name=\\\"android.permission.ACCESS_NETWORK_STATE\\\" />\\n<uses-permission android:name=\\\"android.permission.ACCESS_FINE_LOCATION\\\" />\\n<uses-permission android:name=\\\"android.permission.ACCESS_COARSE_LOCATION\\\" />\\n<uses-permission android:name=\\\"android.permission.WAKE_LOCK\\\" />\\n<uses-permission android:name=\\\"com.google.android.c2dm.permission.RECEIVE\\\" />\\n<uses-permission android:name=\\\"android.permission.VIBRATE\\\" />\\n<uses-permission android:name=\\\"android.permission.BLUETOOTH\\\" />\\n<uses-permission android:name=\\\"android.permission.BLUETOOTH_ADMIN\\\" />\\n<uses-permission android:name=\\\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\\\"/>\\n<!-- Only For development, can be removed when releasing to appstore -->\\n<uses-permission android:name=\\\"android.permission.WRITE_EXTERNAL_STORAGE\\\" />\\n\\n<!-- change com.example.demo to your app package name -->\\n<uses-permission android:name=\\\"com.example.demo.permission.C2D_MESSAGE\\\" />\\n\\n<!-- change com.example.demo to your app package name -->\\n<permission android:name=\\\"com.example.demo.permission.C2D_MESSAGE\\\"\\n                android:protectionLevel=\\\"signature\\\" />\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\n**All of these permissions are required by Locate SDK.**\n\n**android.permission.INTERNET and android.permission.ACCESS_NETWORK_STATE** - used to communicate with server\n\n**android.permission.ACCESS_FINE_LOCATION and android.permission.ACCESS_COARSE_LOCATION** - used to read user geolocation\n\n**android.permission.WAKE_LOCK** - used to keep screen from dimming\n\n**com.google.android.c2dm.permission.RECEIVE, com.example.demo.permission.C2D_MESSAGE**  - used to receive Push Notifications\n\n**android.permission.VIBRATE** - used to allows access to the vibrator \n\n**android.permission.BLUETOOTH and\nandroid.permission.BLUETOOTH_ADMIN** - used to scan for iBeacons\n \n**android.permission.READ_LOGS** - used by acra to generate crashlogs\n\n**android:name=\"com.google.android.gms.permission.ACTIVITY_RECOGNITION** - is used to optimize battery usage.\n\n**android.permission.WRITE_EXTERNAL_STORAGE** - is used for storing crashlogs on the SD Card during development. Can be removed when releasing to appstore.\n\nTo replace the default icon and name you need to add to your application manifest header *\"xmlns:tools=\"http://schemas.android.com/tools\"*:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<manifest xmlns:android=\\\"http://schemas.android.com/apk/res/android\\\"\\n    xmlns:tools=\\\"http://schemas.android.com/tools\\\"\\n    package=\\\"com.my.package\\\">\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\nAdd you need to add *\"tools:replace=\"android:name, icon\"* to your application:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<application\\n        ...\\n        tools:replace=\\\"android:name, icon\\\">\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\nYou need to add *android:supportsRtl=\"false\"* to your application:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<application\\n\\t\\t\\t\\t...\\n        android:supportsRtl=\\\"false\\\"\\n        tools:replace=\\\"android:name, icon\\\">\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\nYou need to add the following meta-data to your application manifest:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<application>\\n...\\n<!-- You can either set the needed data here or you can use locateManager.setAuthorizationData to set it later-->\\n<meta-data \\n    android:name=\\\"PulsateAppId\\\"\\n    android:value=\\\"xxxxxxxxxxxxxxxxxxxxxxxx\\\"/>\\n<meta-data \\n    android:name=\\\"PulsateAppKey\\\"\\n    android:value=\\\"xxxxxxxxxxxxxxxxxxxxxxxx\\\"/>\\n<!-- This is optional - end -->\\n<meta-data \\n    android:name=\\\"GCMApplicationId\\\"\\n    android:value=\\\"\\\\ xxxxxxxxxxxxxxxxxxxxxxxx\\\"/>\\n<meta-data \\n    android:name=\\\"com.google.android.gms.version\\\"\\n    android:value=\\\":::at:::integer/google_play_services_version\\\" />\\n\\n</application>\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\n*PulsateAppId* and *PulsateAppKey* are used to associate Locate framework with your Pulsate application which you have created using Pulsate web console. *PulsateAppId* and *PulsateAppKey* can be found in your application configuration panel.\n\nIf you do not want to set these keys in your android manifest, you can pass these keys using the Locate Manager in Java code instead.\n \nTo find them open admin panel, and then go to *Settings -> App Settings* screen in the Pulsate web console. *GCMApplicationId* is used to push notification, later in this tutorial you will find out how to create your Google Cloud Messaging account.\n\n**Make sure ‘\\ ‘ (backslash and space) is followed by your GCMApplicationId, i.e.:** \n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<meta-data android:name=\\\"GCMApplicationId\\\" android:value=\\\"\\\\ 265947004047\\\"/>\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"danger\",\n  \"title\": \"Android Manifest Merger\",\n  \"body\": \"If for any reason you need to use *tools:node=\\\"replace\\\"* please read the section below.\"\n}\n[/block]\nIf you use *tools:node=\"replace\"* or any other mode that might cause the manifests to not merge, you must add the code below to your AndroidManifest.\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"<activity\\n    android:screenOrientation=\\\"portrait\\\"\\n    android:name=\\\"com.pulsatehq.internal.inbox.InboxActivity\\\"\\n    android:exported=\\\"true\\\"\\n    android:label=\\\"Feed\\\"\\n    android:theme=\\\"@style/PulsateInboxTheme\\\" />\\n\\n<service\\n    android:name=\\\"com.pulsatehq.internal.beacon.service.PulsateBeaconService\\\"\\n\\t  android:enabled=\\\"true\\\"\\n\\t  android:exported=\\\"true\\\" />\\n\\n<service\\n    android:name=\\\"com.pulsatehq.internal.gps.geofence.GeofenceMonitor\\\"\\n    android:enabled=\\\"true\\\"\\n    android:exported=\\\"true\\\" />\\n\\n<service\\n    android:name=\\\"com.pulsatehq.internal.beacon.service.PulsateSensorService\\\"\\n    android:enabled=\\\"true\\\"\\n    android:exported=\\\"true\\\" />\\n\\n<service\\n\\tandroid:name=\\\"com.pulsatehq.internal.gcm.GcmService\\\"\\n\\tandroid:exported=\\\"true\\\" />\\n\\n<service\\n\\tandroid:enabled=\\\"true\\\"\\n\\tandroid:exported=\\\"true\\\"\\n\\tandroid:isolatedProcess=\\\"false\\\"\\n\\tandroid:label=\\\"iBeacon\\\"\\n\\tandroid:name=\\\"com.radiusnetworks.ibeacon.service.IBeaconService\\\"/>\\n\\n<receiver          \\tandroid:name=\\\"com.pulsatehq.internal.gps.geofence.GeofenceTransitionsReceiver\\\"\\n\\tandroid:exported=\\\"true\\\" >\\n\\t<intent-filter>\\n\\t\\t<action \\t\\t\\tandroid:name=\\\"pulsatehq.pulsatesdk.internal.gps.geofence.ACTION_RECEIVE_GEOFENCE\\t\\t\\\" />\\n\\t</intent-filter>\\n</receiver>\\n\\n<receiver\\n\\tandroid:name=\\\"com.pulsatehq.internal.gcm.GcmBroadcastReceiver\\\"\\n\\tandroid:exported=\\\"true\\\"\\n\\tandroid:permission=\\\"com.google.android.c2dm.permission.SEND\\\">\\n\\t\\t<intent-filter>\\n\\t\\t\\t<action android:name=\\\"com.google.android.c2dm.intent.RECEIVE\\\" />\\n\\t\\t</intent-filter>\\n</receiver>\",\n      \"language\": \"xml\",\n      \"name\": \"AndroidManifest.xml\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Google Play Services\",\n  \"body\": \"Please note that end users must have version 10.0.1 of Google Play Services or above on their Android Device for Pulsate to operate.\"\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"4. MultiDex\"\n}\n[/block]\nAs the Android platform has continued to grow, so has the size of Android apps. When your application and the libraries it references reach a certain size, you encounter build errors that indicate your app has reached a limit of the Android app build architecture.\n\nWe recommend all our users to add the following code in their projects to fix this problem.\nIn your gradle file under \"*defaultConfig*\" add the following line:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"defaultConfig {\\n    multiDexEnabled = true\\n    //Your defaultConfig code\\n}\",\n      \"language\": \"text\"\n    }\n  ]\n}\n[/block]\nAlso in your gradle file under \"*dependencies*\" add:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"dependencies {\\n    //Your dependencies\\n    compile 'com.android.support:multidex:1.0.1'\\n}\",\n      \"language\": \"text\"\n    }\n  ]\n}\n[/block]\nThe last thing to do is open your App class and add the following method:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \" @Override\\nprotected void attachBaseContext(Context base) {\\n    super.attachBaseContext(base);\\n    MultiDex.install(base);\\n}\",\n      \"language\": \"java\"\n    }\n  ]\n}\n[/block]\nWith this your app will support MultiDexing.","excerpt":"","slug":"installing-sdk-android-studio","type":"basic","title":"Installing SDK - Android Studio"}

Installing SDK - Android Studio


Locate Android SDK is a static library. It's a bridge between your customers' mobile devices and the Pulsate server. It's very easy to use, and takes about 5 minutes to install. [block:api-header] { "type": "basic", "title": "Step 1: Setup Android Studio" } [/block] **Make sure you are using latest version of Android Studio.** 1. Make sure your project uses jcenter as a dependency repository (default on latest version of the Android Gradle plugin). [block:code] { "codes": [ { "code": "buildscript {\n repositories {\n jcenter()\n }\n}\n\nallprojects {\n repositories {\n jcenter()\n }\n}", "language": "text", "name": "build.gradle" } ] } [/block] 2. Add *compile 'com.pulsatehq.sdk:LocateSdk:2.9.5'* to the dependencies of your project [block:code] { "codes": [ { "code": "dependencies {\n\tcompile 'com.pulsatehq.sdk:LocateSdk:2.9.5'\n}", "language": "text", "name": "build.gradle" } ] } [/block] [block:callout] { "type": "info", "title": "Updating the SDK", "body": "To update to the newest version of the SDK all you need to do is change the number at the end of \"*compile 'com.pulsatehq.sdk:LocateSdk:2.9.5'*\". The current version is 2.9.5." } [/block] [block:api-header] { "type": "basic", "title": "Step 2: Configure Gradle" } [/block] Set *compileSdkVersion* to *25*, *buildToolsVersion* to *“25.0.2”*, *minSdkVersion* to *14* and *targetSdkVersion* to *25*. [block:code] { "codes": [ { "code": "android {\n\t\t\t\tcompileSdkVersion 25\n \t\tbuildToolsVersion '25.0.2'\n\n defaultConfig {\n minSdkVersion 14\n targetSdkVersion 25\n }\n\n ...\n}", "language": "text", "name": "build.gradle" } ] } [/block] [block:callout] { "type": "danger", "body": "If you use *play-services* you must use the *10.0.1* version of the library.", "title": "Google Play Services" } [/block] [block:api-header] { "type": "basic", "title": "Step 3: Configure AndroidManifest.xml" } [/block] You need to add following to your application manifest: [block:code] { "codes": [ { "code": "<uses-permission android:name=\"android.permission.INTERNET\" />\n<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />\n<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />\n<uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n<uses-permission android:name=\"com.google.android.c2dm.permission.RECEIVE\" />\n<uses-permission android:name=\"android.permission.VIBRATE\" />\n<uses-permission android:name=\"android.permission.BLUETOOTH\" />\n<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />\n<uses-permission android:name=\"com.google.android.gms.permission.ACTIVITY_RECOGNITION\"/>\n<!-- Only For development, can be removed when releasing to appstore -->\n<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n\n<!-- change com.example.demo to your app package name -->\n<uses-permission android:name=\"com.example.demo.permission.C2D_MESSAGE\" />\n\n<!-- change com.example.demo to your app package name -->\n<permission android:name=\"com.example.demo.permission.C2D_MESSAGE\"\n android:protectionLevel=\"signature\" />", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] **All of these permissions are required by Locate SDK.** **android.permission.INTERNET and android.permission.ACCESS_NETWORK_STATE** - used to communicate with server **android.permission.ACCESS_FINE_LOCATION and android.permission.ACCESS_COARSE_LOCATION** - used to read user geolocation **android.permission.WAKE_LOCK** - used to keep screen from dimming **com.google.android.c2dm.permission.RECEIVE, com.example.demo.permission.C2D_MESSAGE** - used to receive Push Notifications **android.permission.VIBRATE** - used to allows access to the vibrator **android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN** - used to scan for iBeacons **android.permission.READ_LOGS** - used by acra to generate crashlogs **android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION** - is used to optimize battery usage. **android.permission.WRITE_EXTERNAL_STORAGE** - is used for storing crashlogs on the SD Card during development. Can be removed when releasing to appstore. To replace the default icon and name you need to add to your application manifest header *"xmlns:tools="http://schemas.android.com/tools"*: [block:code] { "codes": [ { "code": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:tools=\"http://schemas.android.com/tools\"\n package=\"com.my.package\">", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] Add you need to add *"tools:replace="android:name, icon"* to your application: [block:code] { "codes": [ { "code": "<application\n ...\n tools:replace=\"android:name, icon\">", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] You need to add *android:supportsRtl="false"* to your application: [block:code] { "codes": [ { "code": "<application\n\t\t\t\t...\n android:supportsRtl=\"false\"\n tools:replace=\"android:name, icon\">", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] You need to add the following meta-data to your application manifest: [block:code] { "codes": [ { "code": "<application>\n...\n<!-- You can either set the needed data here or you can use locateManager.setAuthorizationData to set it later-->\n<meta-data \n android:name=\"PulsateAppId\"\n android:value=\"xxxxxxxxxxxxxxxxxxxxxxxx\"/>\n<meta-data \n android:name=\"PulsateAppKey\"\n android:value=\"xxxxxxxxxxxxxxxxxxxxxxxx\"/>\n<!-- This is optional - end -->\n<meta-data \n android:name=\"GCMApplicationId\"\n android:value=\"\\ xxxxxxxxxxxxxxxxxxxxxxxx\"/>\n<meta-data \n android:name=\"com.google.android.gms.version\"\n android:value=\"@integer/google_play_services_version\" />\n\n</application>", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] *PulsateAppId* and *PulsateAppKey* are used to associate Locate framework with your Pulsate application which you have created using Pulsate web console. *PulsateAppId* and *PulsateAppKey* can be found in your application configuration panel. If you do not want to set these keys in your android manifest, you can pass these keys using the Locate Manager in Java code instead. To find them open admin panel, and then go to *Settings -> App Settings* screen in the Pulsate web console. *GCMApplicationId* is used to push notification, later in this tutorial you will find out how to create your Google Cloud Messaging account. **Make sure ‘\ ‘ (backslash and space) is followed by your GCMApplicationId, i.e.:** [block:code] { "codes": [ { "code": "<meta-data android:name=\"GCMApplicationId\" android:value=\"\\ 265947004047\"/>", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] [block:callout] { "type": "danger", "title": "Android Manifest Merger", "body": "If for any reason you need to use *tools:node=\"replace\"* please read the section below." } [/block] If you use *tools:node="replace"* or any other mode that might cause the manifests to not merge, you must add the code below to your AndroidManifest. [block:code] { "codes": [ { "code": "<activity\n android:screenOrientation=\"portrait\"\n android:name=\"com.pulsatehq.internal.inbox.InboxActivity\"\n android:exported=\"true\"\n android:label=\"Feed\"\n android:theme=\"@style/PulsateInboxTheme\" />\n\n<service\n android:name=\"com.pulsatehq.internal.beacon.service.PulsateBeaconService\"\n\t android:enabled=\"true\"\n\t android:exported=\"true\" />\n\n<service\n android:name=\"com.pulsatehq.internal.gps.geofence.GeofenceMonitor\"\n android:enabled=\"true\"\n android:exported=\"true\" />\n\n<service\n android:name=\"com.pulsatehq.internal.beacon.service.PulsateSensorService\"\n android:enabled=\"true\"\n android:exported=\"true\" />\n\n<service\n\tandroid:name=\"com.pulsatehq.internal.gcm.GcmService\"\n\tandroid:exported=\"true\" />\n\n<service\n\tandroid:enabled=\"true\"\n\tandroid:exported=\"true\"\n\tandroid:isolatedProcess=\"false\"\n\tandroid:label=\"iBeacon\"\n\tandroid:name=\"com.radiusnetworks.ibeacon.service.IBeaconService\"/>\n\n<receiver \tandroid:name=\"com.pulsatehq.internal.gps.geofence.GeofenceTransitionsReceiver\"\n\tandroid:exported=\"true\" >\n\t<intent-filter>\n\t\t<action \t\t\tandroid:name=\"pulsatehq.pulsatesdk.internal.gps.geofence.ACTION_RECEIVE_GEOFENCE\t\t\" />\n\t</intent-filter>\n</receiver>\n\n<receiver\n\tandroid:name=\"com.pulsatehq.internal.gcm.GcmBroadcastReceiver\"\n\tandroid:exported=\"true\"\n\tandroid:permission=\"com.google.android.c2dm.permission.SEND\">\n\t\t<intent-filter>\n\t\t\t<action android:name=\"com.google.android.c2dm.intent.RECEIVE\" />\n\t\t</intent-filter>\n</receiver>", "language": "xml", "name": "AndroidManifest.xml" } ] } [/block] [block:callout] { "type": "info", "title": "Google Play Services", "body": "Please note that end users must have version 10.0.1 of Google Play Services or above on their Android Device for Pulsate to operate." } [/block] [block:api-header] { "type": "basic", "title": "4. MultiDex" } [/block] As the Android platform has continued to grow, so has the size of Android apps. When your application and the libraries it references reach a certain size, you encounter build errors that indicate your app has reached a limit of the Android app build architecture. We recommend all our users to add the following code in their projects to fix this problem. In your gradle file under "*defaultConfig*" add the following line: [block:code] { "codes": [ { "code": "defaultConfig {\n multiDexEnabled = true\n //Your defaultConfig code\n}", "language": "text" } ] } [/block] Also in your gradle file under "*dependencies*" add: [block:code] { "codes": [ { "code": "dependencies {\n //Your dependencies\n compile 'com.android.support:multidex:1.0.1'\n}", "language": "text" } ] } [/block] The last thing to do is open your App class and add the following method: [block:code] { "codes": [ { "code": " @Override\nprotected void attachBaseContext(Context base) {\n super.attachBaseContext(base);\n MultiDex.install(base);\n}", "language": "java" } ] } [/block] With this your app will support MultiDexing.