回答:
URL全体をエンコードするのではなく、「信頼できないソース」からのURLの一部のみをエンコードします。
String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;
または、チェックされた例外をスローしないDroidPartsのStrings.urlEncode(String str)を使用できます。
または次のようなものを使用します
String uri = Uri.parse("http://...")
.buildUpon()
.appendQueryParameter("key", "val")
.build().toString();
Uri.encode(query);
代わりに使用されます。
ここに提案を1つ追加します。これを行うと、外部ライブラリを取得する必要がなくなります。
これを試してみてください:
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();
この特定のURLでは、リクエストに使用できるように、これらのスペースをエンコードする必要があることがわかります。
これは、Androidクラスで利用できるいくつかの機能を利用します。まず、URLクラスはURLを適切なコンポーネントに分割できるため、文字列の検索/置換作業を行う必要はありません。次に、このアプローチは、単一の文字列からではなくコンポーネントを介してURIを構築するときに、コンポーネントを適切にエスケープするURIクラス機能を利用します。
このアプローチの優れた点は、有効なURL文字列を取得して、特別な知識を必要とせずに機能させることができることです。
アンドロイドの場合、文字列を使用しますandroid.net.Uri.encode(String s)
UTF-8スキームを使用して、指定された文字列の文字を '%'エスケープオクテットとしてエンコードします。文字( "AZ"、 "az")、数字( "0-9")、および予約されていない文字( "_- !.〜 '()*")はそのまま残します。他のすべての文字をエンコードします。
元/
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
Uri.encode("a=1&b=1")
生成a%3D1%26b%3D1
されますが、予想されていましたa=1&b=1
a=1&b=1
がクエリとして入力した場合は、それを正確にクエリする必要があります。
これも使えます
private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
最も簡単な方法です
以下の方法を使用できます
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();
}
または
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();
}
2つ目は1つ目よりも優れています。