Преобразование строки Android в URL для InetAddress приводит к ошибке

#android #string #parsing #url

#Android #строка #синтаксический анализ #url

Вопрос:

Я пытаюсь получить хост и IP-адрес из URL-адреса. Этот URL-адрес задается текстовым полем, при нажатии кнопки требуется, чтобы указанный текст сохранялся в строке, и я хочу преобразовать эту строку в URL. Это мой код:

 String value;
String ip;
URL url;

public void btnOnClick(View v){


    EditText text = (EditText)findViewById(R.id.txtWebsite);
    value = "http://"   text.getText().toString();
    TextView output = (TextView)findViewById(R.id.txtViewOutput);

    if (value.length() < 3){
        output.setText("At least 3 characters are required ");
    }else{
        try {
            url = new URL(value);

            //Here is where I get my error: (look below for the given error) 
            InetAddress address = InetAddress.getByName(new URL(***url***).getHost());

            ip = address.getHostAddress();

        }catch (MalformedURLException e){
            System.out.println("Error: "   e.getMessage());
            e.printStackTrace();
        }

    }

}
 

Ошибка:

http://oi60.tinypic.com/b6vpxy.jpg

Поэтому мне кажется, что он не преобразует строку в URL, и я не знаю, как я могу это исправить. Если бы кто-нибудь мог указать мне правильное направление и сказать, что я делаю не так, я был бы признателен.

Комментарии:

1. Ваша ссылка на изображение не работает.

2. Попробуйте это: oi60.tinypic.com/b6vpxy.jpg

3. Это работает для меня, я не понимаю, почему это не для вас.

Ответ №1:

Переменная url уже имеет тип URL . не нужно ничего делать new URL(url) , просто сделайте это вместо этого:

        InetAddress address = InetAddress.getByName(url.getHost());
 

Комментарии:

1. Когда я это делаю, я получаю сообщение об ошибке: UnknownHostException

2. Это означает, что имя хоста не было найдено. Работает ли это для хорошо известного имени хоста, такого как ‘stackoverflow.com ?

3. Выполнение этого: url = новый URL (» stackoverflow.com » ); InetAddress address = InetAddress.getByName(url.getHost()); выдает ту же ошибку (http и www. part автоматически удаляются стеком, но его там)

4. Вы должны установить протокол. Попробуйте с помощью http:// www.stackoverflow.com и это сработает.

5. Это прекрасно работает для меня с помощью ‘http:// stackoverflow.com ‘ (минус пробел), если устройство имеет правильное сетевое подключение. Сбой в режиме полета с UnknownHostException.

Ответ №2:

вы можете использовать это для синтаксического анализа URL-адреса из строки:

     ArrayList retrieveLinks(String text) {
    ArrayList links = new ArrayList();

    String regex = "\(?\b(http://|www[.])[-A-Za-z0-9 amp;@#/%?=~_()|!:,.;]*[-A-Za-z0-9 amp;@#/%=~_()|]";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(text);
    while(m.find()) {
    String urlStr = m.group();
    char[] stringArray1 = urlStr.toCharArray();

    if (urlStr.startsWith("(") amp;amp; urlStr.endsWith(")"))
    {

        char[] stringArray = urlStr.toCharArray(); 

        char[] newArray = new char[stringArray.length-2];
        System.arraycopy(stringArray, 1, newArray, 0, stringArray.length-2);
        urlStr = new String(newArray);
        System.out.println("Finally Url =" newArray.toString());

    }
    System.out.println("...Url..." urlStr);
    links.add(urlStr);
    }
    return links;
    }
 

надеюсь, это поможет.