2012-10-30 5 views
5

サポートされていないURLプロトコル(スキーム)を持つ文字列をURLにエンコードしたいとします。 したがって、3行目で例外がスローされます。 URLクラスで "mmsh"や他の "custom_name"スキームをサポートさせる方法はありますか?java(アンドロイド)の他のプロトコルをサポートするためにURLクラスを拡張する方法は?

EDIT:私のアプリケーションにはいくつかのプロトコルを登録したくありません。私はちょうど "サポートされていないプロトコル"例外なしでURLクラスを使用できるようにしたい。私はURLクラスを使用して、URL文字列を解析し整理します。

String string="mmsh://myserver.com/abc"; 

String decodedURL = URLDecoder.decode(string, "UTF-8"); 
URL url = new URL(decodedURL); 
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
+1

[こちら]の例をご確認ください(http://stackoverflow.com/questions/861500/url-to-load-resources-from-the-classpath-in-java) –

+1

これはいくつかの助けになるかもしれません:http://stackoverflow.com/questions/ 11421048/android-ios-custom-uri-protocol-handling –

+0

ありがとうございますが、私のアプリケーションにいくつかのプロトコルを登録したくありません。私はちょうど "サポートされていないプロトコル"例外なしでURLクラスを使用できるようにしたい。私はURLクラスを使用して、URL文字列を解析し整理します。 – frankish

答えて

3

私はURL to load resources from the classpath in JavaCustom URL protocols and multiple classloadersに提供されたコードに基づいて、サンプルプログラムを作成し、正常に動作するようです。あなたは[URLStreamHandlerの](http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLStreamHandler.html)から拡張する必要があり、Javaで

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    URL url; 
    try { 

     url = new URL(null, "user:text.xml", new Handler()); 
     InputStream ins = url.openStream(); 
     ins.read(); 
     Log.d("CustomURL", "Created and accessed it using custom handler "); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
public static class Handler extends URLStreamHandler { 
    @Override 
    protected URLConnection openConnection(URL url) throws IOException { 
     return new UserURLConnection(url); 
    } 

    public Handler() { 
    } 

    private static class UserURLConnection extends URLConnection { 
     private String fileName; 
     public UserURLConnection(URL url) { 
      super(url); 
      fileName = url.getPath(); 
     } 
     @Override 
     public void connect() throws IOException { 
     } 
     @Override 
     public InputStream getInputStream() throws IOException { 

      File absolutePath = new File("/data/local/", fileName); 
      return new FileInputStream(absolutePath); 
     } 
    } 
} 
関連する問題