2012-10-30 9 views
5

Chcę url zakodować ciąg znaków, który ma nieobsługiwany protokół url (schemat). W trzecim wierszu zostanie zgłoszony wyjątek. Czy mimo to można utworzyć obsługę klas adresów URL "mmsh" lub jakikolwiek inny schemat "custom_name"?Jak rozszerzyć klasę adresów URL, aby obsługiwać inne protokoły w java (Android)?

EDYCJA: Nie chcę rejestrować niektórych protokołów dla mojej aplikacji. Po prostu chcę móc używać klasy URL bez wyjątku "nieobsługiwanego protokołu". Używam klasy URL tylko do parsowania i uporządkowania łańcucha adresu 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

w Javie trzeba rozciągać się od [URLStreamHandler] (http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLStreamHandler.html) przykład sprawdzić [tutaj] (http://stackoverflow.com/questions/861500/url-to-load-resources-from-the-classpath-in-java) –

+1

Może to być pomocne przy próbie: http://stackoverflow.com/questions/ 11421048/android-ios-custom-uri-protocol-handling –

+0

Dziękuję wszystkim, ale nie chcę rejestrować niektórych protokołów dla mojej aplikacji. Po prostu chcę móc używać klasy URL bez wyjątku "nieobsługiwanego protokołu". Używam klasy URL tylko do parsowania i uporządkowania łańcucha adresu URL. – frankish

Odpowiedz

3

stworzyłem przykładowy program na podstawie kodu znajdującego się na URL to load resources from the classpath in Java i Custom URL protocols and multiple classloaders i wydaje się działać prawidłowo.

@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); 
     } 
    } 
}