I am developing an Android app in which I am retrieving an image from a server and show it in an image view using Picasso. Some image URLs don't work even though I can test them successfully in a browser.
For example this URL works correctly:
http://www.tonightfootballreport.com/\Filebucket\Picture\image\png\20160730011032_BPL.png
But this one fails:
http://www.tonightfootballreport.com/\Filebucket\Picture\image\png\20160807025619_Serie A.png
The difference appears to be that the failing URL contains a space. What do I need to do to make this work?
String temp = "http://www.tonightfootballreport.com/\Filebucket\Picture\image\png\20160807025619_Serie A.png";
temp = temp.replaceAll(" ", "%20");
URL sourceUrl = new URL(temp);
Encode the URL,
String url = "http://www.tonightfootballreport.com/Filebucket/Picture/image/png/20160807025619_Serie A.png";
String encodedUrl = URLEncoder.encode(url, "utf-8");
EDIT #1 :
The problem with above method as #Wai Yan Hein, pointed is that it encode all the characters in the url including the protocol.
The following code solves that issue,
String urlStr = "http://www.tonightfootballreport.com/Filebucket/Picture/image/png/20160807025619_Serie A.png";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
Edit #2
Alternate solution using Uri.parse,
String urlStr = "http://www.tonightfootballreport.com/Filebucket/Picture/image/png/20160807025619_Serie A.png";
String url = Uri.parse(urlStr)
.buildUpon()
.build()
.toString();
Check if the URL is indeed valid and if not try encoding it,
if(!Patterns.WEB_URL.matcher(url).matches()){
URLEncoder.encode(url, "utf-8");
//Now load via Picasso
}
else{
//Proceed with loading via picasso
}
Related
For Uri.Builder, I'm using scheme(String) and building a URL string from there. However, within my final String there is a colon symbol : which changes the results from the query. Here is my code.
Uri.Builder toBuild = new Uri.Builder();
final String baseURL = "http://api.openweathermap.org/data/2.5/forecast/daily";
toBuild.scheme(baseURL)
.appendQueryParameter("zip", postal_Code[0])
.appendQueryParameter("mode", "json")
.appendQueryParameter("units", "metric")
.appendQueryParameter("cnt", "7");
String formURL = toBuild.toString();
Log.v(LOG_TAG, "Formed URL: " + formURL);
My resulting String should have been http://api.openweathermap.org/data/2.5/forecast/daily?zip=94043&mode=json&units=metric&cnt=7
but instead ended like http://api.openweathermap.org/data/2.5/forecast/daily:?zip=94043&mode=json&units=metric&cnt=7
with the colon appearing after the daily from the baseURL String. Please advise on how to remove the colon from the String. Thanks.
The ":" is coming because you are setting the baseUrl using the scheme which is supposed to be ("http", "https" etc) and in a url scheme is always followed by a colon so that is why u see the extra colon.
I would build this URL part by part like this:
Uri.Builder builder = new Uri.Builder();
builder.scheme("http")
.authority("api.openweathermap.org")
.appendPath("data")
.appendPath("2.5")
.appendPath("forecast")
.appendPath("daily")
.appendQueryParameter("zip", "94043")
.appendQueryParameter("mode", "json")
.appendQueryParameter("units", "metric")
.appendQueryParameter("cnt", "7");
String formURL = builder.toString();
result: http://api.openweathermap.org/data/2.5/forecast/daily?zip=94043&mode=json&units=metric&cnt=7
I want encoded URL having India language in query string. e.g.
http://online3.esakal.com/NewsDetails.aspx?NewsId=4741992566950155024&SectionId=10SectionName=पुणे&NewsTitle=पुण्यात गणरायाला उत्साहात निरोप (फोटोफीचर1)
if I load above URL in the web-view of android, i get following URL in onPageFinished callback method of WebViewClient.
encoded url from webview client :
http://online3.esakal.com/NewsDetails.aspx?NewsId=4741992566950155024&SectionId=10SectionName=%E0%A4%AA%E0%A5%81%E0%A4%A3%E0%A5%87&NewsTitle=%E0%A4%AA%E0%A5%81%E0%A4%A3%E0%A5%8D%E0%A4%AF%E0%A4%BE%E0%A4%A4%20%E0%A4%97%E0%A4%A3%E0%A4%B0%E0%A4%BE%E0%A4%AF%E0%A4%BE%E0%A4%B2%E0%A4%BE%20%E0%A4%89%E0%A4%A4%E0%A5%8D%E0%A4%B8%E0%A4%BE%E0%A4%B9%E0%A4%BE%E0%A4%A4%20%E0%A4%A8%E0%A4%BF%E0%A4%B0%E0%A5%8B%E0%A4%AA%20(%E0%A4%AB%E0%A5%8B%E0%A4%9F%E0%A5%8B%E0%A4%AB%E0%A5%80%E0%A4%9A%E0%A4%B01)
But if i used following code to encode original url, i get follwoing url after encoding:
try {
String url1 = "http://online3.esakal.com/NewsDetails.aspx?" +
"NewsId=4741992566950155024&SectionId=10SectionName=पुणे&NewsTitle=पुण्यात गणरायाला उत्साहात निरोप (फोटोफीचर1)";
URL url = new URL(url1);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(),
url.getPort(), url.getPath(), URLEncoder.encode(url.getQuery(), "UTF-8"), url.getRef());
url = uri.toURL();
String str1 = url.toString();
}catch(Exception e) {
System.out.println(""+e);
}
: http://online3.esakal.com/NewsDetails.aspx?NewsId%253D4741992566950155024%2526SectionId%253D10SectionName%253D%25E0%25A4%25AA%25E0%25A5%2581%25E0%25A4%25A3%25E0%25A5%2587%2526NewsTitle%253D%25E0%25A4%25AA%25E0%25A5%2581%25E0%25A4%25A3%25E0%25A5%258D%25E0%25A4%25AF%25E0%25A4%25BE%25E0%25A4%25A4+%25E0%25A4%2597%25E0%25A4%25A3%25E0%25A4%25B0%25E0%25A4%25BE%25E0%25A4%25AF%25E0%25A4%25BE%25E0%25A4%25B2%25E0%25A4%25BE+%25E0%25A4%2589%25E0%25A4%25A4%25E0%25A5%258D%25E0%25A4%25B8%25E0%25A4%25BE%25E0%25A4%25B9%25E0%25A4%25BE%25E0%25A4%25A4+%25E0%25A4%25A8%25E0%25A4%25BF%25E0%25A4%25B0%25E0%25A5%258B%25E0%25A4%25AA+%2528%25E0%25A4%25AB%25E0%25A5%258B%25E0%25A4%259F%25E0%25A5%258B%25E0%25A4%25AB%25E0%25A5%2580%25E0%25A4%259A%25E0%25A4%25B01%25291
I do not understand that how does web-view does the url encoding?
i am working with JSoup and Android to get image urls from some site but some urls contains special characters like (é,è,à...) example :
http://www.mysite.com/détail du jour.jpg
the element.attr("abs:src") returns the same url as above
till now no problem to retrieve the url but when i submit this url in the code below it returns file not found (i grabbed this function from an example on the internet) :
public Object fetch(String address) throws MalformedURLException,IOException {
try {
URL url = new URL(address);
Object content = url.getContent();
return content;
} catch (Exception e) {
return null;
}
}
i think the problem is in the url format because when i get the real address of the image in google chrome :
http://www.mysite.com/d%C3%A9tail%20du%20jour.jpg
and submit it in the code like :
URL url = new URL("http://www.mysite.com/d%C3%A9tail%20du%20jour.jpg");
the image loads correctly so how to get this formatted url from JSoup?
thanks
You need to use URLEncoder for the extracted url from the JSoup.
Something like:
URL url = new URL(URLEncoder.encode(address));
The spaces between will be replaced with special character values %something
I am using grid view for displaying image using xml parsing,i got some exception like
java.lang.IllegalArgumentException: Illegal character in path at
index 80:
http://www.theblacksheeponline.com/party_img/thumbspps/912big_361999096_Flicking
Off Douchebag.jpg
How to solve this problem? I want to display all kind of url,anybody knows please give sample code for me.
Thanks All
URL encoding is done in the same way on android as in Java SE;
try {
String url = "http://www.example.com/?id=123&art=abc";
String encodedurl = URLEncoder.encode(url,"UTF-8");
Log.d("TEST", encodedurl);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Also you can use this
private static final String ALLOWED_URI_CHARS = "##&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
it's the most simple method
As Ben says in his comment, you should not use URLEncoder.encode to full URLs because you will change the semantics of the URL per the following example from the W3C:
The URIs
http://www.w3.org/albert/bertram/marie-claude
and
http://www.w3.org/albert/bertram%2Fmarie-claude
are NOT identical, as in the second
case the encoded slash does not have
hierarchical significance.
Instead, you should encode component parts of a URL independently per the following from RFC 3986 Section 2.4
Under normal circumstances, the only
time when octets within a URI are
percent-encoded is during the process
of producing the URI from its
component parts. This is when an
implementation determines which of the
reserved characters are to be used as
subcomponent delimiters and which can
be safely used as data. Once
produced, a URI is always in its
percent-encoded form.
So, in short, for your case you should encode/escape your filename and then assemble the URL.
You don't encode the entire URL, only parts of it that come from "unreliable sources" like.
String query = URLEncoder.encode("Hare Krishna ", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
URLEncoder should be used only to encode queries, use java.net.URI class instead:
URI uri = new URI(
"http",
"www.theblacksheeponline.com",
"/party_img/thumbspps/912big_361999096_Flicking Off Douchebag.jpg",
null);
String request = uri.toASCIIString();
you can use below method
public String parseURL(String url, Map<String, String> params)
{
Builder builder = Uri.parse(url).buildUpon();
for (String key : params.keySet())
{
builder.appendQueryParameter(key, params.get(key));
}
return builder.build().toString();
}
I tried with URLEncoder that added (+) sign in replace of (" "), but it was not working and getting 404 url not found error.
Then i googled for get better answer and found this and its working awesome.
String urlStr = "http://www.example.com/test/file name.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
This way of encoding url its very useful because using of URL we can separate url into different part. So, there is no need to perform any string operation.
Then second URI class, this approach takes advantage of the URI class feature of properly escaping components when you construct a URI via components rather than from a single string.
I recently wrote a quick URI encoder for this purpose. It even handles unicode characters.
http://www.dmurph.com/2011/01/java-uri-encoder/
How do you encode a URL in Android?
I thought it was like this:
final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);
If I do the above, the http:// in urlAsString is replaced by http%3A%2F%2F in encodedURL and then I get a java.net.MalformedURLException when I use the URL.
You don't encode the entire URL, only parts of it that come from "unreliable sources".
Java:
String query = URLEncoder.encode("apples oranges", Charsets.UTF_8.name());
String url = "http://stackoverflow.com/search?q=" + query;
Kotlin:
val query: String = URLEncoder.encode("apples oranges", Charsets.UTF_8.name())
val url = "http://stackoverflow.com/search?q=$query"
Alternatively, you can use Strings.urlEncode(String str) of DroidParts that doesn't throw checked exceptions.
Or use something like
String uri = Uri.parse("http://...")
.buildUpon()
.appendQueryParameter("key", "val")
.build().toString();
I'm going to add one suggestion here. You can do this which avoids having to get any external libraries.
Give this a try:
String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();
You can see that in this particular URL, I need to have those spaces encoded so that I can use it for a request.
This takes advantage of a couple features available to you in Android classes. First, the URL class can break a url into its proper components so there is no need for you to do any string search/replace work. Secondly, this approach takes advantage of the URI class feature of properly escaping components when you construct a URI via components rather than from a single string.
The beauty of this approach is that you can take any valid url string and have it work without needing any special knowledge of it yourself.
For android, I would use
String android.net.Uri.encode(String s)
Encodes characters in the given string as '%'-escaped octets using the UTF-8 scheme. Leaves letters ("A-Z", "a-z"), numbers ("0-9"), and unreserved characters ("_-!.~'()*") intact. Encodes all other characters.
Ex/
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
Also you can use this
private static final String ALLOWED_URI_CHARS = "##&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
it's the most simple method
try {
query = URLEncoder.encode(query, "utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
you can use below methods
public static String parseUrl(String surl) throws Exception
{
URL u = new URL(surl);
return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString();
}
or
public String parseURL(String url, Map<String, String> params)
{
Builder builder = Uri.parse(url).buildUpon();
for (String key : params.keySet())
{
builder.appendQueryParameter(key, params.get(key));
}
return builder.build().toString();
}
the second one is better than first.
Find Arabic chars and replace them with its UTF-8 encoding.
some thing like this:
for (int i = 0; i < urlAsString.length(); i++) {
if (urlAsString.charAt(i) > 255) {
urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
}
}
encodedURL = urlAsString;