前面已经得出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应用开发时,有时需要在应用内部展示HTML内容。例如,显示帮助文档、用户手册或是简单的网页信息等。传统的Eclipse环境下,通常的做法是将...
1. 加载本地HTML文件:使用`loadDataWithBaseURL()`方法加载本地HTML文件。首先,将HTML文件放入assets或res/raw目录下,然后加载。 ```java String htmlContent = "<html><body><img src='image.png'/></body></...
总的来说,这个压缩包提供了一个学习和探索Android WebView加载本地HTML5页面的起点。开发者可以通过研究这些示例,了解如何将HTML5页面集成到Android应用中,同时掌握JavaScript与Java代码的交互技巧,以实现更丰富...
注意,加载本地资源时,路径一定要正确,对于`assets`目录下的资源,需要以`file:///android_asset/`开头。对于`res`目录下的资源,可以使用`android.resource://[package_name]/[resource_type]/[resource_id]`格式...
当加载本地HTML时,也要考虑安全问题。例如,避免在HTML中使用不安全的代码,防止XSS攻击。同时,如果HTML中引用了外部资源(如图片、CSS或JS文件),请确保这些资源也是安全的。 9. **优化性能**: 对于复杂的...
最后,关于性能优化,使用`WebView`加载本地资源时,应考虑缓存策略。可以设置`WebSettings`的缓存模式,如`LOAD_CACHE_ELSE_NETWORK`,在网络不畅时优先使用缓存。另外,开启硬件加速可以提升WebView的渲染性能: ...
本篇文章将详细探讨如何使用Android的WebView加载本地HTML,并实现Java代码与HTML内容之间的交互。 一、WebView基本使用 1. 添加依赖:在AndroidManifest.xml文件中,确保WebView的权限已经开启,如`...
本示例“android中webview加载本地页面,并处理js事件”着重讲解如何利用`WebView`加载本地HTML页面,并通过JavaScript Interface与Java代码进行交互,同时在HTML中动态生成组件如`button`。 1. **WebView基本使用**...
本文将深入探讨如何使用WebView加载本地HTML文件并操作本地数据,同时涉及JS与Java的交互,实现数据的双向传递,以及分页功能的实现。 首先,我们来理解WebView的基本使用。在Android布局XML文件中,添加WebView...
// 加载本地HTML ``` **2. 支持本地HTML和CSS** Android Studio通常将HTML、CSS和JavaScript文件放在`assets`或`res/raw`目录下。`assets`目录下的文件可以通过`file:///android_asset/`路径访问,而`res/raw`目录...
在Android开发中,有时我们需要通过网页(HTML)来调用本地的应用程序,这通常涉及到Web与原生应用的交互。这个资源"android通过html打开本地app"提供了一种实现方式,使得开发者能够从HTML页面中启动Android应用...
加载本地HTML源码通常有以下几种方式: 1. **直接加载本地文件**:你可以将HTML、CSS、JavaScript等文件放在应用的`assets`或`res/raw`目录下。然后通过`loadDataWithBaseURL()`方法加载。例如,如果你的HTML文件在...
本文将深入探讨如何利用腾讯TBS在安卓应用中加载本地文件,以及在实际操作中可能遇到的问题及其解决方案。 1. **TBS加载本地文件的基本原理** - TBS提供了API接口,允许开发者调用其内建的文件解析器来打开本地...
在WebViewLoadDemo这个示例项目中,可能包含了上述所有操作的完整代码,你可以参考该项目学习和实践如何在Android应用中有效地使用WebView加载本地HTML文件。总的来说,理解并熟练掌握WebView的使用对于Android...
// 加载本地资产目录下的HTML5页面 ``` 注意,为了安全和性能考虑,通常会启用JavaScript支持,并使用`file:///android_asset/`路径加载本地资源,或者使用`loadDataWithBaseURL()`加载数据。 二、HTML5与Android...
HTML5与Android网络音乐播放器是一种技术融合的产物,它结合了HTML5的网页开发能力与Android平台的原生功能,使得用户可以在浏览器或者特定的Web应用中播放网络音乐,甚至能够调用Android设备的本地音乐库。...
总的来说,实现Android加载HTML5的360°全景主要涉及以下步骤: 1. 在布局中添加WebView组件。 2. 初始化WebView,允许JavaScript执行,加载HTML文件。 3. HTML文件内编写360°全景的结构和交互逻辑,可能涉及Three....
它不仅能够加载远程URL,还能加载本地的HTML文件。要实现Android调用本地Js,我们首先需要创建一个包含JavaScript函数的HTML文件,例如`index.html`,在这个文件中定义我们需要调用的函数。 ```html <!DOCTYPE html...
本教程将详细介绍如何使用Android WebView加载本地HTML,并实现Java与JavaScript之间的交互,以便更好地控制和扩展应用功能。 首先,我们需要在布局XML文件中添加一个WebView组件,如下所示: ```xml android:id...
2. **加载HTML页面**:在Android应用中,我们可以使用WebView的`loadUrl()`方法来加载本地或网络上的HTML页面。例如: ```java WebView webView = (WebView) findViewById(R.id.webView); webView.loadUrl("file:...