{"id":22139,"date":"2020-08-18T15:54:40","date_gmt":"2020-08-18T15:54:40","guid":{"rendered":"http:\/\/integrating_cloudinary_with_download_adapters_for_android"},"modified":"2020-08-18T15:54:40","modified_gmt":"2020-08-18T15:54:40","slug":"integrating_cloudinary_with_download_adapters_for_android","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android","title":{"rendered":"Integrating Cloudinary With Download Adapters for Android"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Adding code to display an image in your application is one of the most common tasks for almost every application developer. However, when it comes to Android applications, there is no inbuilt support for any image related tasks, which could be a potential pain when Android developers need to handle loading (and reloading) images into the view, handling the caching and memory issues, and supporting simple UI functionality.<\/p>\n<p>Gratifyingly, there are quite a few image loading and caching libraries available to choose from that take care of most of the functionality required in order to support images in an Android application. The main players in this field that are used by most image-displaying apps out there are:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/square.github.io\/picasso\/\">Picasso by Square<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/github.com\/bumptech\/glide\">Glide by BumpTech<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/github.com\/facebook\/fresco\">Fresco by Facebook<\/a>\n<\/li>\n<\/ul>\n<p>Practically any application that displays images uses one of these three libraries, and even though they are not identical, their base offering is very similar, as is the API\/workflow:<\/p>\n<ul>\n<li>Create a download request (either a remote URL or a local file or resource).<\/li>\n<li>Get the resource and cache it in memory and the file system.<\/li>\n<li>Display the resource directly in an ImageView.<\/li>\n<\/ul>\n<p>Since these libraries are well known, reliable, performant and rich with features, Cloudinary has seen no reason to create a full-blown download library of its own, but rather offers a means to integrate Cloudinary with the existing libraries. Android developers can use familiar workflows while still benefiting from Cloudinary\u2019s extensive selection of dynamic transformations and responsive images, as well as using a more fluent API.<\/p>\n<h2>The Glide Extension<\/h2>\n<p>For developers that already use the Glide library for their images, Cloudinary offers a quick and simple way to integrate Cloudinary functionality within existing code. Since Glide supports extensions using <a href=\"https:\/\/bumptech.github.io\/glide\/doc\/generatedapi.html\">code-generation<\/a>, Cloudinary has developed a small extension that allows developers to insert a <code>CloudinaryRequest<\/code> directly into the standard Glide pipeline, instead of sending a URL or a bitmap:<\/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\">GlideApp<\/span><span class=\"hljs-selector-class\">.with<\/span>(<span class=\"hljs-selector-tag\">imageView<\/span>)\n       <span class=\"hljs-selector-class\">.load<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">CloudinaryRequest<\/span><span class=\"hljs-selector-class\">.Builder<\/span>(\u201c<span class=\"hljs-selector-tag\">sample<\/span>\u201d)\n               <span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()<span class=\"hljs-selector-class\">.effect<\/span>(\u201c<span class=\"hljs-selector-tag\">blur<\/span>\u201d))\n               <span class=\"hljs-selector-class\">.responsive<\/span>(<span class=\"hljs-selector-tag\">AUTO_FILL<\/span>)\n               <span class=\"hljs-selector-class\">.build<\/span>())\n       <span class=\"hljs-selector-class\">.into<\/span>(<span class=\"hljs-selector-tag\">imageView<\/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>In the example above, a single call takes advantage of Cloudinary\u2019s dynamic URL generation feature, applying a transformation (blur effect) and fetching an image of the appropriate size by using the runtime dimensions of the ImageView, and in this way applying client-side responsiveness on a per-device basis. Each device downloads an image that fits exactly within the available viewing area, and no bandwidth is wasted delivering a high resolution image to all devices that is then scaled down on the client side.<\/p>\n<p>For comparison, achieving the same behavior without the Glide extension would require a few more complicated procedures:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-comment\">\/\/ construct a callback to load the image using glide<\/span>\nResponsiveUrl.Callback callback = <span class=\"hljs-keyword\">new<\/span> ResponsiveUrl.Callback() {\n   @Override\n   public <span class=\"hljs-keyword\">void<\/span> onUrlReady(Url url) {\n       GlideApp.with(imageView).load(url.generate()).into(holder.imageView);\n   }\n};\n\n<span class=\"hljs-comment\">\/\/ create the URL to base the responsive image on:<\/span>\nUrl baseUrl = MediaManager.get().url().publicId(<span class=\"hljs-string\">\"sample\"<\/span>).transformation(<span class=\"hljs-keyword\">new<\/span> Transformation().effect(<span class=\"hljs-string\">\"blur\"<\/span>));\n\n<span class=\"hljs-comment\">\/\/ call the responsive mechanism with the URL and callback to start the download:<\/span>\nMediaManager.get().responsiveUrl(AUTO_FILL).generate(baseUrl, holder.imageView, callback);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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>The Cloudinary Download Adapter<\/h2>\n<p>Cloudinary has also developed an adapter for a more general solution, regardless of what third-party download-library is used. The Cloudinary download adapter allows you to use a unified Cloudinary API to download and display images, and the API is very similar to the familiar workflow of the different download libraries. Implementing the adapter should almost be a drop-in replacement to your existing code.<\/p>\n<p>The first step is implemented when initializing the MediaLibrary,  where you select which library to use and specify it using a single line of code, for example for Glide:<\/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\">.setDownloadRequestBuilderFactory<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">GlideDownloadRequestBuilderFactory<\/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<p>The following example using the Cloudinary adapter achieves the same result as showcased in the Glide extension example above:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" 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\">.download<\/span>(<span class=\"hljs-selector-tag\">context<\/span>)\n       <span class=\"hljs-selector-class\">.load<\/span>(\"<span class=\"hljs-selector-tag\">sample<\/span>\")\n       <span class=\"hljs-selector-class\">.transformation<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Transformation<\/span>()<span class=\"hljs-selector-class\">.effect<\/span>(\"<span class=\"hljs-selector-tag\">blur<\/span>\"))\n       <span class=\"hljs-selector-class\">.responsive<\/span>(<span class=\"hljs-selector-tag\">AUTO_FILL<\/span>)\n       <span class=\"hljs-selector-class\">.into<\/span>(<span class=\"hljs-selector-tag\">imageView<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>This approach has several benefits:<\/p>\n<ul>\n<li>It uses the same Cloudinary entry point anywhere in the application where images are handled &#8211; both upload and download operations are handled using the same classes.<\/li>\n<li>The adapter serves as an abstraction of the actual download library used, and makes it very easy to experiment with different downloaders by replacing just one line of initialization code.<\/li>\n<li>It opens the door to many great features such as smarter content-aware caching, seamless transitions between server-side editing, client side post-processing, and more.<\/li>\n<\/ul>\n<h2>Adapting the Adapter<\/h2>\n<p>The Cloudinary download adapter ships with built-in integrations to the most popular download libraries, Picasso, Glide and Fresco. However, if required, a custom bridge class can be implemented to connect the adapter to any download library. The bridging classes are pretty small (for comparison, for Glide the entire class is under 40 lines of code):<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GlideDownloadRequestBuilderStrategy<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">DownloadRequestBuilderStrategy<\/span> <\/span>{\n  \n   <span class=\"hljs-comment\">\/\/ in most cases a private reference to the library's request builder needs <\/span>\n   <span class=\"hljs-comment\">\/\/ to be kept. in this case, a glide Request builder instance:<\/span>\n   <span class=\"hljs-keyword\">private<\/span> RequestBuilder&lt;Drawable&gt; requestBuilder;\n  \n   <span class=\"hljs-comment\">\/\/ As most 3rd party requests builders need a context, a context is passed <\/span>\n   <span class=\"hljs-comment\">\/\/ to the builder<\/span>\n   GlideDownloadRequestBuilderStrategy(Context context) {\n       requestBuilder = Glide.with(context).asDrawable();\n   }\n  \n   <span class=\"hljs-comment\">\/\/ load is the standard entry point to begin a download - here we delegate the<\/span>\n   <span class=\"hljs-comment\">\/\/ request url\/resource (depending on the overload) to the internal builder:<\/span>\n   @Override\n   <span class=\"hljs-keyword\">public<\/span> DownloadRequestBuilderStrategy load(String url) {\n       requestBuilder.load(url);\n       <span class=\"hljs-keyword\">return<\/span> this;\n   }\n  \n   <span class=\"hljs-comment\">\/\/ and again delegate each type to the builder:<\/span>\n   @Override\n   <span class=\"hljs-keyword\">public<\/span> DownloadRequestBuilderStrategy load(int resourceId) {\n       requestBuilder.load(resourceId);\n       <span class=\"hljs-keyword\">return<\/span> this;\n   }\n  \n   @Override\n   <span class=\"hljs-keyword\">public<\/span> DownloadRequestBuilderStrategy placeholder(int resourceId) {\n       requestBuilder.placeholder(resourceId);\n       <span class=\"hljs-keyword\">return<\/span> this;\n   }\n  \n   <span class=\"hljs-comment\">\/\/ In case a callback is needed (for instance to stop a progress bar, or to<\/span>\n   <span class=\"hljs-comment\">\/\/ notify the user of errors), this is how the callback handler is delegated <\/span>\n   <span class=\"hljs-comment\">\/\/ to the 3rd party request:<\/span>\n   @Override\n   <span class=\"hljs-keyword\">public<\/span> DownloadRequestBuilderStrategy callback(<span class=\"hljs-keyword\">final<\/span> DownloadRequestCallback callback) {\n       <span class=\"hljs-comment\">\/\/ register to the internal request callback mechanism, and delegate the <\/span>\n       <span class=\"hljs-comment\">\/\/ events to our own callback passed here as an argument:<\/span>\n       requestBuilder.listener(<span class=\"hljs-keyword\">new<\/span> RequestListener&lt;Drawable&gt;() {\n           @Override\n           <span class=\"hljs-keyword\">public<\/span> boolean onLoadFailed(@Nullable GlideException e, Object model, Target&lt;Drawable&gt; target, boolean isFirstResource) {\n               callback.onFailure(e);\n               <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n           }\n           @Override\n           <span class=\"hljs-keyword\">public<\/span> boolean onResourceReady(Drawable resource, Object model, Target&lt;Drawable&gt; target, DataSource dataSource, boolean isFirstResource) {\n               callback.onSuccess();\n               <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">false<\/span>;\n           }\n       });\n       <span class=\"hljs-keyword\">return<\/span> this;\n   }\n  \n   <span class=\"hljs-comment\">\/\/ this is where the loaded resource is displayed on the image view - again, <\/span>\n   <span class=\"hljs-comment\">\/\/ simply delegate the call to the internal instance's appropriate <\/span>\n   <span class=\"hljs-comment\">\/\/ method (RequestBuilder.into() in this case).<\/span>\n   @Override\n   <span class=\"hljs-keyword\">public<\/span> DownloadRequestStrategy into(ImageView imageView) {\n       ViewTarget&lt;ImageView, Drawable&gt; target = requestBuilder.into(imageView);\n       <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> GlideDownloadRequestStrategy(target);\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\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>The Bottom Line<\/h2>\n<p>Cloudinary now offers two new ways to easily implement Cloudinary transformations and client-side responsiveness in your Android application: an extension for integrating with Glide, and an adapter for providing in-built integration with almost any third-party Android download library, with support for Glide, Fresco and Picasso out of the box. Take advantage of Cloudinary\u2019s extensive transformations and easily implement responsiveness in your Android application. See the <a href=\"https:\/\/cloudinary.com\/documentation\/android_image_manipulation#download_images\">documentation<\/a> for all the details, and give it a try today!<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22140,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,165,202,249],"class_list":["post-22139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-image-transformation","tag-mobile","tag-responsive"],"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>Add Cloudinary Directly into Android Download Adapters<\/title>\n<meta name=\"description\" content=\"Integrate Cloudinary&#039;s extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code\" \/>\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\/integrating_cloudinary_with_download_adapters_for_android\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating Cloudinary With Download Adapters for Android\" \/>\n<meta property=\"og:description\" content=\"Integrate Cloudinary&#039;s extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-18T15:54:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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\/integrating_cloudinary_with_download_adapters_for_android#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Integrating Cloudinary With Download Adapters for Android\",\"datePublished\":\"2020-08-18T15:54:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA\",\"keywords\":[\"Android\",\"Image Transformation\",\"Mobile\",\"Responsive\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\",\"url\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\",\"name\":\"Add Cloudinary Directly into Android Download Adapters\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA\",\"datePublished\":\"2020-08-18T15:54:40+00:00\",\"description\":\"Integrate Cloudinary's extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating Cloudinary With Download Adapters 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":"Add Cloudinary Directly into Android Download Adapters","description":"Integrate Cloudinary's extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code","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\/integrating_cloudinary_with_download_adapters_for_android","og_locale":"en_US","og_type":"article","og_title":"Integrating Cloudinary With Download Adapters for Android","og_description":"Integrate Cloudinary's extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code","og_url":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android","og_site_name":"Cloudinary Blog","article_published_time":"2020-08-18T15:54:40+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android"},"author":{"name":"","@id":""},"headline":"Integrating Cloudinary With Download Adapters for Android","datePublished":"2020-08-18T15:54:40+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","keywords":["Android","Image Transformation","Mobile","Responsive"],"inLanguage":"en-US","copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android","url":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android","name":"Add Cloudinary Directly into Android Download Adapters","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","datePublished":"2020-08-18T15:54:40+00:00","description":"Integrate Cloudinary's extensive selection of dynamic transformations and deliver responsive images within your existing Android Downloader code","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/integrating_cloudinary_with_download_adapters_for_android#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Integrating Cloudinary With Download Adapters 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\/v1649719880\/Web_Assets\/blog\/Cloudinary-Download-Adapter_2214005ce9\/Cloudinary-Download-Adapter_2214005ce9.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22139","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=22139"}],"version-history":[{"count":0,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22139\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22140"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}