需求: 本人前端想用 android 打开 h5 页面,可以发送ajax 进行通信。于是查到用 nanoHTTPD 创建简单http服务器。 想着用webView 打开 assets 下的 html 页面

file:///android_asset/www/login.html"

再发送ajax 与服务器(http://127.0.0.1:9999)进行通信,但出现跨域的问题。

于是 nanoHTTPD 服务器打开 html,然后用 webView 打开就没有跨域的问题。先这样,然后再去解决跨域的问题

项目目录:

build.gradle(Module:app)

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "com.example.httpdemo"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.0.2'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.0'androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'implementation'org.nanohttpd:nanohttpd:2.3.1'
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.httpdemo"><uses-permission android:name="android.permission.INTERNET" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

HttpService.java

package com.example.httpdemo;
import android.content.res.AssetManager;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.util.Map;
import fi.iki.elonen.NanoHTTPD;public class HttpService extends NanoHTTPD {AssetManager asset = null;public HttpService(int host) {super(host);}public NanoHTTPD.Response serve(NanoHTTPD.IHTTPSession iHTTPSession) {//获取参数Map parms = iHTTPSession.getParms();System.out.println(parms);System.out.println("iHTTPSession.getUri()=== " + iHTTPSession.getUri());String filename = iHTTPSession.getUri();if (iHTTPSession.getUri().equals("/")) {System.out.println("111 " + asset);return index("/login.html");} else if(filename.contains(".js")){System.out.println("222 " + asset);return index(filename);}return newFixedLengthResponse("500");}private NanoHTTPD.Response index(String filename) {//加载Assets里的html文件return NanoHTTPD.newFixedLengthResponse(getIndex(filename));}public String getIndex(String filename) {InputStream inputStream = null;InputStreamReader isr = null;BufferedReader br = null;StringBuffer sb = new StringBuffer();try {inputStream = asset.open("www" +filename);isr = new InputStreamReader(inputStream);br = new BufferedReader(isr);sb.append(br.readLine());String line = null;while ((line = br.readLine()) != null) {sb.append("\n" + line);}br.close();isr.close();inputStream.close();} catch (IOException e) {e.printStackTrace();} finally {try {if (br != null) {br.close();}if (isr != null) {isr.close();}if (inputStream != null) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}}return sb.toString();}
}

MainActivity.java

package com.example.httpdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {//创建服务HttpService http=new HttpService(9999);private WebView webView;private boolean isSuccess = false;private boolean isError = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);//服务启动http.asset=getAssets();//传递assets对象try {http.start();//            setUpView("file:///android_asset/www/login.html");setUpView("http://127.0.0.1:9999/");}catch (Exception e ){System.out.print(e);}}@SuppressLint("SetJavaScriptEnabled")public void setUpView(String url) {//加载需要显示的网页webView = new WebView(this);WebSettings webSettings = webView.getSettings();webView.loadUrl(url);webSettings.setJavaScriptEnabled(true);  //设置WebView属性,运行执行js脚本webSettings.setDomStorageEnabled(true);webSettings.setUseWideViewPort(true);//设定支持viewportwebSettings.setLoadWithOverviewMode(true);   //自适应屏幕webSettings.setBuiltInZoomControls(true);webSettings.setDisplayZoomControls(false);webSettings.setJavaScriptCanOpenWindowsAutomatically(true);webSettings.setSupportZoom(true);//设定支持缩放webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不读取缓存webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);webView.setBackgroundColor(ContextCompat.getColor(this,android.R.color.transparent));
//        webView.setBackgroundResource(R.color.black);webView.setWebViewClient(webClient);  //设置Web视图webView.setWebContentsDebuggingEnabled(true);}WebViewClient webClient = new WebViewClient() {//设置打开网页时,不调用系统浏览器进行打开,而是在本WebView中直接显示。@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {isError = false;view.loadUrl(url);return true;}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {isError = false;super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);if (!isError) {isSuccess = true;System.out.println("网页打开成功");setContentView(webView);//回调成功后的相关操作} else {isError = false;isSuccess = false;System.out.println("网页打开失败");startActivity(new Intent(MainActivity.this, MainActivity.class));Toast.makeText(MainActivity.this, "提示:连接失败,请检查地址及网络设置后重试(Connection failed. Please check the address and network settings and try again)。", Toast.LENGTH_LONG).show();}}@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);System.out.println("资源加载和页面打开错误时都会进入");//回调失败的相关操作}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {isError = true;System.out.println("wifi webView页面打不开错误进入 直接在这打开页面会先进一个错误的页面 一晃");}};//安卓销毁事件@Overrideprotected void onDestroy() {super.onDestroy();http.stop();}}

login.html

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge">
<!--    <meta http-equiv="Access-Control-Allow-Origin" content="*" />--><script src="js/lib/jquery-2.1.4.js"></script>
</head>
<body><script type="text/javascript">function modifyText() {console.log("ssssqqqq loadXMLDoc");$("#myDiv").text("loadXMLDoc");
}
</script><div id="myDiv"><h2>点击 修改该文本内容</h2></div>
<button type="button" id="btn" onclick="modifyText()">修改内容</button>
</body>
</html>

效果:

示例代码:

https://download.csdn.net/download/qq_40015157/86248291

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

  1. Android studio使用svn创建分支及合并分支----终极图解

    Android studio使用svn创建分支及合并分支这里面涉及的内容比较多,比较复杂,大家要仔细看. 1,创建本地svn仓库(主干与分支现在都是空的) 2,创建一个安卓项目,这大家应该都会吧[My ...

  2. 【Android】Android Studio中新创建的app目录结构

    安装Android Studio后,然后创建一个app项目.对于初学者来说,我们希望了解app目录结构,然后更好的进行开发工作. 但是要想了解一个app的目录结构,首先需要明确两个概念 Project ...

  3. Android Studio模拟器的创建和SDK的安装

    打开Android Studio,随机创建一个Project 找到右上的图标后,点击 点击+创建模拟器 选择Category类型为phone,表示创建应用于手机的模拟器,然后选择模拟器的屏幕尺寸,选好 ...

  4. android studio制作目录布局,Android Studio:新创建的目录未出现在文件夹Vi中

    9个解决方案 136 votes 事实证明,顶部有一个选择器,默认设置为显示Android. 如果您将切换按钮向下拨到"包",您可以看到自己的包. Aggressor answer ...

  5. Android Studio使用recyclerview实现展开和折叠(在之前的微信页面基础之上)

    Android Studio使用recyclerview实现展开和缩回(在之前的微信页面基础之上) Android中RecyclerView点击item展开列表详细内容 github源码地址: And ...

  6. 在android studio中如何创建一个类来继承另外一个类_在Android使用Transition API检测用户活动...

    在当今世界,移动设备是我们日常生活中必不可少的一部分,我们在走路.跑步.开车以及其他许多活动时都会使用移动设备. 了解用户拿着手机的时候在做什么,可以让你的应用程序根据用户的动作进行直观的调整.对于某 ...

  7. android studio开发环境搭建,国内服务器代理下载android sdk

    android studio开发环境搭建 1,百度android studio,下载安装: 2,启动Fetching Android SDK component information http:// ...

  8. android studio连接服务端代码,Android studio - 无法连接到LDAP服务器(示例代码)

    我想在android studio中使用LDAP,我在最新版本中使用UnboundID LDAP SDK for Java. 我使用命令: LDAPConnection ldap = new LDAP ...

  9. android studio读取本地json,Android Studio读取和创建Json

    1,984 JSON的基本语法 1.JSon的四个基本规则 (1)并列的数据之间用逗号(,)分隔 (2)映射用冒号(:)表示 (3)并列数据的集合(数组)用方括号([])表示 (4)映射的集合(对象) ...

  10. 1.Android简介,Android Studio安装,创建运行Android程序

    文章目录 1.了解通信技术 2.Android简介   2.1 Android起源   2.2 Android历史版本 3.Android Studio开发环境的搭建 3.1 Android Stud ...

最新文章

  1. Android自定义spinner下拉框实现的实现
  2. vue cli3.0 引入eslint 结合vscode使用
  3. 创建ROS消息和服务---ROS学习第8篇
  4. Python中提示:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position
  5. Kafka是如何实现高吞吐率的
  6. 服务器网卡显示100m,千兆网线8根线都通了怎么还是显示100M,网卡都是能用1000M的...
  7. Windows编程之使用外部动态链接库——纸牌
  8. mac 使用远程连接
  9. 自然语言处理之关键词提取TF-IDF
  10. socket编程持续交流java_socket编程的简单问题
  11. beforeEach钩子与无限循环问题
  12. win禁用shift切换输入法
  13. 最小二乘法 几何意义
  14. linux常见维护命令报错,Linux系统维护命令小结.ppt
  15. 转载--三少三多技术开发
  16. [C++]派(二分算法)
  17. 华为新人培养计划曝光!(新员工培训就该这么做)
  18. IDEA原先有项目怎么再导入maven项目
  19. Spring-实现整合Mybatis框架
  20. 利用OpenXml生成Word2007文档(转)

热门文章

  1. Golang + selenium 设置无头浏览器模式
  2. 算法初阶05:魔方矩阵
  3. Java学习-32(Java高级特性知识总结)
  4. 计算机可行性分析报告,计算机可行性分析报告范文.docx
  5. 【节能学院】油烟浓度在线监测仪在浙江省某市餐饮油烟监测治理项目中的应用
  6. CATIA V6二次开发——复杂装配体的结构树遍历
  7. 【Maven使用】IDEA使用Maven进行文件打包+命令含义+错误分析
  8. 内存控制器与SDRAM【赞】
  9. 2021年安全员-A证报名考试及安全员-A证考试报名
  10. 数据结构实验1 集合的交、并、差