2011-03-17 6 views
7

저는 48 시간 이상이 문제를 해결해 왔으며 인터넷상의 어느 곳에서나 답을 찾을 수 없었습니다.Android Webview HTML 로딩 자바 스크립트 문제

안드로이드 애플리케이션이 처음 실행될 때 콘텐츠를 다운로드하고 (콘텐츠가 20MB 이상) 사용자의 SD 카드에/mnt/sdcard/{my package}/폴더의 파일이 압축 해제됩니다. 콘텐츠에는 HTML 파일, CSS 파일, JS 파일 및 이미지가 포함됩니다. 여기에 SD 카드 (/ =/MNT/SDCARD/{내 패키지}/폴더 /)에 기록됩니다 무엇의 전체 구조입니다 :

/내용/

a.html 
b.html 
images/ 
    image1.jpg 

/CSS/

c.css 
d.css 

/JS/여기

e.js 
f.js 

는 SD 카드에서 HTML 파일을로드 내 코드입니다 :

webView = (WebView) findViewById(R.id.pageBrowser); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.addJavascriptInterface(new LinkHandlerInterface(), "Android"); 
    webView.setWebViewClient(new PageWebViewClient()); 

    // contentLocation + url is equal to the full path to the html file 
    webView.loadUrl("file://" + contentLocation + url); 

이 코드는 HTML 페이지를로드합니다. 문제는 아직 없습니다. 각 페이지에는 다음과 같은 헤드 태그가 있습니다.

<link rel="stylesheet" type="text/css" href="../css/screen.css" media="all" /> 
    <link rel="stylesheet" type="text/css" href="../css/inPractice.css" media="all" /> 
    <link rel="stylesheet" type="text/css" href="../css/inPracticeScheme.css" media="all" /> 
    <link rel="stylesheet" type="text/css" href="../css/mobile/iPad.css" media="all" /> 
    <script type="text/javascript" src="../js/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript" src="../js/inPractice-utilities.js"></script> 
    <script type="text/javascript" src="../js/inPractice.js"></script> 
    <script type="text/javascript" src="../js/mobile/inpractice.ipad.js"></script> 

여기에 문제가 있습니다. 내 WebView는 HTML을 잘 렌더링합니다. 그것은 심지어 CSS를 완벽하게로드하고 적용합니다. 그러나 Javascript를로드하고 실행하는 것을 거부합니다. 위의 내용을 기억하면 js 폴더는 실제로 html 파일에서 하나의 파일로 표시되므로 정확한 위치를 가리키고 있습니다.

는 여기에 내가 알고있는 목록입니다 :

  • 내가 사용하고있어 CSS 잘 적용되고, 그래서이 문제는 파일 위치하지 알고있다.

  • 이전에이 코드를 사용했지만 응용 프로그램의 assets 폴더 (file : /// android_assets/...)에서 파일을로드하는 중이었고 완벽하게 작동했습니다. 내용이 너무 커서 응용 프로그램과 함께 사용할 수 없으므로 SD 카드로 옮길 수 없습니다.

  • 모든 자바 스크립트 메서드가 스크립트 태그 안에 나열되는 방식으로 HTML 파일을 변경하면 잘 동작합니다. HTML에 대한 제어권이 없으므로이 변경 사항을 영구적으로 적용 할 수 없습니다. 이것은 WebView가 Javascript를 실행하는 데 아무런 문제가 없다는 것을 말해줍니다.

  • 이미지가 잘로드됩니다.

나는 신선한 아이디어가되었습니다. 누구든지 내 WebView 내 자바 스크립트 파일을로드 할 수없는 어떤 단서가 있습니까? 이걸 본 사람 있어요?

편집 : 여기에 내가 여기에 볼 수 있습니다 사용하려고 해요 JS 파일은 다음과 같습니다

http://www.automatastudios.com/clients/cco/inpractice/css/inPractice.css http://www.automatastudios.com/clients/cco/inpractice/css/inPracticeScheme.css http://www.automatastudios.com/clients/cco/inpractice/css/screen.css http://www.automatastudios.com/clients/cco/inpractice/css/mobile/iPad.css

  • 참고 :이 CSS 파일은 나에 의해 작성되지 않았다.
+1

이 궁극적으로 문제가 어디에있을 수 있습니다 궁금 안드로이드는 SD 카드의 JS가 WebView 내에서 실행되는 것을 허용하지 않을 것입니까? – Keenan

답변

3

해결 방법을 찾지 못했습니다.

자바 파일 소스 파일을 인라인 Javascript로 변경 한 HTML 파일 편집 만있었습니다. 그게 효과적이었습니다 (내가 기대했던대로).

0

참조 JS, CSS를 우리는 HTML을, JS, CSS 파일 시스템에서 찾을 수있는 위치의 루트 디렉토리를 전달해야

webView.loadDataWithBaseURL() 

사용되는 HTML을로드 할 수있는 좋은 방법 baseURL로 여기서 주목해야 할 중요한 점은 "파일"스키마 URL 만 사용해야한다는 것입니다. 귀하의 경우 코드에서

String html = readFileAsString(
     new FileInputStream("file://" + contentLocation + url)); 
webView.loadDataWithBaseURL("file://" + contentLocation,html,"text/html","utf-8",null); 


public static StringBuffer streamToString(InputStream stream){ 

     StringBuffer fileContent = new StringBuffer(""); 
     try { 

      int size = stream.available(); 
      byte[] buffer = new byte[size]; 
      int length; 
      while ((length = stream.read(buffer)) != -1) { 
       fileContent.append(new String(buffer)); 
      } 
      stream.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      try { 
       stream.close(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

     return fileContent; 
    } 

는 대답은 미래의 방문자

희망이 도움해야

PS : 위의 코드는 컴파일되지