{"id":21608,"date":"2017-10-04T15:33:37","date_gmt":"2017-10-04T15:33:37","guid":{"rendered":"http:\/\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android"},"modified":"2024-08-15T12:30:22","modified_gmt":"2024-08-15T19:30:22","slug":"addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","title":{"rendered":"Addressing mobile challenges with the new Cloudinary SDK for Android"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Developing applications for mobile consumption comes with difficult challenges.<\/p>\n<p>Apps need to limit their RAM, CPU, and battery usage while performing smoothly. And if there are too many background tasks, the mobile device\u2019s battery runs out fast. Networks on mobile devices are also often unstable in some areas with slow network performance and high packet loss. Apps need to be able to handle all the network issues, and, if necessary, network activity needs to fail smoothly and resume when available again. To support higher-resolution mobile devices, the app backend needs to serve high-quality images and videos.<\/p>\n<p>With all that in mind, Cloudinary\u2019s latest version of the Android SDK lets you easily implement background upload functionality in your app to ensure the best user experience. And with Cloudinary\u2019s Dynamic URL feature, the delivered resource can be generated on the fly, eliminating the need to pre-generate all the various versions of your resources for different mobile devices.<\/p>\n<h2>The Cloudinary Android SDK v2.0<\/h2>\n<p>The Cloudinary SDK works on the principle that Android knows how to manage its own memory, CPU and power, and so relies on the operating system itself doing the prioritization of those limited hardware resources. All uploads are presented as requests to the operating system, which will schedule the uploads accordingly. The Cloudinary SDK hooks into Android\u2019s <a href=\"https:\/\/developer.android.com\/reference\/android\/app\/job\/JobScheduler.html\">JobScheduler<\/a>, which makes sure the mobile device works smoothly when running background uploads. If the mobile device is running an older version of Android that does not support the JobScheduler API, then the Cloudinary SDK transparently falls back to using the scheduling engine inside <a href=\"https:\/\/developers.google.com\/android\/guides\/overview\">Google Play services<\/a>.<\/p>\n<p>All upload requests can be finely-tuned using the new <strong>policy<\/strong> mechanism, and the SDK can handle global callbacks, even when your app is down, or is running in the background.<\/p>\n<h2>Presenting the Cloudinary MediaManager<\/h2>\n<p>The Cloudinary Android SDK v2.0 provides you with the <code>MediaManager<\/code> class, with methods for configuring and handling all your media-related operations. Use the <code>upload<\/code> method to build your request, which is then dispatched to a background queue via the MediaManager\u2019s <code>dispatch<\/code> method.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.upload<\/span>(<span class=\"hljs-selector-tag\">imageFile<\/span>)<span class=\"hljs-selector-class\">.dispatch<\/span>();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The MediaManager\u2019s <code>option<\/code> method lets you include any upload parameters for Cloudinary, for example, adding the tag <code>user_uploaded<\/code>:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.upload<\/span>(<span class=\"hljs-selector-tag\">imageFile<\/span>)\n   <span class=\"hljs-selector-class\">.option<\/span>(\"<span class=\"hljs-selector-tag\">tags<\/span>\", \"<span class=\"hljs-selector-tag\">user_uploaded<\/span>\")\n   <span class=\"hljs-selector-class\">.dispatch<\/span>();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>While you are at it, you might want to specify some upload conditions in your request, such as how many times to retry after a recoverable error (e.g., network issues), to limit the upload to a wifi network, or only when the device is charging. The MediaManager\u2019s <code>policy<\/code> method lets you do just that, overriding the default values for that particular upload request:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">MediaManager<\/span><span class=\"hljs-selector-class\">.get<\/span>()<span class=\"hljs-selector-class\">.upload<\/span>(<span class=\"hljs-selector-tag\">filePath<\/span>)\n   <span class=\"hljs-selector-class\">.policy<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">UploadPolicy<\/span><span class=\"hljs-selector-class\">.Builder<\/span>()\n      <span class=\"hljs-selector-class\">.maxRetries<\/span>(7)\n      <span class=\"hljs-selector-class\">.requiresCharging<\/span>(<span class=\"hljs-selector-tag\">true<\/span>)\n      <span class=\"hljs-selector-class\">.networkPolicy<\/span>(<span class=\"hljs-selector-tag\">UploadPolicy<\/span><span class=\"hljs-selector-class\">.NetworkType<\/span><span class=\"hljs-selector-class\">.UNMETERED<\/span>)\n      <span class=\"hljs-selector-class\">.build<\/span>())\n   <span class=\"hljs-selector-class\">.dispatch<\/span>();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Callbacks<\/h2>\n<p>Since all uploads are ultimately run asynchronously by the system, the MediaManager\u2019s <code>callback<\/code> method provides an easy way to hook into the upload\u2019s progress and provide specific code to run at each stage of the upload.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-built_in\">String<\/span> requestId = MediaManager.get().upload(filePath)\n   .callback(<span class=\"hljs-keyword\">new<\/span> UploadCallback() {\n      @Override\n      public <span class=\"hljs-keyword\">void<\/span> onProgress(<span class=\"hljs-built_in\">String<\/span> requestId, long bytes, long totalBytes) {\n         Double progress = (double) bytes\/totalBytes;\n         <span class=\"hljs-comment\">\/\/ post progress to app UI (e.g. progress bar, notification)<\/span>\n      }\n      @Override\n      public <span class=\"hljs-keyword\">void<\/span> onSuccess(<span class=\"hljs-built_in\">String<\/span> requestId, <span class=\"hljs-built_in\">Map<\/span> resultData) {\n      }\n    ...\n   })\n   .dispatch();\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This method of implementing callbacks won\u2019t suffice if your app is down or is running in the background. In this case, you would want to implement global callbacks for your app by registering a new service class that extends the provided <code>ListenerService<\/code> class. All upload request callbacks will be routed to your service, which implements the code to run at each stage of the upload.<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">ListenerService<\/span> <\/span>{\n   @Override\n   public <span class=\"hljs-keyword\">void<\/span> onProgress(<span class=\"hljs-built_in\">String<\/span> requestId, long bytes, long totalBytes) {\n      Double progress = (double) bytes\/totalBytes;\n      <span class=\"hljs-comment\">\/\/ post progress to app UI (e.g. progress bar, notification)<\/span>\n   }\n   @Override\n   public <span class=\"hljs-keyword\">void<\/span> onSuccess(<span class=\"hljs-built_in\">String<\/span> requestId, <span class=\"hljs-built_in\">Map<\/span> resultData) {\n   }\n   ...\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Not only upload<\/h2>\n<p>Once your media assets have been uploaded to Cloudinary, you can take advantage of Cloudinary\u2019s Dynamic URL feature to deliver your images and videos to your users. Dynamic URLs include instructions telling Cloudinary how to transform and optimize the asset on-the-fly, and then deliver it through a fast CDN to the end user for optimal user experience. There is no need to pre-generate all the different versions you may need for the various devices running your app.<\/p>\n<p>Besides taking care of all your resource uploads directly to your Cloudinary account, the MediaManager class provides the <code>url<\/code> method to generate a URL string for accessing resources uploaded to your Cloudinary account:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">MediaManager.get().url().generate(<span class=\"hljs-string\">\"sample.jpg\"<\/span>)\n<span class=\"hljs-comment\">\/\/ returns: https:\/\/res.cloudinary.com\/demo\/image\/upload\/sample.jpg<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>You can also call the <code>transformation<\/code> method to include any transformation instructions in the  generated URL:<\/p>\n<p><cld-code-widget\n      class=\" c-code-widget\"\n      snippets=\"[{&quot;sdkId&quot;:&quot;android&quot;,&quot;framework&quot;:&quot;android&quot;,&quot;language&quot;:&quot;android&quot;,&quot;rawCodeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation().gravity(\\&quot;face\\&quot;).radius(75).border(\\&quot;10px_solid_grey\\&quot;).crop(\\&quot;crop\\&quot;).chain() .overlay(new Layer().publicId(\\&quot;couple\\&quot;)).width(170).height(150).radius(\\&quot;max\\&quot;).gravity(\\&quot;faces\\&quot;).border(\\&quot;3px_solid_black\\&quot;).crop(\\&quot;thumb\\&quot;).chain() .flags(\\&quot;layer_apply\\&quot;).gravity(\\&quot;north_east\\&quot;)).generate(\\&quot;woman2.jpg\\&quot;);&quot;,&quot;codeSnippet&quot;:&quot;MediaManager.get().url().transformation(new Transformation()\\n  .gravity(\\&quot;face\\&quot;).radius(75).border(\\&quot;10px_solid_grey\\&quot;).crop(\\&quot;crop\\&quot;).chain()\\n  .overlay(new Layer().publicId(\\&quot;couple\\&quot;)).width(170).height(150).radius(\\&quot;max\\&quot;).gravity(\\&quot;faces\\&quot;).border(\\&quot;3px_solid_black\\&quot;).crop(\\&quot;thumb\\&quot;).chain()\\n  .flags(\\&quot;layer_apply\\&quot;).gravity(\\&quot;north_east\\&quot;)).generate(\\&quot;woman2.jpg\\&quot;);&quot;,&quot;status&quot;:0,&quot;statusText&quot;:&quot;Ok&quot;,&quot;displayName&quot;:&quot;Android&quot;,&quot;packageName&quot;:&quot;cloudinary-android&quot;,&quot;packageStatus&quot;:&quot;&quot;,&quot;packageVersion&quot;:&quot;3.x&quot;}]\"\n      parsed-url=\"{&quot;url&quot;:&quot;https:\\\/\\\/res.cloudinary.com\\\/demo\\\/image\\\/upload\\\/c_crop,g_face,r_75,bo_10px_solid_grey\\\/l_couple,w_170,h_150,c_thumb,r_max,g_faces,bo_3px_solid_black\\\/fl_layer_apply,g_north_east\\\/woman2.jpg&quot;,&quot;cloud_name&quot;:&quot;demo&quot;,&quot;host&quot;:&quot;res.cloudinary.com&quot;,&quot;type&quot;:&quot;upload&quot;,&quot;resource_type&quot;:&quot;image&quot;,&quot;transformation&quot;:[{&quot;crop_mode&quot;:&quot;crop&quot;,&quot;gravity&quot;:&quot;face&quot;,&quot;radius&quot;:&quot;75&quot;,&quot;border&quot;:&quot;10px_solid_grey&quot;},{&quot;overlay&quot;:&quot;couple&quot;,&quot;width&quot;:&quot;170&quot;,&quot;height&quot;:&quot;150&quot;,&quot;crop_mode&quot;:&quot;thumb&quot;,&quot;radius&quot;:&quot;max&quot;,&quot;gravity&quot;:&quot;faces&quot;,&quot;border&quot;:&quot;3px_solid_black&quot;},{&quot;flags&quot;:&quot;layer_apply&quot;,&quot;gravity&quot;:&quot;north_east&quot;}],&quot;transformation_string&quot;:&quot;c_crop,g_face,r_75,bo_10px_solid_grey\\\/l_couple,w_170,h_150,c_thumb,r_max,g_faces,bo_3px_solid_black\\\/fl_layer_apply,g_north_east&quot;,&quot;url_suffix&quot;:&quot;&quot;,&quot;version&quot;:&quot;&quot;,&quot;secure&quot;:true,&quot;public_id&quot;:&quot;woman2.jpg&quot;,&quot;extension&quot;:&quot;jpg&quot;,&quot;format&quot;:&quot;jpg&quot;,&quot;format_code&quot;:true,&quot;url_code&quot;:false,&quot;signature&quot;:&quot;&quot;,&quot;private_cdn&quot;:false,&quot;result_asset_type&quot;:&quot;image&quot;}\"\n      with-url=\"true\"\n    >\n      <span class=\"u-visually-hidden\">Loading code examples<\/span>\n    <\/cld-code-widget><a class=\"c-image-link\" href=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_crop,g_face,r_75,bo_10px_solid_grey\/l_couple,w_170,h_150,c_thumb,r_max,g_faces,bo_3px_solid_black\/fl_layer_apply,g_north_east\/woman2.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/demo\/image\/upload\/c_crop,g_face,r_75,bo_10px_solid_grey\/l_couple,w_170,h_150,c_thumb,r_max,g_faces,bo_3px_solid_black\/fl_layer_apply,g_north_east\/woman2.jpg\" alt=\"image cropped with face detection and given rounded corners and a grey border, with an overlay of the image of couple resized to an oval thumbnail with face detection and a black border added to the northeast corner\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"300\" height=\"394.38202247191\"\/><\/a><\/p>\n<h2>Summary<\/h2>\n<p>The new version of the Cloudinary SDK for Android is a major release that now makes it simple to include upload functionality in your mobile app, and let your users upload their media directly to your Cloudinary account. The SDK takes advantage of Android\u2019s built-in functionality when executing the uploads, to make sure that your users enjoy an uninterrupted experience while using your app. Integrating with Cloudinary to upload, manage, and deliver all your app resources is now easier than ever. Make sure you check out the <a href=\"\/documentation\/android_integration\">Android integration documentation<\/a>, and if you don\u2019t already have a Cloudinary account, you can <a href=\"https:\/\/cloudinary.com\/users\/register_free\">sign up for free<\/a>.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21609,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,124,202,263],"class_list":["post-21608","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-frameworks","tag-mobile","tag-sdk"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Address mobile challenges with the Cloudinary Android SDK<\/title>\n<meta name=\"description\" content=\"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Addressing mobile challenges with the new Cloudinary SDK for Android\" \/>\n<meta property=\"og:description\" content=\"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-10-04T15:33:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-15T19:30:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Addressing mobile challenges with the new Cloudinary SDK for Android\",\"datePublished\":\"2017-10-04T15:33:37+00:00\",\"dateModified\":\"2024-08-15T19:30:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\"},\"wordCount\":10,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA\",\"keywords\":[\"Android\",\"Frameworks\",\"Mobile\",\"SDK\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2017\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\",\"url\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\",\"name\":\"Address mobile challenges with the Cloudinary Android SDK\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA\",\"datePublished\":\"2017-10-04T15:33:37+00:00\",\"dateModified\":\"2024-08-15T19:30:22+00:00\",\"description\":\"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Addressing mobile challenges with the new Cloudinary SDK for Android\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Address mobile challenges with the Cloudinary Android SDK","description":"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","og_locale":"en_US","og_type":"article","og_title":"Addressing mobile challenges with the new Cloudinary SDK for Android","og_description":"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality","og_url":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","og_site_name":"Cloudinary Blog","article_published_time":"2017-10-04T15:33:37+00:00","article_modified_time":"2024-08-15T19:30:22+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2-jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android"},"author":{"name":"","@id":""},"headline":"Addressing mobile challenges with the new Cloudinary SDK for Android","datePublished":"2017-10-04T15:33:37+00:00","dateModified":"2024-08-15T19:30:22+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android"},"wordCount":10,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA","keywords":["Android","Frameworks","Mobile","SDK"],"inLanguage":"en-US","copyrightYear":"2017","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","url":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android","name":"Address mobile challenges with the Cloudinary Android SDK","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA","datePublished":"2017-10-04T15:33:37+00:00","dateModified":"2024-08-15T19:30:22+00:00","description":"The new Cloudinary SDK for Android lets you manage all the media related needs in your app and easily implement background upload functionality","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/addressing_mobile_challenges_with_the_new_cloudinary_sdk_for_android#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Addressing mobile challenges with the new Cloudinary SDK for Android"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718506\/Web_Assets\/blog\/android_sdk_2\/android_sdk_2.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=21608"}],"version-history":[{"count":3,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21608\/revisions"}],"predecessor-version":[{"id":35197,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21608\/revisions\/35197"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21609"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}