0

저는이 예외에 대한 간단한 해결책 인 것처럼 보이는 것을 적용 해 왔습니다. 매니페스트에 사용 권한을 적용했으며 에뮬레이터가 아닌 실제 장치를 사용합니다.파일을 다운로드 할 때 UnknownHostException이 발생했습니다.

입니다 :

fileUrl = "http://xxx.xxx.xx.xx/resources/upload/pdfs/sample ははは.pdf"; 
    String urlLastPath = fileUrl.replaceFirst(".*/([^/?]+).*", "$1"); //urlLastPath = sample ははは.pdf 

    String urlEncoded = URLEncoder.encode(urlLastPath, "utf-8"); //urlEncoded = sample %E3%81%AF%E3%81%AF%E3%81%AF.pdf 

    File file = new File(fileUrl); 
    String fileUrlRemains = file.getPath().replaceAll(file.getName(), ""); //fileUrlRemains = http://xxx.xxx.xx.xx/resources/upload/pdfs/ 

    String urlDecoded = null; 
    if (urlEncoded.contains(" ")) { 
     urlDecoded = urlEncoded.replaceAll(" ", "%20"); 
     urlStr = fileUrlRemains + urlDecoded; 
    } else if (urlEncoded.contains("+")) { 
     urlDecoded = urlEncoded.replaceAll(Pattern.quote("+"), "%20"); 
     urlStr = fileUrlRemains + urlDecoded; 
    } else { 
     urlStr = fileUrlRemains + urlEncoded; 
    } 

    URL url = new URL(urlStr); //urlStr is the complete file url(http://xxx.xxx.xx.xx/resources/upload/pdfs/sample%20%E3%81%AF%E3%81%AF%E3%81%AF.pdf) 

    URLConnection conection = url.openConnection(); 
    conection.connect(); //This is where the exception points 

    . 
    . 
    . 

내 매니페스트 :

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="17" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+1

확실하지 않지만 URL을 인코딩해야합니다. [Android의 URL 인코딩] (http://stackoverflow.com/questions/3286067/url-encoding-in-android) –

+0

@AndrewT를 참조하십시오. 방금 질문을 편집했는데, 실제로 이미 일본어 부분을 인코딩했습니다. 이것은 이전에 효과가 있었고, 나는 무슨 일이 일어 났는지 모른다. –

+0

Android 브라우저에서 인코딩되지 않은 URL과 인코딩 된 URL에 모두 액세스 해 보시기 바랍니다. 또한 PC 브라우저에서 액세스 할 수 있는지 확인하십시오. –

답변

1

문제는 잘못된 URL로 인해 발생으로 인해 변환에 의해 발생이 줄

String fileUrlRemains = file.getPath().replaceAll(file.getName(), ""); 
//expected: http://xxx.xxx.xx.xx/resources/upload/pdfs/ 
//actually: http:\xxx.xxx.xx.xx\resources\upload\pdfs\ 

참고 단일 슬래시로 URL ~ File.

RegEx가 처음에는 무엇을하는지 모르지만 여기에서는 파일 이름과 나머지 URL을 얻는 간단한 방법을 사용합니다.

int i = fileUrl.lastIndexOf("/") + 1; 
String urlLastPath = fileUrl.substring(i, fileUrl.length()); 
String fileUrlRemains = fileUrl.substring(0, i); 

마지막 슬래시를 찾으려고 시도하고 이에 따라 URL을 "분할"합니다.

관련 문제