{"id":415,"date":"2015-02-20T14:49:05","date_gmt":"2015-02-20T13:49:05","guid":{"rendered":"http:\/\/queen.run.montefiore.ulg.ac.be\/~barbette\/?p=415"},"modified":"2015-02-20T14:49:05","modified_gmt":"2015-02-20T13:49:05","slug":"get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements","status":"publish","type":"post","link":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/","title":{"rendered":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements"},"content":{"rendered":"<p>If someone wants to use the URI class to parse an URL in Android, and get the given parameters the normal way to do it is :<\/p>\n<pre>String url = \"http:\/\/www.example.com\/?argument=value&amp;argument2=value2&amp;...\";\r\nUri uri = Uri.parse(url);\r\n\r\n\/\/To get the value of known parameters\r\nString argument = uri.getQueryParameter(\"argument\");\r\nString argument2 = uri.getQueryParameter(\"argument2\");\r\n...\r\n\r\n\/\/To look at all parameters if you don't know what you're waiting for\r\nfor (String key : uri.getQueryParameterNames()) {\r\n   String value = uri.getQueryParameter(key);\r\n   \/\/Do something with value  key, like using a switch\/case\r\n}<\/pre>\n<p><code><\/code><br \/>\nThe problem with the first method is that :<\/p>\n<ul>\n<li>You need to know the arguments, and you cannot check if there is &#8220;unknow&#8221; arguments, like a malicious client trying to pass &#8220;include=X&#8221;<\/li>\n<li>The query part of the URI is parsed each time you call setQueryParameter from the beginning !<\/li>\n<\/ul>\n<p>The problem with the second method\u00a0\u00a0is that :<\/p>\n<ul>\n<li>When you call getQueryParameterNames() the whole query is parsed once<\/li>\n<li>The query part of the URI is parsed each time you call setQueryParameter from the beginning !<\/li>\n<li>getQueryParameterNames() is only available starting with Android 3.0 (API Level 11)<\/li>\n<\/ul>\n<p>So I wrote the code below, which gives you a map of argument-&gt;value in one reading. You can then call any map-related function like containsKey(key) to know if an argument is in the URL, entrySet() to iterate through all argument\/value, keySet() to get all the arguments, and values() to get all values. This only parse the URL once and is much more convenient. This code is in distributed in any GPL variant, take the one you prefer.<\/p>\n<pre>\t\/**\r\n\t * Return a map of argument-&gt;value from a query in a URI\r\n\t * @param uri The URI\r\n\t *\/\r\n\tprivate Map&lt;String,String&gt; getQueryParameter(Uri uri) {\r\n\t    if (uri.isOpaque()) {\r\n\t    \treturn Collections.emptyMap();\r\n\t    }\r\n\r\n\t    String query = uri.getEncodedQuery();\r\n\t    if (query == null) {\r\n\t        return Collections.emptyMap();\r\n\t    }\r\n\r\n\t    Map&lt;String,String&gt; parameters = new LinkedHashMap&lt;String,String&gt;();\r\n\t    int start = 0;\r\n\t    do {\r\n\t        int next = query.indexOf('&amp;', start);\r\n\t        int end = (next == -1) ? query.length() : next;\r\n\r\n\t        int separator = query.indexOf('=', start);\r\n\t        if (separator &gt; end || separator == -1) {\r\n\t            separator = end;\r\n\t        }\r\n\r\n\t        String name = query.substring(start, separator);\r\n\t        String value;\r\n\t        if (separator &lt; end)\r\n\t        \tvalue = query.substring(separator + 1, end);\r\n\t        else\r\n\t        \tvalue = \"\";\r\n\t        \r\n\t        parameters.put(Uri.decode(name),Uri.decode(value));\r\n\r\n\t        \/\/ Move start to end of name.\r\n\t        start = end + 1;\r\n\t    } while (start &lt; query.length());\r\n\r\n\t    return Collections.unmodifiableMap(parameters);\r\n\t}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>If someone wants to use the URI class to parse an URL in Android, and get the given parameters the normal way to do it is : String url = &#8220;http:\/\/www.example.com\/?argument=value&amp;argument2=value2&amp;&#8230;&#8221;; Uri uri = Uri.parse(url); \/\/To get the value of known parameters String argument = uri.getQueryParameter(&#8220;argument&#8221;); String argument2 = uri.getQueryParameter(&#8220;argument2&#8221;); &#8230; \/\/To look at all &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,67],"tags":[],"class_list":["post-415","post","type-post","status-publish","format-standard","hentry","category-android","category-info2051"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Get a map (dictionnary) of arguments-&gt;value from an URI in Android with any API Level requirements - Tom Barbette<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Get a map (dictionnary) of arguments-&gt;value from an URI in Android with any API Level requirements - Tom Barbette\" \/>\n<meta property=\"og:description\" content=\"If someone wants to use the URI class to parse an URL in Android, and get the given parameters the normal way to do it is : String url = &quot;http:\/\/www.example.com\/?argument=value&amp;argument2=value2&amp;...&quot;; Uri uri = Uri.parse(url); \/\/To get the value of known parameters String argument = uri.getQueryParameter(&quot;argument&quot;); String argument2 = uri.getQueryParameter(&quot;argument2&quot;); ... \/\/To look at all &hellip; Continue reading &quot;Get a map (dictionnary) of arguments-&gt;value from an URI in Android with any API Level requirements&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/\" \/>\n<meta property=\"og:site_name\" content=\"Tom Barbette\" \/>\n<meta property=\"article:published_time\" content=\"2015-02-20T13:49:05+00:00\" \/>\n<meta name=\"author\" content=\"Tom Barbette\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@TomBarbette\" \/>\n<meta name=\"twitter:site\" content=\"@TomBarbette\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tom Barbette\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/\"},\"author\":{\"name\":\"Tom Barbette\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/person\\\/7f791766092e1207bc7a94a65e74f4fd\"},\"headline\":\"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements\",\"datePublished\":\"2015-02-20T13:49:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/\"},\"wordCount\":215,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\"},\"articleSection\":[\"Android\",\"INFO-2051 Object-oriented programming on mobile devices\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/\",\"name\":\"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements - Tom Barbette\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#website\"},\"datePublished\":\"2015-02-20T13:49:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#website\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\",\"name\":\"Tom Barbette\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#organization\",\"name\":\"Efficiency of Networked Systems Group\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-logo-uclouvain-2021-barbette.png\",\"contentUrl\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-logo-uclouvain-2021-barbette.png\",\"width\":512,\"height\":512,\"caption\":\"Efficiency of Networked Systems Group\"},\"image\":{\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/TomBarbette\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tom-barbette\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/#\\\/schema\\\/person\\\/7f791766092e1207bc7a94a65e74f4fd\",\"name\":\"Tom Barbette\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g\",\"caption\":\"Tom Barbette\"},\"sameAs\":[\"https:\\\/\\\/www.tombarbette.be\"],\"url\":\"https:\\\/\\\/perso.uclouvain.be\\\/tom.barbette\\\/author\\\/tom\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements - Tom Barbette","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:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/","og_locale":"en_US","og_type":"article","og_title":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements - Tom Barbette","og_description":"If someone wants to use the URI class to parse an URL in Android, and get the given parameters the normal way to do it is : String url = \"http:\/\/www.example.com\/?argument=value&amp;argument2=value2&amp;...\"; Uri uri = Uri.parse(url); \/\/To get the value of known parameters String argument = uri.getQueryParameter(\"argument\"); String argument2 = uri.getQueryParameter(\"argument2\"); ... \/\/To look at all &hellip; Continue reading \"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements\"","og_url":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/","og_site_name":"Tom Barbette","article_published_time":"2015-02-20T13:49:05+00:00","author":"Tom Barbette","twitter_card":"summary_large_image","twitter_creator":"@TomBarbette","twitter_site":"@TomBarbette","twitter_misc":{"Written by":"Tom Barbette","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/#article","isPartOf":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/"},"author":{"name":"Tom Barbette","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/person\/7f791766092e1207bc7a94a65e74f4fd"},"headline":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements","datePublished":"2015-02-20T13:49:05+00:00","mainEntityOfPage":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/"},"wordCount":215,"commentCount":0,"publisher":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization"},"articleSection":["Android","INFO-2051 Object-oriented programming on mobile devices"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/","name":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements - Tom Barbette","isPartOf":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#website"},"datePublished":"2015-02-20T13:49:05+00:00","breadcrumb":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/get-a-map-dictionnary-of-arguments-value-from-an-uri-in-android-with-any-api-level-requirements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/perso.uclouvain.be\/tom.barbette\/"},{"@type":"ListItem","position":2,"name":"Get a map (dictionnary) of arguments->value from an URI in Android with any API Level requirements"}]},{"@type":"WebSite","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#website","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/","name":"Tom Barbette","description":"","publisher":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/perso.uclouvain.be\/tom.barbette\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#organization","name":"Efficiency of Networked Systems Group","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/logo\/image\/","url":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-content\/uploads\/2022\/04\/cropped-logo-uclouvain-2021-barbette.png","contentUrl":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-content\/uploads\/2022\/04\/cropped-logo-uclouvain-2021-barbette.png","width":512,"height":512,"caption":"Efficiency of Networked Systems Group"},"image":{"@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/TomBarbette","https:\/\/www.linkedin.com\/in\/tom-barbette"]},{"@type":"Person","@id":"https:\/\/perso.uclouvain.be\/tom.barbette\/#\/schema\/person\/7f791766092e1207bc7a94a65e74f4fd","name":"Tom Barbette","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/aecd99cba3b4d91d3775fde3219bfa362cd99acfbe95848ec303b9685f366fcd?s=96&r=g","caption":"Tom Barbette"},"sameAs":["https:\/\/www.tombarbette.be"],"url":"https:\/\/perso.uclouvain.be\/tom.barbette\/author\/tom\/"}]}},"_links":{"self":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/comments?post=415"}],"version-history":[{"count":1,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/415\/revisions"}],"predecessor-version":[{"id":416,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/posts\/415\/revisions\/416"}],"wp:attachment":[{"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/media?parent=415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/categories?post=415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.uclouvain.be\/tom.barbette\/wp-json\/wp\/v2\/tags?post=415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}