`

android关于加载本地html5的问题(解决办法)

阅读更多
     前面已经得出android中加载本地html5所遇到问题的原因,针对这个原因,目前有以下两种解决方案,第一种解决方案:
     对于每一个景区,新建一个android application,然后将动景手动复制到工程的asset中,然后用webView从asset中加载动景,这样就避免了webkit内核禁止加载本地html5的问题,然后将应用打包成apk,这样每次都下载景区对应的动景apk,下载完之后自动安装,这样只需要访问apk就可以解决了,安装apk:
           public static boolean install(Context context, String filePath) {
 
            Intent i = new Intent(Intent. ACTION_VIEW);
 
            File file = new File(filePath);
 
             if (file != null && file.length() > 0 && file.exists() && file.isFile()) {
 
                   i.setDataAndType(Uri.parse("file://" + filePath),
                               "application/vnd.android.package-archive" );
 
                   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 
                  context.startActivity( i);
 
                   return true ;
 
            }
 
             return false ;
 
      }
     安装完之后,我们只需要根据apk的包名去访问apk,代码如下:
     Intent intent = new Intent(Intent. ACTION_MAIN);
     intent.addCategory(Intent. CATEGORY_LAUNCHER);
      ComponentName cn = new ComponentName("com.ly" , "com.ly.MainActivity");
      intent.setComponent(cn);
      startActivity(intent);
     其中new ComponentName("com.ly" , "com.ly.MainActivity" )中所传的第一个参数是要访问的apk的包名,第二个参数是要访问的apk的入口的activity的类名(包括包名)。
 
 
     接着,我们来介绍第二种解决方案,既然weblit内核的浏览器可以调用服务器的html5,那我们为何不在本地写一个服务器,然后通过访问本地的服务器去加载本地的html5,这样就不存在安全性设置的问题了。在这里,我们在服务器端先采用单线程去处理客户端发送过来的请求。下面是服务器的源码:
     public class HttpServer implements Runnable {
       static HttpServer httpServer;
       private static final String TAG = "HttpServer";
       /**
       * 服务器端的socket
       */
      ServerSocket server;
       /**
       * 服务器监听的端口号
       */
       public static final int PORT = 8080;
 
       // public static HttpServer getInstance(){
       // if(httpServer == null){
       // httpServer = new HttpServer();
       // }
       // return httpServer;
       // }
 
       public HttpServer() {
             try {
                   server = new ServerSocket(PORT);
            } catch (IOException e) {
                   // TODO Auto-generated catch block
                  Log. i(TAG, "异常信息:" + e.getMessage());
            }
             new Thread(this).start();
            Log. i(TAG, "server is start......");
      }
 
       public void run() {
             // 服务器端连续监听客户端
             while (true ) {
                  Socket client = null;
                   try {
                        client = server.accept();
                         // 创建分线程
//                      httpRequestHandler request = new httpRequestHandler(client);
//                      // 启动线程
//                      new Thread(request).start();
                         if(client!=null){
                         Log. i(TAG, "已连接到服务器:" +client);
                         //获取客户端的输入流
                         BufferedReader in = new BufferedReader(new
                         InputStreamReader(client.getInputStream()));
                         //读取第一行
                         String line = in.readLine();
                         if(line==null||line.equals("")||line.equals( "\r\n")){
                         break;
                         }
                         Log. i(TAG, "客户端发送的消息是:" +line);
                         String[] tokens = line.split( " ");
                         if(tokens[0].equalsIgnoreCase("GET" )){
                         String fileName = tokens[1];
                         fileService(fileName, client);
                         }
                         }
                  } catch (IOException e) {
                         // TODO Auto-generated catch block
                        e.printStackTrace();
                  }
            }
 
      }
 
       /**
       * 读取文件的内容
       *
       * @param fileName
       * @param socket
       */
       public void fileService(String fileName, Socket socket) {
            PrintStream os = null;
             try {
                  os = new PrintStream(socket.getOutputStream(), true);
                  File file = new File(fileName);
                   if (file.exists() && !file.isDirectory()) {
                        os.println( " HTTP/1.0 200 OK "); // 返回应答消息,并结束应答
                        os.println( " Content-Type:" + generatecontentType(fileName));
                        os.println( " Content-Length: " + file.length()); // 返回内容字节数
                        os.println();
                        FileInputStream fis = null;
                         try {
                              fis = new FileInputStream(file);
                        } catch (FileNotFoundException e) {
                               // TODO Auto-generated catch block
                              os.println( "HTTP/1.0 404" + e.getMessage());
                        }
                         byte[] buffer = null;
                        Log. i(TAG, "文件大小:" + buffer. length);
                        Log. i(TAG, "内容:" + buffer.toString());
 
                        buffer = new byte [fis.available()];
                        fis.read(buffer);
                        os.write(buffer);
                        os.flush();
                        os.close();
                        fis.close();
                        socket.close();
                  } else {
                        os.println( "HTTP/1.0 404 FileNotFonud!" );
                        os.close();
                  }
            } catch (IOException e) {
                   // TODO Auto-generated catch block
                  os.println( "HTTP/1.0 404" + e.getMessage());
            }
 
      }
 
       private String generatecontentType(String fileName) {
             if (fileName.endsWith("html" ) || fileName.endsWith("htm")
                        || fileName.endsWith( "xml")) {
                   return "text/html" ;
            } else if (fileName.endsWith("png")) {
                   return "application/binarary" ;
            } else if (fileName.endsWith("jpg")) {
                   return "image/jpeg" ;
            } else if (fileName.endsWith("js")) {
                   return "application/x-javascript" ;
            } else if (fileName.endsWith("swf")) {
                   return "application/x-shockwave-flash" ;
            }
             return "*/*" ;
      }
}
     
     

 

分享到:
评论

相关推荐

    Android studio加载本地html的文档问题

    ### Android Studio加载本地HTML文件详解 #### 一、引言 在进行Android应用开发时,有时需要在应用内部展示HTML内容。例如,显示帮助文档、用户手册或是简单的网页信息等。传统的Eclipse环境下,通常的做法是将...

    Android WebView加载网页以及本地图片缓存问题

    1. 加载本地HTML文件:使用`loadDataWithBaseURL()`方法加载本地HTML文件。首先,将HTML文件放入assets或res/raw目录下,然后加载。 ```java String htmlContent = "<html><body><img src='image.png'/></body></...

    安卓浏览器WebViewJSHTML5相关-androidwebview加载本地html.zip

    总的来说,这个压缩包提供了一个学习和探索Android WebView加载本地HTML5页面的起点。开发者可以通过研究这些示例,了解如何将HTML5页面集成到Android应用中,同时掌握JavaScript与Java代码的交互技巧,以实现更丰富...

    android webView加载html 并引用本地资源(图片、字体库)

    注意,加载本地资源时,路径一定要正确,对于`assets`目录下的资源,需要以`file:///android_asset/`开头。对于`res`目录下的资源,可以使用`android.resource://[package_name]/[resource_type]/[resource_id]`格式...

    Android打开本地HTML网页AndroidStudio工程.rar

    当加载本地HTML时,也要考虑安全问题。例如,避免在HTML中使用不安全的代码,防止XSS攻击。同时,如果HTML中引用了外部资源(如图片、CSS或JS文件),请确保这些资源也是安全的。 9. **优化性能**: 对于复杂的...

    android Webview加载本地图片,自适应布局大小

    最后,关于性能优化,使用`WebView`加载本地资源时,应考虑缓存策略。可以设置`WebSettings`的缓存模式,如`LOAD_CACHE_ELSE_NETWORK`,在网络不畅时优先使用缓存。另外,开启硬件加速可以提升WebView的渲染性能: ...

    android webview 加载本地html 实现 与 java 之间的相互响应

    本篇文章将详细探讨如何使用Android的WebView加载本地HTML,并实现Java代码与HTML内容之间的交互。 一、WebView基本使用 1. 添加依赖:在AndroidManifest.xml文件中,确保WebView的权限已经开启,如`...

    android中webview加载本地页面,并处理js事件

    本示例“android中webview加载本地页面,并处理js事件”着重讲解如何利用`WebView`加载本地HTML页面,并通过JavaScript Interface与Java代码进行交互,同时在HTML中动态生成组件如`button`。 1. **WebView基本使用**...

    使用WebView加载本地html操作本地数据

    本文将深入探讨如何使用WebView加载本地HTML文件并操作本地数据,同时涉及JS与Java的交互,实现数据的双向传递,以及分页功能的实现。 首先,我们来理解WebView的基本使用。在Android布局XML文件中,添加WebView...

    android中嵌入本地html

    // 加载本地HTML ``` **2. 支持本地HTML和CSS** Android Studio通常将HTML、CSS和JavaScript文件放在`assets`或`res/raw`目录下。`assets`目录下的文件可以通过`file:///android_asset/`路径访问,而`res/raw`目录...

    android通过html打开本地app

    在Android开发中,有时我们需要通过网页(HTML)来调用本地的应用程序,这通常涉及到Web与原生应用的交互。这个资源"android通过html打开本地app"提供了一种实现方式,使得开发者能够从HTML页面中启动Android应用...

    Android WebView加载本地的网页源码显示

    加载本地HTML源码通常有以下几种方式: 1. **直接加载本地文件**:你可以将HTML、CSS、JavaScript等文件放在应用的`assets`或`res/raw`目录下。然后通过`loadDataWithBaseURL()`方法加载。例如,如果你的HTML文件在...

    安卓 腾讯TBS加载本地文件(word.pdf.ppt)

    本文将深入探讨如何利用腾讯TBS在安卓应用中加载本地文件,以及在实际操作中可能遇到的问题及其解决方案。 1. **TBS加载本地文件的基本原理** - TBS提供了API接口,允许开发者调用其内建的文件解析器来打开本地...

    webview加载本地的html文件

    在WebViewLoadDemo这个示例项目中,可能包含了上述所有操作的完整代码,你可以参考该项目学习和实践如何在Android应用中有效地使用WebView加载本地HTML文件。总的来说,理解并熟练掌握WebView的使用对于Android...

    Android调用html5加载网页

    // 加载本地资产目录下的HTML5页面 ``` 注意,为了安全和性能考虑,通常会启用JavaScript支持,并使用`file:///android_asset/`路径加载本地资源,或者使用`loadDataWithBaseURL()`加载数据。 二、HTML5与Android...

    html5 android网络音乐播放器 可调用android播放本地音乐

    HTML5与Android网络音乐播放器是一种技术融合的产物,它结合了HTML5的网页开发能力与Android平台的原生功能,使得用户可以在浏览器或者特定的Web应用中播放网络音乐,甚至能够调用Android设备的本地音乐库。...

    android加载html5 360°全景

    总的来说,实现Android加载HTML5的360°全景主要涉及以下步骤: 1. 在布局中添加WebView组件。 2. 初始化WebView,允许JavaScript执行,加载HTML文件。 3. HTML文件内编写360°全景的结构和交互逻辑,可能涉及Three....

    Android安卓调用本地Js

    它不仅能够加载远程URL,还能加载本地的HTML文件。要实现Android调用本地Js,我们首先需要创建一个包含JavaScript函数的HTML文件,例如`index.html`,在这个文件中定义我们需要调用的函数。 ```html <!DOCTYPE html...

    android studio使用NanoHTTPD 创建 http 服务器打开html并使用webView打开页面

    本篇将详细讲解如何利用`Android Studio`集成`NanoHTTPD`来创建一个本地HTTP服务器,并通过`WebView`加载服务器上的HTML页面。 首先,`Android Studio`是Google推出的一款强大的Android应用程序集成开发环境,它...

    安卓浏览器WebViewJSHTML5相关-androidwebview加载本地html实现与java之间的相互响应.rar

    本教程将详细介绍如何使用Android WebView加载本地HTML,并实现Java与JavaScript之间的交互,以便更好地控制和扩展应用功能。 首先,我们需要在布局XML文件中添加一个WebView组件,如下所示: ```xml android:id...

Global site tag (gtag.js) - Google Analytics