{"id":34848,"date":"2024-07-24T07:00:00","date_gmt":"2024-07-24T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=34848"},"modified":"2024-09-08T01:54:38","modified_gmt":"2024-09-08T08:54:38","slug":"android-easy-asset-management","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/android-easy-asset-management","title":{"rendered":"Android: Easy Asset Management"},"content":{"rendered":"\n<p>As a Mobile Developer for Cloudinary, I hold, maintain, and build SDKs for new mobile frameworks (Flutter, React Native, etc.). I recently built a new sample app complementary to the SDK package that you can use and play with the Cloudinary SDK and solution.<\/p>\n\n\n\n<p>An overview of what you can find in <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_android\/tree\/master\/sample\">my sample app<\/a> to better manage your assets:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Optimizations.<\/li>\n\n\n\n<li>Transformations.<\/li>\n\n\n\n<li>Use cases such as localization, branding, and background normalization.<\/li>\n\n\n\n<li>Uploading, including uploading large files and fetch upload.<\/li>\n\n\n\n<li>Upload widget and image widget implementations.<\/li>\n\n\n\n<li>Video, including the video player widget and video feeds.<\/li>\n<\/ul>\n\n\n\n<p>I also released a guide for my <a href=\"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management\">Cloudinary iOS sample app<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setup<\/h2>\n\n\n\n<p>When the app starts, enter your cloud name, which you can find on the Cloudinary platform.<\/p>\n\n\n\n<p>Once you have your cloud name, put it into the EditText on screen. The code will initialize our MediaManager class, which holds the Cloudinary configuration. We\u2019ll use this class to perform URL generation, uploads, and more.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Delivery<\/h2>\n\n\n\n<p>The Delivery tab shows you various things you can do with the Cloudinary SDK.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Optimization<\/h2>\n\n\n\n<p>This screen allows you to see how optimization through Cloudinary will reduce the asset size and the amount of bandwidth the app will consume.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfIcgLIX6QFdFGUWZ4aGcYVp_eW4xhSyKhZ49U71Da6bdgbEl3BbVaRIp-cE8S0kwrHg4paJd5G_oaf5hpKNPOsm4qQHkFpr1TmVXvFCQeRSUHXTXJwFi5-IaerOxTyRcHJHeOMgoLW-bCnz7ayj-BvFBd_?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">url = MediaManager.get().url().transformation(<span class=\"hljs-keyword\">new<\/span> Transformation().crop(<span class=\"hljs-string\">\"scale\"<\/span>).width(<span class=\"hljs-number\">800<\/span>).fetchFormat(<span class=\"hljs-string\">\"avif\"<\/span>).quality(<span class=\"hljs-string\">\"auto\"<\/span>).dpr(<span class=\"hljs-string\">\"auto\"<\/span>)).generate(publicId);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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\n\n<p>We\u2019ll use our MediaManager object to create our URL, and then we\u2019ll set a new <code>Transformation()<\/code>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use crop mode scale to keep the current asset aspect ratio.<\/li>\n\n\n\n<li>Reduce the width to 800px.<\/li>\n\n\n\n<li>Use <a href=\"https:\/\/cloudinary.com\/tools\/compress-avif\">AVIF<\/a> as the image format. This will reduce the asset size. (<strong>Note: <\/strong>AVIF is supported for Android 12+.)<\/li>\n\n\n\n<li>Set the quality to auto, which will allow Cloudinary to optimize the image quality.<\/li>\n\n\n\n<li>Set the DPR to auto.<\/li>\n\n\n\n<li>At the end of the line, we\u2019ll call generate and give it the asset name (publicId).<\/li>\n\n\n\n<li>After completing these steps, we\u2019ll get a much lighter, optimized asset.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Transform<\/h2>\n\n\n\n<p>In the <strong>Transform<\/strong> tab, you can find various transformations that Cloudinary can help you with, from changing the asset size and aspect ratio to background removal, overlays, and recoloring different objects in an asset.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd-_1k6gOU2RKPfKq20wPvl8aBayTTF1NLJOOodi242wiPM-LZ-G5toKmrk-ZSy48ftQqn3KXoqRd0LNPG9HY1AhhinhwDZEp2dQIBSEEqlSoBFKPcjapujW-jl5fiirCdFvnNYtgjvjrHuAWsl1r6vPkFI?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Use Cases<\/h2>\n\n\n\n<p>In the <strong>Use Cases<\/strong> section, you can find a few use cases that Cloudinary users leverage in their apps. Take different size images and set them in a size that works for you.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfBOTGmD8qb7YeM2cHvS-5VoRbtd7ZgDv9DOBSshSAmxa3huxSnwuIiP6-R5thOmXsmle9uvmBid6GGeqJjPCjspJNiEczDiOvUo8CXc0CGPAH6GDtm_Sx0ehNhXBrmXDvujC2F7k7bDWsYIjPguQfjM74?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>You can also brand your images easily.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcymaxUaWst9TOCwQR2wnEFv6vefmRoAefyVgnjHXxT5xRXcrmEU2v2tzIcDYRhHOhaCmVbM-5GDrH2xMgZdIgfA2wLY08BLyFbJmKcuNBxB1r1LY8uzFqoPdMXKC0JLFz4JRePSCAH9O-qxmQxdDkRJmp7?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Upload<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcGyBmITZ7ySd-aBJHx4qtoa12XFzfHT43A6A-uO156sUrGxehTA7QR3jygvwysfTrFTFj0PT_bzed6kuIVy9onP2zvvIA5-qnPP34p4e-KGB0bxJotrS50RXD8sGcYt7XSV0icRWbaQavQF3sauKBJT9s?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n\n<p>In the <strong>Upload<\/strong> tab, you can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Upload<\/strong>. Upload an asset from your phone to your cloud with one line of code.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" 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\">imageUri<\/span>)<span class=\"hljs-selector-class\">.unsigned<\/span>(<span class=\"hljs-selector-tag\">Utils<\/span><span class=\"hljs-selector-class\">.UPLOAD_PRESET<\/span>)<span class=\"hljs-selector-class\">.dispatch<\/span>();<\/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\n\n<p>As you can see in the snippet above, we need to give the upload function the asset URI. We\u2019ll make an unsigned upload, give it the UPLOAD_PRESET, and dispatch the request.<\/p>\n\n\n\n<p>Note: To learn more about upload presets, go <a href=\"https:\/\/cloudinary.com\/documentation\/android_image_and_video_upload#unsigned_upload\">here<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pre-process<\/strong>. By pre-processing, you can reduce the size of an image before uploading it to your Cloudinary cloud:<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" 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\">imageUri<\/span>)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.unsigned<\/span>(<span class=\"hljs-selector-tag\">Utils<\/span><span class=\"hljs-selector-class\">.UPLOAD_PRESET<\/span>)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.preprocess<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">ImagePreprocessChain<\/span>()\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.loadWith<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">BitmapDecoder<\/span>(1000, 1000))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.addStep<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">Limit<\/span>(1000, 1000))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.addStep<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">DimensionsValidator<\/span>(10,10,1000,1000))\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-selector-class\">.saveWith<\/span>(<span class=\"hljs-selector-tag\">new<\/span> <span class=\"hljs-selector-tag\">BitmapEncoder<\/span>(<span class=\"hljs-selector-tag\">BitmapEncoder<\/span><span class=\"hljs-selector-class\">.Format<\/span><span class=\"hljs-selector-class\">.JPEG<\/span>, 80)))<\/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\n\n<ul class=\"wp-block-list\">\n<li><strong>Fetch upload<\/strong>. Upload assets from a remote URL to your cloud.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">url = MediaManager.get().url().type(<span class=\"hljs-string\">\"fetch\"<\/span>).transformation(<span class=\"hljs-keyword\">new<\/span> Transformation().crop(<span class=\"hljs-string\">\"scale\"<\/span>).width(<span class=\"hljs-number\">800<\/span>).fetchFormat(<span class=\"hljs-string\">\"avif\"<\/span>).quality(<span class=\"hljs-string\">\"auto\"<\/span>).dpr(<span class=\"hljs-string\">\"auto\"<\/span>)).generate(publicId);<\/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\n\n<p>The only change we make here from a URL that we generated before, is to set the <code>.type()<\/code> to fetch. Cloudinary will generate a new URL for you and upload the asset from the remote URL to your cloud.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Widgets<\/h2>\n\n\n\n<p>As part of the SDK, we offer different widgets.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Image Widget<\/h3>\n\n\n\n<p>The Image widget allows quick and easy integration of the Cloudinary SDK with Glide, Picasso, and Fresco.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeCX7HRk2UC4iRGuZ4P3YgNRQatM86_kNl9cHyniJX1boy5igPjdUI8zjZ7DXgWrI07EQvU_gCOsaTUAQoiML8GstL6y42xDJWHx_R0i8foPcKIqhM5-8xko8c4EuDcexVN1hbOlmezlyCU95BPNv5qxzWw?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">MediaManager.get().setDownloadRequestBuilderFactory(<span class=\"hljs-keyword\">new<\/span> GlideDownloadRequestBuilderFactory());\n\nMediaManager.get().download(requireActivity()).load(<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/mobiledemoapp\/image\/upload\/v1\/Demo%20app%20content\/Frame_871_ao5o4r?_a=DAFAMiAiAiA0\"<\/span>).into(imageView);<\/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\n\n<p>By setting the Factory to glide within the MediaManager, we\u2019re telling it to use glide to download images, and then we can easily call download to download any image we want.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Upload Widget<\/h3>\n\n\n\n<p>The Upload widget allows you to quickly and easily open the phone gallery and allow your users to upload to your Cloudinary cloud.<\/p>\n\n\n\n<p>To open the widget, we\u2019ll use the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">UploadWidget<\/span><span class=\"hljs-selector-class\">.startActivity<\/span>(<span class=\"hljs-selector-tag\">getActivity<\/span>(), <span class=\"hljs-selector-tag\">UPLOAD_WIDGET_REQUEST_CODE<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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\n\n<p>Give it the <code>UPLOAD_WIDGET_REQUEST_CODE<\/code> so we can catch the callback.<\/p>\n\n\n\n<p>After choosing an asset, catch it at:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-keyword\">@Override<\/span>\n\n\u00a0\u00a0\u00a0\u00a0protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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\n\n<p>These are the results picked from the Upload widget:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\">List<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">UploadWidget.Result<\/span>&gt;<\/span> results = data.getParcelableArrayListExtra(UploadWidget.RESULT_EXTRA);\nVideo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As part of the Cloudinary Android SDK, we also offer our own easy-to-use native video player (based on ExoPlayer).<\/p>\n\n\n\n<p>Our player allows easy integration with Cloudinary features such as transformations and more.<\/p>\n\n\n\n<p>Our Cloudinary video player with controls is displayed.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">CldVideoPlayer player = <span class=\"hljs-keyword\">new<\/span> CldVideoPlayer(<span class=\"hljs-keyword\">this<\/span>.getContext(), <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/mobiledemoapp\/video\/upload\/v1706627936\/Demo%20app%20content\/sport-1_tjwumh.mp4\"<\/span>);\n\nplayer.getPlayer().setRepeatMode(Player.REPEAT_MODE_ALL);\n\nbinding.videoPlayerPlayerview.setPlayer(player.getPlayer());\n\nplayer.play();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><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\n\n<p>In the snippet, we\u2019ll create the <code>CLDVideoPlayer<\/code> object, give it the context and URL we want to play, then add it to our view and use <code>.play() <\/code>to play it.<\/p>\n\n\n\n<p>The lower part of the screen shows a demonstration of a video feed and how easily it can be achieved with our video player.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeTgla6c_FxtfiBTpB2iHNhXy1xsMxR_lRQ8KryKsLcICEMwG_YiVqHQmn8uIbFkEwrSfI6jrIwoQh2uKnWCwdQXoS9ut8Sw6MHCv0ocidO5fDxhtCGWopJynXqRlbRyHY2O3EVB9yYlUfy9mgP1JPP6B4?key=jbJtM22uXoRLRs2KZfkfBQ\" alt=\"\"\/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>If you\u2019re an Android developer looking for an easy solution to handle and optimize your assets, check out our Android SDK. The range of widgets and transformations to simplify your code and boost your application\u2019s performance.<\/p>\n\n\n\n<p>The Android SDK can be found <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_android\">here<\/a>, a\u200b\u200bnd to learn more about Cloudinary, <a href=\"https:\/\/cloudinary.com\/\">contact us today<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As a Mobile Developer for Cloudinary, I hold, maintain, and build SDKs for new mobile frameworks (Flutter, React Native, etc.). I recently built a new sample app complementary to the SDK package that you can use and play with the Cloudinary SDK and solution. An overview of what you can find in my sample app [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":34849,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[333,202,263],"class_list":["post-34848","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","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>Android Asset Management Made Easy With Cloudinary<\/title>\n<meta name=\"description\" content=\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android: Easy Asset Management\" \/>\n<meta property=\"og:description\" content=\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-24T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-08T08:54:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\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:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/android-easy-asset-management\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Android: Easy Asset Management\",\"datePublished\":\"2024-07-24T14:00:00+00:00\",\"dateModified\":\"2024-09-08T08:54:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/android-easy-asset-management\"},\"wordCount\":780,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA\",\"keywords\":[\"Android\",\"Mobile\",\"SDK\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/android-easy-asset-management\",\"url\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718\",\"name\":\"Android Asset Management Made Easy With Cloudinary\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage\"},\"image\":{\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA\",\"datePublished\":\"2024-07-24T14:00:00+00:00\",\"dateModified\":\"2024-09-08T08:54:38+00:00\",\"description\":\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.\",\"breadcrumb\":{\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android: Easy Asset Management\"}]},{\"@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\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Android Asset Management Made Easy With Cloudinary","description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.","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:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718","og_locale":"en_US","og_type":"article","og_title":"Android: Easy Asset Management","og_description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.","og_url":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718","og_site_name":"Cloudinary Blog","article_published_time":"2024-07-24T14:00:00+00:00","article_modified_time":"2024-09-08T08:54:38+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/android-easy-asset-management"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Android: Easy Asset Management","datePublished":"2024-07-24T14:00:00+00:00","dateModified":"2024-09-08T08:54:38+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/android-easy-asset-management"},"wordCount":780,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA","keywords":["Android","Mobile","SDK"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/android-easy-asset-management","url":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718","name":"Android Asset Management Made Easy With Cloudinary","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage"},"image":{"@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA","datePublished":"2024-07-24T14:00:00+00:00","dateModified":"2024-09-08T08:54:38+00:00","description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile Developer, shares his sample app to easily manage your assets on Android.","breadcrumb":{"@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/medium.com\/codex\/android-easy-asset-management-2e5e6c1c9718#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Android: Easy Asset Management"}]},{"@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":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676345\/andriod_asset_management-blog\/andriod_asset_management-blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34848","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\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=34848"}],"version-history":[{"count":2,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34848\/revisions"}],"predecessor-version":[{"id":35634,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34848\/revisions\/35634"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/34849"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=34848"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=34848"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=34848"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}