
【分享】uploader上传,java servlet 接收数据代码
ServletFileUpload servletFileUpload = new ServletFileUpload();
FileItemIterator fileItemIterator = servletFileUpload.getItemIterator(request);
byte[] imageDatas = null;
String imageName = null;
String imgFormatName = null;
if (fileItemIterator.hasNext())
{
FileItemStream fileStream = fileItemIterator.next();
imageName = fileStream.getName();
if (imageName == null || imageName.trim().length() == 0)
{
throw new Exception("文件名称为空");
}
imageName = imageName.toLowerCase();
if (imageName.endsWith("jpg") || imageName.endsWith("jpeg"))
{
imgFormatName = "jpg";
}
else if (imageName.endsWith("png"))
{
imgFormatName = "png";
}
else if (imageName.endsWith("gif"))
{
imgFormatName = "gif";
}
else
{
throw new Exception("只支持:jpg、png、gif三种图片");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream inputStream = null;
try {
inputStream = fileStream.openStream();
BufferedImage bufferedImage = ImageIO.read(inputStream);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
BufferedImage needSavedImage = bufferedImage;
if (width > 600) {
needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, 600, Float.valueOf(height * (600.0f/width)).intValue(), org.imgscalr.Scalr.OP_BRIGHTER);
}
else if (height > 600) {
needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, Float.valueOf(width * (600.0f/height)).intValue(), 600, org.imgscalr.Scalr.OP_BRIGHTER);
}
ImageIO.write(needSavedImage, imgFormatName, baos);
imageDatas = baos.toByteArray();
}
catch(Exception e)
{
Logger.error(e.getMessage(), e);
}
finally
{
if (inputStream != null)
{
try {
inputStream.close();
}
catch(Exception e)
{
Logger.error(e.getMessage(), e);
}
}
}
}
这是一个简单的例子:
1) 图片格式只是通过扩展名来做了个简单地过滤
2) 图片的压缩,逻辑简单,够用了,更复杂的逻辑,自个儿补充就行
3)用到了两个库:apache的common upload 以及图片工具类库 org.imgscalr.Scalr (github上有源码,自个儿搜)
ServletFileUpload servletFileUpload = new ServletFileUpload();
FileItemIterator fileItemIterator = servletFileUpload.getItemIterator(request);
byte[] imageDatas = null;
String imageName = null;
String imgFormatName = null;
if (fileItemIterator.hasNext())
{
FileItemStream fileStream = fileItemIterator.next();
imageName = fileStream.getName();
if (imageName == null || imageName.trim().length() == 0)
{
throw new Exception("文件名称为空");
}
imageName = imageName.toLowerCase();
if (imageName.endsWith("jpg") || imageName.endsWith("jpeg"))
{
imgFormatName = "jpg";
}
else if (imageName.endsWith("png"))
{
imgFormatName = "png";
}
else if (imageName.endsWith("gif"))
{
imgFormatName = "gif";
}
else
{
throw new Exception("只支持:jpg、png、gif三种图片");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream inputStream = null;
try {
inputStream = fileStream.openStream();
BufferedImage bufferedImage = ImageIO.read(inputStream);
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
BufferedImage needSavedImage = bufferedImage;
if (width > 600) {
needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, 600, Float.valueOf(height * (600.0f/width)).intValue(), org.imgscalr.Scalr.OP_BRIGHTER);
}
else if (height > 600) {
needSavedImage = org.imgscalr.Scalr.resize(bufferedImage, Method.SPEED, Float.valueOf(width * (600.0f/height)).intValue(), 600, org.imgscalr.Scalr.OP_BRIGHTER);
}
ImageIO.write(needSavedImage, imgFormatName, baos);
imageDatas = baos.toByteArray();
}
catch(Exception e)
{
Logger.error(e.getMessage(), e);
}
finally
{
if (inputStream != null)
{
try {
inputStream.close();
}
catch(Exception e)
{
Logger.error(e.getMessage(), e);
}
}
}
}
这是一个简单的例子:
1) 图片格式只是通过扩展名来做了个简单地过滤
2) 图片的压缩,逻辑简单,够用了,更复杂的逻辑,自个儿补充就行
3)用到了两个库:apache的common upload 以及图片工具类库 org.imgscalr.Scalr (github上有源码,自个儿搜)

东翌学院和Dcloud官方合作跨平台APP开发培训机构
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:2971611409 欢迎有意向学习的朋友加好友咨询!

东翌学院和Dcloud官方合作跨平台APP开发培训机构
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询!
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,谢谢Dcloud提供这么好的平台!
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询!
收起阅读 »

【文档】解决 MUI v3.2.0 headers 为 {'Content-Type': 'application/json'} 发起 POST 请求异常的问题
Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例)
问题场景
php部分
<?php
$name = $_POST['name'];
$password = $_POST['password'];
var_dump($name);
var_dump($password);
?>
mui.ajax()部分
mui.ajax({
url: 'http://192.168.12.74:80/test01.php',
type: 'post',
headers:{'Content-Type': 'application/json'},
data: {
name: 'dcloud',
password: '123456'
},
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息
Notice: Undefined index: name in test01.php on line 2
Notice: Undefined index: password in test01.php on line 3
我们按照通常的post方法去读取数据,发现并没有name和password这两个参数。
问题分析
可以参看下这篇文章《四种常见的 POST 提交数据方式》
当application/json这个Content-Type作为响应头时,我们需要手动处理一下:
从php://input 里获得原始输入流,再json_decode成对象。
方案一
php部分
<?php
if ($_SERVER["CONTENT_TYPE"] == "application/json") {
$input = file_get_contents('php://input');
var_dump($input);
$object = json_decode($input);
$name = $object->name;
var_dump($name);
}
?>
控制台信息一
'name=dcloud&password=123456' test01.php on line 4
null test01.php on line 7
此时,$input并不是一串json字符串,所以我们用json_decode去转换依旧是失败的,并不能拿到我们想要的数据。
mui.ajax()部分
mui.ajax()默认会对data里面的数据进行序列化,最终导致php接受到的是序列化以后的字符串。我们需要禁用对data的序列化(processData:false),并把参数对象序列化成json字符串(JSON.stringify())传给data。
mui.ajax({
url: 'http://192.168.12.74:80/test01.php',
type: 'post',
headers: {
'Content-Type': 'application/json'
},
processData: false,
data: JSON.stringify({
name: 'dcloud',
password: '123456'
}),
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息二
'dcloud' test01.php on line 7
name参数的值被正确解析,问题解决。
方案二
只需修改php部分即可,方案一中我们在未设置processData属性为false时,获取的是一串序列化后的字符串'name=dcloud&password=123456'。我们对字符串进行截取,同样可以解析出我们想要的参数数据。
php部分
<?php
if($_SERVER["CONTENT_TYPE"]=="application/json"){
$input = file_get_contents('php://input');
$arr = explode("&", $input);
$narr = explode("=", $arr[0]);
$parr = explode("=", $arr[1]);
$name = $narr[1];
$password = $parr[1];
var_dump($name);
var_dump($password);
}
?>
mui.ajax()部分:
mui.ajax({
url: 'http://192.168.12.74:80/test02.php',
type: 'post',
headers: {
'Content-Type': 'application/json'
},
data: {
name: 'dcloud',
password: '123456'
},
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息
'dcloud' test02.php on line 9
'123456' test02.php on line 10
通过对字符串的截取分组,最终取得我们想要的参数数据,但是此方法的缺点在于参数的顺序不明或数量太多会非常繁琐。
后续解决
Mui v3.3.0,将对此情况进行更加精确的处理,3.2.0版本遇到此问题可按照上面的方式进行处理数据。
Mui v3.2.0中ajax设置headers为{'Content-Type': 'application/json'}发起post请求,后端接收不到数据的解决方案(php为例)
问题场景
php部分
<?php
$name = $_POST['name'];
$password = $_POST['password'];
var_dump($name);
var_dump($password);
?>
mui.ajax()部分
mui.ajax({
url: 'http://192.168.12.74:80/test01.php',
type: 'post',
headers:{'Content-Type': 'application/json'},
data: {
name: 'dcloud',
password: '123456'
},
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息
Notice: Undefined index: name in test01.php on line 2
Notice: Undefined index: password in test01.php on line 3
我们按照通常的post方法去读取数据,发现并没有name和password这两个参数。
问题分析
可以参看下这篇文章《四种常见的 POST 提交数据方式》
当application/json这个Content-Type作为响应头时,我们需要手动处理一下:
从php://input 里获得原始输入流,再json_decode成对象。
方案一
php部分
<?php
if ($_SERVER["CONTENT_TYPE"] == "application/json") {
$input = file_get_contents('php://input');
var_dump($input);
$object = json_decode($input);
$name = $object->name;
var_dump($name);
}
?>
控制台信息一
'name=dcloud&password=123456' test01.php on line 4
null test01.php on line 7
此时,$input并不是一串json字符串,所以我们用json_decode去转换依旧是失败的,并不能拿到我们想要的数据。
mui.ajax()部分
mui.ajax()默认会对data里面的数据进行序列化,最终导致php接受到的是序列化以后的字符串。我们需要禁用对data的序列化(processData:false),并把参数对象序列化成json字符串(JSON.stringify())传给data。
mui.ajax({
url: 'http://192.168.12.74:80/test01.php',
type: 'post',
headers: {
'Content-Type': 'application/json'
},
processData: false,
data: JSON.stringify({
name: 'dcloud',
password: '123456'
}),
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息二
'dcloud' test01.php on line 7
name参数的值被正确解析,问题解决。
方案二
只需修改php部分即可,方案一中我们在未设置processData属性为false时,获取的是一串序列化后的字符串'name=dcloud&password=123456'。我们对字符串进行截取,同样可以解析出我们想要的参数数据。
php部分
<?php
if($_SERVER["CONTENT_TYPE"]=="application/json"){
$input = file_get_contents('php://input');
$arr = explode("&", $input);
$narr = explode("=", $arr[0]);
$parr = explode("=", $arr[1]);
$name = $narr[1];
$password = $parr[1];
var_dump($name);
var_dump($password);
}
?>
mui.ajax()部分:
mui.ajax({
url: 'http://192.168.12.74:80/test02.php',
type: 'post',
headers: {
'Content-Type': 'application/json'
},
data: {
name: 'dcloud',
password: '123456'
},
success: function(data) {
console.log(data);
},
error: function(xhr, type, errorThrown) {
console.log(type);
}
});
控制台信息
'dcloud' test02.php on line 9
'123456' test02.php on line 10
通过对字符串的截取分组,最终取得我们想要的参数数据,但是此方法的缺点在于参数的顺序不明或数量太多会非常繁琐。
后续解决
Mui v3.3.0,将对此情况进行更加精确的处理,3.2.0版本遇到此问题可按照上面的方式进行处理数据。
收起阅读 »
我是设计,需要设计的找我,价格公道
专业设计,价格公道,态度友好,两年设计经验,需要设计的找我。
扣扣:80883080
专业设计,价格公道,态度友好,两年设计经验,需要设计的找我。
扣扣:80883080

style.less的使用
@width: 200px; //定义一个变量width,里面存储了一个数据100px
@height: 200px;
@color1: rgba(188,166,188,0.8);
@color2: red;
@color3: aqua;
/*
- 变量的作用,可以实现修改一处变幻多处的目的,同时缩小代码维护的范围,
- 提高代码维护的效率,减少代码维护的成本。
/
/ - 混入:将公用的一段代码写入到一个对应的class选择器中,将来使用到该段代码的部分我们可以用
- 该class选择器替换,这个过程叫混入
- 混入分为带参数的混入和不带参数的混入,但是为了提高代码的可复用性,我们一般使用带参数
- 混入,另外参数可以设置默认值,多个参数之间用","隔开。
- 注意:不带参数的混入适用于操作固定的时候,比如过渡效果,如果过渡时间相同时,我们可以使用
/
.transition(@time:1s) {
-webkit-transition: @time;
-moz-transition: @time;
-ms-transition: @time;
-o-transition: @time;
transition: @time;
}
.translate(@distanceX:0, @distanceY:0) {
-webkit-transform: translate(@distanceX,@distanceY);
-moz-transform: translate(@distanceX,@distanceY);
-ms-transform: translate(@distanceX,@distanceY);
-o-transform: translate(@distanceX,@distanceY);
transform: translate(@distanceX,@distanceY);
}
.out {
width: (2@width);
height: (2*@height);
background-color: @color1;
.first {
width: @width;
height: @height;
background-color: @color3;
.transition(2s);
}
.first:hover {
.translate(0,800px);
}
.last {
width: @width;
height: @height;
background-color: @color2;
.transition(5s);
}
.last:hover {
.translate(500px,-300px);
}
}
@width: 200px; //定义一个变量width,里面存储了一个数据100px
@height: 200px;
@color1: rgba(188,166,188,0.8);
@color2: red;
@color3: aqua;
/*
- 变量的作用,可以实现修改一处变幻多处的目的,同时缩小代码维护的范围,
- 提高代码维护的效率,减少代码维护的成本。
/
/ - 混入:将公用的一段代码写入到一个对应的class选择器中,将来使用到该段代码的部分我们可以用
- 该class选择器替换,这个过程叫混入
- 混入分为带参数的混入和不带参数的混入,但是为了提高代码的可复用性,我们一般使用带参数
- 混入,另外参数可以设置默认值,多个参数之间用","隔开。
- 注意:不带参数的混入适用于操作固定的时候,比如过渡效果,如果过渡时间相同时,我们可以使用
/
.transition(@time:1s) {
-webkit-transition: @time;
-moz-transition: @time;
-ms-transition: @time;
-o-transition: @time;
transition: @time;
}
.translate(@distanceX:0, @distanceY:0) {
-webkit-transform: translate(@distanceX,@distanceY);
-moz-transform: translate(@distanceX,@distanceY);
-ms-transform: translate(@distanceX,@distanceY);
-o-transform: translate(@distanceX,@distanceY);
transform: translate(@distanceX,@distanceY);
}
.out {
width: (2@width);
height: (2*@height);
background-color: @color1;
.first {
width: @width;
height: @height;
background-color: @color3;
.transition(2s);
}
.first:hover {
.translate(0,800px);
}
.last {
width: @width;
height: @height;
background-color: @color2;
.transition(5s);
}
.last:hover {
.translate(500px,-300px);
}
}

让 dtpicker 可选择秒钟
让 dtpicker 可选择秒钟
效果图

使用方法
1.引入js
2.type =fulldatetime
<link href="../../css/mui.picker.min.css" rel="stylesheet"/>
<script src="../../js/mui.picker.js"></script>
<link href="../../css/mui.ext.dtpicker.css" rel="stylesheet"/>
<script src="../../js/mui.ext.dtpicker.js"></script>
<span class="mui-badge mui-badge-inverted mui-badge-none mui-custom-date" data-options='{"type":"fulldatetime"}' data-current='false'></span>
下面有附件可以下在 mui.ext.dtpicker.css 及 mui.ext.dtpicker.js
让 dtpicker 可选择秒钟
效果图
使用方法
1.引入js
2.type =fulldatetime
<link href="../../css/mui.picker.min.css" rel="stylesheet"/>
<script src="../../js/mui.picker.js"></script>
<link href="../../css/mui.ext.dtpicker.css" rel="stylesheet"/>
<script src="../../js/mui.ext.dtpicker.js"></script>
<span class="mui-badge mui-badge-inverted mui-badge-none mui-custom-date" data-options='{"type":"fulldatetime"}' data-current='false'></span>
下面有附件可以下在 mui.ext.dtpicker.css 及 mui.ext.dtpicker.js
收起阅读 »
东翌学院和Dcloud官方合作跨平台APP开发培训机构
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 。
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询! 谢谢Dcloud提供这么好的平台!
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 。
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询! 谢谢Dcloud提供这么好的平台!
收起阅读 »

东翌学院和Dcloud官方合作跨平台APP开发培训机构
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,
HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
咨询报名QQ:2971611409欢迎有意向学习的朋友加好友咨询!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,
今天就晚上vip课程八点就要开班了,没有报名学习的小伙伴们抓紧时间报名学习啦,没有钱报名vip也可以学习的,可以分期0首付 12个月免利息 一个月也就是316. 是vip学员没有开权限的同学联系我给你们开权限!详情咨询QQ :2971611409Tel:17090057793
谢谢Dcloud提供这么好的平台!
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,
HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
咨询报名QQ:2971611409欢迎有意向学习的朋友加好友咨询!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;
东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验 ,
今天就晚上vip课程八点就要开班了,没有报名学习的小伙伴们抓紧时间报名学习啦,没有钱报名vip也可以学习的,可以分期0首付 12个月免利息 一个月也就是316. 是vip学员没有开权限的同学联系我给你们开权限!详情咨询QQ :2971611409Tel:17090057793
谢谢Dcloud提供这么好的平台!
收起阅读 »
东翌学院和Dcloud官方合作跨平台APP开发培训机构
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,
HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验。
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询! 谢谢Dcloud提供这么好的平台!
东翌学院是Dcloud的合作培训机构,跨平台APP开发整体课程在线直播+课程源码+全套视频,最新最全的APP开发,
HB和MUI的全套视频,零基础都可以学习,更有高级进修课程,30天最快速的开发跨平台APP!
东翌学院也成立了外包团队,跨平台APP开发、管理软件定制、手机软件开发、微信开发、网页设计 我们以专业的技术、勇于创新的责任感、真诚的服务态度,赢得了客户的信任与尊重;东翌学院提供的设计解决方案正影响越来越多的客户,并让他们的产品拥有了更加良好的交互方式与用户体验。
咨询报名QQ:3391832203 欢迎有意向学习的朋友加好友咨询! 谢谢Dcloud提供这么好的平台!

【交流分享】从小白的角度谈谈Android集成5+SDK的几种方式的应用场景
背景
前一段时间因为项目需求,需要从Hbuilder中转移到原生层做开发,无奈只是熟悉一些java概念,但几乎没接触过Android开发,所以折腾了好久的离线打包。在你决定看这片文章之前,应该也要做好使劲折腾的心理准备。同时,最好看这篇文章之前对集成5 +sdk要有一些基本的概念,所以最好先看看下面这几篇文章,可能就不用继续看我的这点东西了。
1. 官方文档
- 最新SDK下载地址
- 独立应用方式集成
- Android平台以Widget方式集成HTML5 SDK方法
- Android平台以WebView方式集成HTML5 SDK方法
- Android平台使用AndroidStudio离线打包说明
- Android平台第三方插件开发指导
2.开发者分享文章 - 【交流分享】Android独立应用方式集成HTML5 SDK,Widget方式离线打包,空项目讲解
- 【交流分享】Android集成HTML5 SDK,Runtime方式离线打包,空项目讲解
- Android以Widget方式集成自己的hbuilder项目-----Anroid Studio版
相关集成概念
结合所有的官方文档以及官方SDK中的Hello-Integrate项目。我认为,官方对于离线打包有下面的这几种概念(叫法):
1.WebView集成方式 2. Widget集成方式 3. 独立应用集成方式 4. runtime集成方式 5. webApp集成方式
(截图取自官方文档及运行后的Hello-Integrate项目)
相信我,对于我这种首次接触集成SDK的小白来说,看到这一大堆名词及概念的时候,我是这样的
我猜想这么多的概念(叫法)也许是HB的开发者在开发的过程中遗留的问题,可能是项目组成员变动啊,文档整理人员变动啊巴拉巴拉导致的最终概念没有统一,纯属瞎猜。but……项目需求摆在那里,任务摆在那里,你总要解决对吧,懵逼也得硬着头皮上啊。我们开始折腾吧,先不管上面提到的五种叫法或者概念,直接开搞。
开搞
参照上面的那些文档中的方式,每一种集成弄他至少一遍,折腾的过程中可以查查资料,了解一下安卓原生开发的一些基本概念,比如Activity(关于Activity此处可以参考@AronWOng 分享的文章,简洁的介绍了Activity的意思 Android开机自启应用)。或者熟悉下项目的包结构,哪些文件是干啥的,比如Androidmanifest.xml是个什么鬼。折腾了好长一段时间之后,得出了以下的几个结论,注意此结论中并未指定集成方式的叫法(概念),暂时先直接讲要怎么做:
-
如果你只需要离线打包,比如在无法使用HB的云端打包情况下,那么就使用该篇文章中的方式 集成方式a1, 或者集成方式a2,该模式下,不涉及到自己写原生代码,只要按照官方介绍,将自己HB中的项目集成到eclipse或者Android Studio中打包。换种说法就是,如果你没有任何涉及原生开发的需求,并且需要在eclipse或者Android Studio中打包,就采用该模式。
-
如果你有需求会涉及到原生开发,同时又要集成5 + app。以我的项目需求为例,我需要在PDA上开发5 + app,这款PDA就是个基于Android的手机,但是多了一个硬件:扫描器。我需要在App中监听到PDA上的扫描器相关事件,初始化扫描头,开始扫描,获取扫描结果等,并将扫描结果传入5 + App。由于NJS无法实现(或者可以说我不知道怎么使用NJS实现),这个时候我就要采用下面的文章中的做法 集成方式b1或者 集成方式b2。具体实现思路是,我在5 + App对应的Activity中,用java实现对扫描头的监听,并将扫描结果传入5 + app指定的webView,触发js事件,实现5 +app的监听(关于如何在集成SDK后,从java层获取指定webView并传入参数、触发js方法,参考android webApp集成方式 原生主动调用JS方法,此处感谢@DCloud_SDK_骁骑 和 @杰世 的无私帮助与解答)
-
如果你已经在原生层开发好了了App,但是可能在原生层的某些需求中,比如单个页面需要使用5 + 的能力,这种时候采用下面文章中的做法集成方式c。
-
如果你需要在5 +App或者说5 +App的某个特定的webView中,通过js调用原生层的方法,并将原生层方法的执行结果返回至js。还是以我的项目为例,还是说PDA,我需要在5 App中主动调用扫描头,并将扫描头扫描的结果传回5 +App,触发相关js方法。那么采用下面文章中的的方式集成方式d。
总结
讲到这里,相信大家会对目前官方的提供的几种操作方式有一定的了解,那么,现在用我的理解来套用官方的概念(叫法)
-
离线打包:只要不是在HB中进行云端打包,其他方式我们都可以理解为离线打包,因为你都要涉及到将5 +SDK集成到原生层。即便是最傻瓜式的该方法 集成方式a1,也是相当于把集成的工作给你做好了而已。
-
独立应用集成方式,就是Widget集成方式,就是官方SDK中的Hello-Integrate项目里的webApp集成方式,就是 集成方式b1,就是 集成方式b2
-
WebView集成方式,就是集成方式c,也可以理解为集成方式d,此处参考官方SDK中的Hello-Integrate项目里的WebView集成方式
-
Android平台第三方插件开发指导,就是集成方式d。
最后的话
作为HB的用户已经三个月了,感谢DC提供一款如此好用的工具,衷心希望DC越走越好。同时,该文章参考了论坛中很多其他开发者的总结,在此一并感谢。第一次写,文章格式看起来有点乱,审美比较差导致……最后如果我的总结没有太严重的错误的话,那我觉得官方文档中关于5 +SDK的部分概念说明,是时候改改了,也希望大家指出我的错误
背景
前一段时间因为项目需求,需要从Hbuilder中转移到原生层做开发,无奈只是熟悉一些java概念,但几乎没接触过Android开发,所以折腾了好久的离线打包。在你决定看这片文章之前,应该也要做好使劲折腾的心理准备。同时,最好看这篇文章之前对集成5 +sdk要有一些基本的概念,所以最好先看看下面这几篇文章,可能就不用继续看我的这点东西了。
1. 官方文档
- 最新SDK下载地址
- 独立应用方式集成
- Android平台以Widget方式集成HTML5 SDK方法
- Android平台以WebView方式集成HTML5 SDK方法
- Android平台使用AndroidStudio离线打包说明
- Android平台第三方插件开发指导
2.开发者分享文章 - 【交流分享】Android独立应用方式集成HTML5 SDK,Widget方式离线打包,空项目讲解
- 【交流分享】Android集成HTML5 SDK,Runtime方式离线打包,空项目讲解
- Android以Widget方式集成自己的hbuilder项目-----Anroid Studio版
相关集成概念
结合所有的官方文档以及官方SDK中的Hello-Integrate项目。我认为,官方对于离线打包有下面的这几种概念(叫法):
1.WebView集成方式 2. Widget集成方式 3. 独立应用集成方式 4. runtime集成方式 5. webApp集成方式
(截图取自官方文档及运行后的Hello-Integrate项目)
相信我,对于我这种首次接触集成SDK的小白来说,看到这一大堆名词及概念的时候,我是这样的
我猜想这么多的概念(叫法)也许是HB的开发者在开发的过程中遗留的问题,可能是项目组成员变动啊,文档整理人员变动啊巴拉巴拉导致的最终概念没有统一,纯属瞎猜。but……项目需求摆在那里,任务摆在那里,你总要解决对吧,懵逼也得硬着头皮上啊。我们开始折腾吧,先不管上面提到的五种叫法或者概念,直接开搞。
开搞
参照上面的那些文档中的方式,每一种集成弄他至少一遍,折腾的过程中可以查查资料,了解一下安卓原生开发的一些基本概念,比如Activity(关于Activity此处可以参考@AronWOng 分享的文章,简洁的介绍了Activity的意思 Android开机自启应用)。或者熟悉下项目的包结构,哪些文件是干啥的,比如Androidmanifest.xml是个什么鬼。折腾了好长一段时间之后,得出了以下的几个结论,注意此结论中并未指定集成方式的叫法(概念),暂时先直接讲要怎么做:
-
如果你只需要离线打包,比如在无法使用HB的云端打包情况下,那么就使用该篇文章中的方式 集成方式a1, 或者集成方式a2,该模式下,不涉及到自己写原生代码,只要按照官方介绍,将自己HB中的项目集成到eclipse或者Android Studio中打包。换种说法就是,如果你没有任何涉及原生开发的需求,并且需要在eclipse或者Android Studio中打包,就采用该模式。
-
如果你有需求会涉及到原生开发,同时又要集成5 + app。以我的项目需求为例,我需要在PDA上开发5 + app,这款PDA就是个基于Android的手机,但是多了一个硬件:扫描器。我需要在App中监听到PDA上的扫描器相关事件,初始化扫描头,开始扫描,获取扫描结果等,并将扫描结果传入5 + App。由于NJS无法实现(或者可以说我不知道怎么使用NJS实现),这个时候我就要采用下面的文章中的做法 集成方式b1或者 集成方式b2。具体实现思路是,我在5 + App对应的Activity中,用java实现对扫描头的监听,并将扫描结果传入5 + app指定的webView,触发js事件,实现5 +app的监听(关于如何在集成SDK后,从java层获取指定webView并传入参数、触发js方法,参考android webApp集成方式 原生主动调用JS方法,此处感谢@DCloud_SDK_骁骑 和 @杰世 的无私帮助与解答)
-
如果你已经在原生层开发好了了App,但是可能在原生层的某些需求中,比如单个页面需要使用5 + 的能力,这种时候采用下面文章中的做法集成方式c。
-
如果你需要在5 +App或者说5 +App的某个特定的webView中,通过js调用原生层的方法,并将原生层方法的执行结果返回至js。还是以我的项目为例,还是说PDA,我需要在5 App中主动调用扫描头,并将扫描头扫描的结果传回5 +App,触发相关js方法。那么采用下面文章中的的方式集成方式d。
总结
讲到这里,相信大家会对目前官方的提供的几种操作方式有一定的了解,那么,现在用我的理解来套用官方的概念(叫法)
-
离线打包:只要不是在HB中进行云端打包,其他方式我们都可以理解为离线打包,因为你都要涉及到将5 +SDK集成到原生层。即便是最傻瓜式的该方法 集成方式a1,也是相当于把集成的工作给你做好了而已。
-
独立应用集成方式,就是Widget集成方式,就是官方SDK中的Hello-Integrate项目里的webApp集成方式,就是 集成方式b1,就是 集成方式b2
-
WebView集成方式,就是集成方式c,也可以理解为集成方式d,此处参考官方SDK中的Hello-Integrate项目里的WebView集成方式
-
Android平台第三方插件开发指导,就是集成方式d。
最后的话
作为HB的用户已经三个月了,感谢DC提供一款如此好用的工具,衷心希望DC越走越好。同时,该文章参考了论坛中很多其他开发者的总结,在此一并感谢。第一次写,文章格式看起来有点乱,审美比较差导致……最后如果我的总结没有太严重的错误的话,那我觉得官方文档中关于5 +SDK的部分概念说明,是时候改改了,也希望大家指出我的错误
收起阅读 »