如何从java.net.URL创建android.net.Uri?

27

我想使用 intent.setData(Uri uri) 方法传递从URL获取到的数据。为了做到这一点,我需要能够从URL创建一个Uri(或者从我从URL读取的byte[]或从byte[]创建的ByteArrayInputStream等)。然而,我不知道应该如何实现。

所以,有没有办法在不先将数据写入本地文件的情况下从从URL获取的数据创建 Uri?

5个回答

42

11
toURI方法从net包返回"URI",setData方法需要"Uri"。 - Strassenrenner
这并没有考虑参数可能具有的特殊字符。 - Farrukh Chishti
@QualtarDemix,这并不是OP所要求的。我提供了一个基于这个需求的解决方案。 - Buhake Sindi
@BuhakeSindi:好的,那是隐含的。想法是获得最佳可能的解决方案,即使没有明确要求。 - Farrukh Chishti
假设URL字符串中不包含http - IgorGanapolsky

13

我认为你的答案可以在这里找到...

Uri.Builder.build() 在普通 URL 方面表现得非常好,但是它在端口号支持方面失败了。

我发现让它先解析给定的 URL,然后再使用它是使其支持端口号最简单的方法。

Uri.Builder b = Uri.parse("http://www.yoursite.com:12345").buildUpon();

b.path("/path/to/something/");
b.appendQueryParameter("arg1", String.valueOf(42));

if (username != "") {
  b.appendQueryParameter("username", username);
}

String url = b.build().toString(); 

来源: http://twigstechtips.blogspot.com/2011/01/android-create-url-using.html


1
另外,你可以使用 yourUrlVariable.toString() 来代替硬编码的 "http://..."。 - dmon

11

4
请注意,在Android中,Uri与Java URI不同。以下是如何避免使用硬编码字符串,并同时创建一个Uri,其中仅将http URL字符串的路径部分编码以符合RFC2396:
示例URL字符串:
String thisUrl = "http://lapi.transitchicago.com/api/1.0/ttarrivals.aspx?key=[redacted]&mapid=value"

方法:

private Uri.Builder builder;
public Uri getUriFromUrl(String thisUrl) {
    URL url = new URL(thisUrl);
    builder =  new Uri.Builder()
                            .scheme(url.getProtocol())
                            .authority(url.getAuthority())
                            .appendPath(url.getPath());
    return builder.build();
}

为了处理查询字符串,您需要解析url.getQuery(),如这里所描述的,并将其输入到builder.appendQueryParameter()中。

2
try {
    uri = new URI(url.toString());
} catch (URISyntaxException e) {
}

1
无法实例化类型 Uri。 - Prasad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接