HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

夜间模式/黑暗模式的另一种简单实现思路

夜间模式

前言
项目临近上线,突然说要适配黑暗模式,nvue项目,没有提前设计好的情况下,css换皮简直工程浩大,时间来不及。
那么偷懒时间好巧看到某新闻类app的夜间模式就是一个暗色遮罩(ps:走过一段改变屏幕亮度的弯路),这样灵感不就来了嘛。

正文
1,plus.nativeObj.View创建一个rgba(0,0,0,0.3)遮罩view;
2,设置view的interceptTouchEvent为false,不影响其他页面的点击;
3,使用startAnimation方法在副view上添加一个gif(太阳变月亮的哪种),实现动画效果;
4,打开夜间模式就view.show();startAnimation();就够了。
5,除了开关之外,还有存入storage一个isNight标识,当app进入或者启动页结束后根据isNight来重新显示遮罩view。
另外上述3完全可以用两个view实现,而且更方便。

废话
这种取巧的方法亲测好用,不会影响到原生video或者页面跳转。
ps:在想到这个办法之前已经被自己坑得体无完肤了,抛砖引玉,想知道css换皮在nvue中有没有好的实现方式啊,毕竟无法子类名选择,难道就真的很蛋疼的一个一个的写吗,有没有什么巧妙的方法呢。

继续阅读 »

前言
项目临近上线,突然说要适配黑暗模式,nvue项目,没有提前设计好的情况下,css换皮简直工程浩大,时间来不及。
那么偷懒时间好巧看到某新闻类app的夜间模式就是一个暗色遮罩(ps:走过一段改变屏幕亮度的弯路),这样灵感不就来了嘛。

正文
1,plus.nativeObj.View创建一个rgba(0,0,0,0.3)遮罩view;
2,设置view的interceptTouchEvent为false,不影响其他页面的点击;
3,使用startAnimation方法在副view上添加一个gif(太阳变月亮的哪种),实现动画效果;
4,打开夜间模式就view.show();startAnimation();就够了。
5,除了开关之外,还有存入storage一个isNight标识,当app进入或者启动页结束后根据isNight来重新显示遮罩view。
另外上述3完全可以用两个view实现,而且更方便。

废话
这种取巧的方法亲测好用,不会影响到原生video或者页面跳转。
ps:在想到这个办法之前已经被自己坑得体无完肤了,抛砖引玉,想知道css换皮在nvue中有没有好的实现方式啊,毕竟无法子类名选择,难道就真的很蛋疼的一个一个的写吗,有没有什么巧妙的方法呢。

收起阅读 »

微信小程序 searchbar uniapp中实现

uniapp 自定义组件

uniapp中如何实现https://developers.weixin.qq.com/miniprogram/dev/extended/weui/search.html

类似附件中组件套用效果,其中

组件searchbar需要引用组件cells,cell

组件cell需要引用组件cells

继续阅读 »

uniapp中如何实现https://developers.weixin.qq.com/miniprogram/dev/extended/weui/search.html

类似附件中组件套用效果,其中

组件searchbar需要引用组件cells,cell

组件cell需要引用组件cells

收起阅读 »

使用Xcode 制作自定义storyboard启动界面(用一张全屏图快速适配全部设备),供uniAPP使用。

启动图片

尴尬 真是不好意思~~ 印象笔记直接 复制不过来。 需要的朋友 看这个 地址的吧 https://app.yinxiang.com/fx/280d41e3-3aba-420f-895c-aeec84a2ede5

1新建项目

80e3547b3db6f1069d927f6f2f95088b.png
0522895903a3c1ae39f84c841f92a88d.png
86527f763315a204b7512ccfee5129df.png
想要全屏显示并适应所有尺寸的iPad和iphone 需要用7501624 2X 和 1125 2436 3X大小的图片
ebffedf8f1211ee0182fb0bc5938b31b.png
853cbba819fe48d69c5b710c31fb73b8.png
ab6c3cc6c0fc5f5c2a85a0926704b86c.png
4fa551ed13071faa73633323cb998f4e.png
aeb09be61c8aec1b3eb51d286dd3245d.png
9de190f7a92466179885fd7c049b261d.png
5bc54493ac3c79ef50943c63299714ea.png
daacbdb218502602bf4983cd858eaf59.png
f3de8141212b206e1afdbf7a2c98e805.png
a9ad081f036a8b2a9cf3bd7118225191.png
这里做完就可以导出文件了 把文件和图片放到一起 见下图

命名规范
dc_launchscreen_background@2x
dc_launchscreen_background@3x
CustomStoryboard
b218c8d12f83ee43ea99946e9554366f.png
最后一步
1f8b8e5a32526a9226272931b520acf9.png

最后提醒 压缩文件 等修改完文件之后再进行压缩生成,我截的图有点没按顺序来。

得到这个文件夹
b1cc35fde2fa62a81d5c46248e238c75.png

d18fc7264a3595756168127dbaada0b9.png

最后云打包测试吧


最后的最后 附上生成的源文件

直接下载 添加启动图就可以了
前提条件:1图片大小 7501624 2X 和 1125 2436 3X大小的图片
2,命名规范 dc_launchscreen_background@2x.png
dc_launchscreen_background@3x.png
CustomStoryboard.zip

b218c8d12f83ee43ea99946e9554366f.png
1新建项目

80e3547b3db6f1069d927f6f2f95088b.png
0522895903a3c1ae39f84c841f92a88d.png
86527f763315a204b7512ccfee5129df.png
想要全屏显示并适应所有尺寸的iPad和iphone 需要用7501624 2X 和 1125 2436 3X大小的图片
ebffedf8f1211ee0182fb0bc5938b31b.png
853cbba819fe48d69c5b710c31fb73b8.png
ab6c3cc6c0fc5f5c2a85a0926704b86c.png
4fa551ed13071faa73633323cb998f4e.png
aeb09be61c8aec1b3eb51d286dd3245d.png
9de190f7a92466179885fd7c049b261d.png
5bc54493ac3c79ef50943c63299714ea.png
daacbdb218502602bf4983cd858eaf59.png
f3de8141212b206e1afdbf7a2c98e805.png
a9ad081f036a8b2a9cf3bd7118225191.png
这里做完就可以导出文件了 把文件和图片放到一起 见下图

命名规范
dc_launchscreen_background@2x
dc_launchscreen_background@3x
CustomStoryboard
b218c8d12f83ee43ea99946e9554366f.png
最后一步
1f8b8e5a32526a9226272931b520acf9.png

最后提醒 压缩文件 等修改完文件之后再进行压缩生成,我截的图有点没按顺序来。

得到这个文件夹
b1cc35fde2fa62a81d5c46248e238c75.png

d18fc7264a3595756168127dbaada0b9.png

最后云打包测试吧

最后的最后 附上生成的源文件

直接下载 添加启动图就可以了
前提条件:
1,图片大小 7501624 2X 和 1125 2436 3X大小的图片
2,命名规范 dc_launchscreen_background@2x.png
dc_launchscreen_background@3x.png
CustomStoryboard.zip
3, 保证文件在压缩包的根目录。

b218c8d12f83ee43ea99946e9554366f.png

继续阅读 »

尴尬 真是不好意思~~ 印象笔记直接 复制不过来。 需要的朋友 看这个 地址的吧 https://app.yinxiang.com/fx/280d41e3-3aba-420f-895c-aeec84a2ede5

1新建项目

80e3547b3db6f1069d927f6f2f95088b.png
0522895903a3c1ae39f84c841f92a88d.png
86527f763315a204b7512ccfee5129df.png
想要全屏显示并适应所有尺寸的iPad和iphone 需要用7501624 2X 和 1125 2436 3X大小的图片
ebffedf8f1211ee0182fb0bc5938b31b.png
853cbba819fe48d69c5b710c31fb73b8.png
ab6c3cc6c0fc5f5c2a85a0926704b86c.png
4fa551ed13071faa73633323cb998f4e.png
aeb09be61c8aec1b3eb51d286dd3245d.png
9de190f7a92466179885fd7c049b261d.png
5bc54493ac3c79ef50943c63299714ea.png
daacbdb218502602bf4983cd858eaf59.png
f3de8141212b206e1afdbf7a2c98e805.png
a9ad081f036a8b2a9cf3bd7118225191.png
这里做完就可以导出文件了 把文件和图片放到一起 见下图

命名规范
dc_launchscreen_background@2x
dc_launchscreen_background@3x
CustomStoryboard
b218c8d12f83ee43ea99946e9554366f.png
最后一步
1f8b8e5a32526a9226272931b520acf9.png

最后提醒 压缩文件 等修改完文件之后再进行压缩生成,我截的图有点没按顺序来。

得到这个文件夹
b1cc35fde2fa62a81d5c46248e238c75.png

d18fc7264a3595756168127dbaada0b9.png

最后云打包测试吧


最后的最后 附上生成的源文件

直接下载 添加启动图就可以了
前提条件:1图片大小 7501624 2X 和 1125 2436 3X大小的图片
2,命名规范 dc_launchscreen_background@2x.png
dc_launchscreen_background@3x.png
CustomStoryboard.zip

b218c8d12f83ee43ea99946e9554366f.png
1新建项目

80e3547b3db6f1069d927f6f2f95088b.png
0522895903a3c1ae39f84c841f92a88d.png
86527f763315a204b7512ccfee5129df.png
想要全屏显示并适应所有尺寸的iPad和iphone 需要用7501624 2X 和 1125 2436 3X大小的图片
ebffedf8f1211ee0182fb0bc5938b31b.png
853cbba819fe48d69c5b710c31fb73b8.png
ab6c3cc6c0fc5f5c2a85a0926704b86c.png
4fa551ed13071faa73633323cb998f4e.png
aeb09be61c8aec1b3eb51d286dd3245d.png
9de190f7a92466179885fd7c049b261d.png
5bc54493ac3c79ef50943c63299714ea.png
daacbdb218502602bf4983cd858eaf59.png
f3de8141212b206e1afdbf7a2c98e805.png
a9ad081f036a8b2a9cf3bd7118225191.png
这里做完就可以导出文件了 把文件和图片放到一起 见下图

命名规范
dc_launchscreen_background@2x
dc_launchscreen_background@3x
CustomStoryboard
b218c8d12f83ee43ea99946e9554366f.png
最后一步
1f8b8e5a32526a9226272931b520acf9.png

最后提醒 压缩文件 等修改完文件之后再进行压缩生成,我截的图有点没按顺序来。

得到这个文件夹
b1cc35fde2fa62a81d5c46248e238c75.png

d18fc7264a3595756168127dbaada0b9.png

最后云打包测试吧

最后的最后 附上生成的源文件

直接下载 添加启动图就可以了
前提条件:
1,图片大小 7501624 2X 和 1125 2436 3X大小的图片
2,命名规范 dc_launchscreen_background@2x.png
dc_launchscreen_background@3x.png
CustomStoryboard.zip
3, 保证文件在压缩包的根目录。

b218c8d12f83ee43ea99946e9554366f.png

收起阅读 »

新手学编程应该怎么选择,该注意什么??

今天我们来聊聊学编程纯萌新该怎么做。
首先呢,先不要觉得程序猿的工资就一定高,因为任何一个职业都会有收入高的低的,毕竟在这个世界上有无数的职业,程序猿也并不多特殊,只是一个普通的职业。说这些不是要劝退你们而是说不要太盲目,因为网上疯传的某行业入行门槛低、月薪高、发展前景好,是热门岗位,很多人想转行就会跟风,然后刚入门学了点觉得难或者不好就又退了。所以选择一定要慎重,毕竟关乎未来嘛,谁都想过的更好。
都说前端之类的入门门槛低,学起来很容易,但是实际上对于没学过的人来说还是很难的,所以一开始先要有学下去的信心,要有遇到难题的心理准备,不能一学着觉得很难就开始想放弃。其次是找对方向不管是学JS,C语言,python,vue,还是其他编程语言,先去了解一下它们的作用之类的,找到你感兴趣的喜欢的,只有对这个有兴趣才有学下去的动力,也能更加高效的学习。
然后,学习完了要记得经常练习,不然的话会生疏可能过两个小时就忘了。毕竟编程语言基本都是要敲代码实践的,这边建议多写多运行才能发现不足之处,题做出来了亦能让人有成就感,这样才能更快更好的学习
最后祝各位早日学成,加油吧!!!文章链接,还可在线运行代码

继续阅读 »

今天我们来聊聊学编程纯萌新该怎么做。
首先呢,先不要觉得程序猿的工资就一定高,因为任何一个职业都会有收入高的低的,毕竟在这个世界上有无数的职业,程序猿也并不多特殊,只是一个普通的职业。说这些不是要劝退你们而是说不要太盲目,因为网上疯传的某行业入行门槛低、月薪高、发展前景好,是热门岗位,很多人想转行就会跟风,然后刚入门学了点觉得难或者不好就又退了。所以选择一定要慎重,毕竟关乎未来嘛,谁都想过的更好。
都说前端之类的入门门槛低,学起来很容易,但是实际上对于没学过的人来说还是很难的,所以一开始先要有学下去的信心,要有遇到难题的心理准备,不能一学着觉得很难就开始想放弃。其次是找对方向不管是学JS,C语言,python,vue,还是其他编程语言,先去了解一下它们的作用之类的,找到你感兴趣的喜欢的,只有对这个有兴趣才有学下去的动力,也能更加高效的学习。
然后,学习完了要记得经常练习,不然的话会生疏可能过两个小时就忘了。毕竟编程语言基本都是要敲代码实践的,这边建议多写多运行才能发现不足之处,题做出来了亦能让人有成就感,这样才能更快更好的学习
最后祝各位早日学成,加油吧!!!文章链接,还可在线运行代码

收起阅读 »

发送短信教程(验证码、短信通知)

短信验证码 短信 云服务

> 文档已迁移至新链接:https://doc.dcloud.net.cn/uniCloud/sms/service.html
> 如有疑问,可以单独发贴咨询。

继续阅读 »

> 文档已迁移至新链接:https://doc.dcloud.net.cn/uniCloud/sms/service.html
> 如有疑问,可以单独发贴咨询。

收起阅读 »

5+ app 保存海报图片至手机相册

/**  
* this.posterUrl  海报 base64 图片  
*/  
let fileName = 'share'  
      var bitmap = new plus.nativeObj.Bitmap('share')  
      bitmap.loadBase64Data(this.posterUrl, function(e) {  
        console.log('加载Base64图片数据成功')  
        // 如果传入文件名称为空,则直接设置APP名称为文件名称  
        if (fileName === undefined) {  
          fileName = plus.runtime.name  
        }  

        fileName = fileName+ +(new Date) + '.png'  

        bitmap.save('_doc/' + fileName, {}, function(i) {  
          console.log('保存图片成功:' + JSON.stringify(i))  
          plus.gallery.save(i.target, function(e) {  
            console.log('保存图片成功:' + JSON.stringify(e))  
            Toast(`图片保存到:${e.file}`)  
          }, function() {  
            Toast(`图片保存失败`)  
          })  
        }, function(e) {  
          console.log('保存图片失败:' + JSON.stringify(e))  
          Toast(`图片保存失败`)  
        })  
      }, function(e) {  
        console.log('加载Base64图片数据失败:' + JSON.stringify(e))  
        Toast(`图片保存失败`)  
      })
继续阅读 »
/**  
* this.posterUrl  海报 base64 图片  
*/  
let fileName = 'share'  
      var bitmap = new plus.nativeObj.Bitmap('share')  
      bitmap.loadBase64Data(this.posterUrl, function(e) {  
        console.log('加载Base64图片数据成功')  
        // 如果传入文件名称为空,则直接设置APP名称为文件名称  
        if (fileName === undefined) {  
          fileName = plus.runtime.name  
        }  

        fileName = fileName+ +(new Date) + '.png'  

        bitmap.save('_doc/' + fileName, {}, function(i) {  
          console.log('保存图片成功:' + JSON.stringify(i))  
          plus.gallery.save(i.target, function(e) {  
            console.log('保存图片成功:' + JSON.stringify(e))  
            Toast(`图片保存到:${e.file}`)  
          }, function() {  
            Toast(`图片保存失败`)  
          })  
        }, function(e) {  
          console.log('保存图片失败:' + JSON.stringify(e))  
          Toast(`图片保存失败`)  
        })  
      }, function(e) {  
        console.log('加载Base64图片数据失败:' + JSON.stringify(e))  
        Toast(`图片保存失败`)  
      })
收起阅读 »

uni-app微信公众号支付和分享,特别是ios下的配置,完美解决

uniapp 教程

一、支付

由于在ios中uni-app发布的应用是单应用,不管访问哪个页面,始终记录的是首次进来的那个页面。

这样的话,在微信支付签名时会报签名不对的错误。怎么解决?

老王的解决方案是在main.js下加上以下代码:

//#ifdef H5  

app.$router.afterEach((to, from) => {  

const u = navigator.userAgent.toLowerCase()  

if (u.indexOf("like mac os x") < 0 || u.match(/MicroMessenger/i) != 'micromessenger') return  

if (to.path !== global.location.pathname) {  

location.assign(config.h5_addr + to.fullPath);  

}  

})  

//#endif

什么意思呢?支付无非就是要当前页的链接到后台签名,这个页面需要配置到微信支付授权目录。

这段代码就是通过vue全局钩子函数,动态改变浏览器地址。

自此,支付问题完美解决。

二、分享

分享的话比较麻烦一点,解决方案倒还比较简单,就是判断跳转后的页面是否是分享页面,如果是的,就用window.location.href跳转。但是要实现公用的话,就需要封装方法。app内的所有跳转都走全局跳转,封装一个全局函数,然后在全局函数里定义需要分享的页面链接,跳转前判断是不是分享页面。

//判断是否分享页面  

if (shareLinks.indexOf(p) > -1) {  

//公众号  

// #ifdef H5  

window.location.href = config.app_url + config.h5_addr + url;  

return;  

// #endif  

}  

// 普通页面  

uni.navigateTo({  

url: url  

});

至此,完美解决了uni-app在ios下的公众号分享跟支付问题。

继续阅读 »

一、支付

由于在ios中uni-app发布的应用是单应用,不管访问哪个页面,始终记录的是首次进来的那个页面。

这样的话,在微信支付签名时会报签名不对的错误。怎么解决?

老王的解决方案是在main.js下加上以下代码:

//#ifdef H5  

app.$router.afterEach((to, from) => {  

const u = navigator.userAgent.toLowerCase()  

if (u.indexOf("like mac os x") < 0 || u.match(/MicroMessenger/i) != 'micromessenger') return  

if (to.path !== global.location.pathname) {  

location.assign(config.h5_addr + to.fullPath);  

}  

})  

//#endif

什么意思呢?支付无非就是要当前页的链接到后台签名,这个页面需要配置到微信支付授权目录。

这段代码就是通过vue全局钩子函数,动态改变浏览器地址。

自此,支付问题完美解决。

二、分享

分享的话比较麻烦一点,解决方案倒还比较简单,就是判断跳转后的页面是否是分享页面,如果是的,就用window.location.href跳转。但是要实现公用的话,就需要封装方法。app内的所有跳转都走全局跳转,封装一个全局函数,然后在全局函数里定义需要分享的页面链接,跳转前判断是不是分享页面。

//判断是否分享页面  

if (shareLinks.indexOf(p) > -1) {  

//公众号  

// #ifdef H5  

window.location.href = config.app_url + config.h5_addr + url;  

return;  

// #endif  

}  

// 普通页面  

uni.navigateTo({  

url: url  

});

至此,完美解决了uni-app在ios下的公众号分享跟支付问题。

收起阅读 »

上海互联网公司招uniapp开发偏app原生方向的,有意的联系

坐标:上海西藏北路,主要负责uniapp开发app兼容和插件等方面的工作,薪酬范围在15-20k。有意的请联系我。

坐标:上海西藏北路,主要负责uniapp开发app兼容和插件等方面的工作,薪酬范围在15-20k。有意的请联系我。

有没有人觉得hb的git插件太难用了

多人开发就不能差太多版本,冲突,冲突,合并也合并不了

比起idea,webstorm,eclipse差远了

多人开发就不能差太多版本,冲突,冲突,合并也合并不了

比起idea,webstorm,eclipse差远了

微信支付失败,返回错误信息只有{"errMsg":"requestPayment:fail errors"}

在uniapp 微信支付时,一直提示报错,配置信息都没问题,并且没有类似于-1的状态提示,那么有可能是uniapp端支付代码的参数顺序有问题
uni.requestPayment({
provider: 'wxpay',
orderInfo: obj,
success: res=> {
success && success(res)
},
fail: res=> {
console.log(res)
fail && fail(res)
}
});
{
"appid": "wxxxxxxxxxxxxx",
"noncestr": "84FB3E2B75B04343921985C4DB75BC45",
"package": "Sign=WXPay",
"partnerid": "000000000",
"prepayid": "wx1514411xxxxxxxxxxxxxxxxxx699386300",
"sign": "62FD6A3EF48CE76AFD2XXB0D9C70EEDD",
"timestamp": "1594795179"
}
这组数据看着没问题(部分隐私信息已修改),并且签名经过官方效验没问题,
微信签名效验地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
经过测试,发现,发生错误的原因是因为sgin的顺序没有在最后,目前未测试其他参数的顺序是否影响支付成功。请大家一定要注意参数的顺序,3天的时间就因为这个参数浪费了,惨痛的教训啊
微信app支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

继续阅读 »

在uniapp 微信支付时,一直提示报错,配置信息都没问题,并且没有类似于-1的状态提示,那么有可能是uniapp端支付代码的参数顺序有问题
uni.requestPayment({
provider: 'wxpay',
orderInfo: obj,
success: res=> {
success && success(res)
},
fail: res=> {
console.log(res)
fail && fail(res)
}
});
{
"appid": "wxxxxxxxxxxxxx",
"noncestr": "84FB3E2B75B04343921985C4DB75BC45",
"package": "Sign=WXPay",
"partnerid": "000000000",
"prepayid": "wx1514411xxxxxxxxxxxxxxxxxx699386300",
"sign": "62FD6A3EF48CE76AFD2XXB0D9C70EEDD",
"timestamp": "1594795179"
}
这组数据看着没问题(部分隐私信息已修改),并且签名经过官方效验没问题,
微信签名效验地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=20_1
经过测试,发现,发生错误的原因是因为sgin的顺序没有在最后,目前未测试其他参数的顺序是否影响支付成功。请大家一定要注意参数的顺序,3天的时间就因为这个参数浪费了,惨痛的教训啊
微信app支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5

收起阅读 »

开发Android插件,报错 is not accessible from ...TypeModuleFactory 问题解决方案

Android uniapp原生插件 uniapp

最近升级到了Andoroid Studio 4.0,然后开发插件时遇到的一个小问题

本来一切流程照常,和以前创建Android原生插件一样新建了Module,但是跑起来的时候,调用任何原生方法都报这个错
代码、详细报错如下

java.lang.Class"\<"com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class"\<"com.taobao.weex.common.TypeModuleFactory>

2020-07-15 12:44:26.429 2905-2960/com.dapaoxiaoyingxiong.game E/weex: easy-protector module build instace failed.java.lang.IllegalAccessException: java.lang.Class<com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class<com.taobao.weex.common.TypeModuleFactory>  
        at java.lang.Class.newInstance(Native Method)  
        at com.taobao.weex.common.TypeModuleFactory.buildInstance(TypeModuleFactory.java:79)  
        at com.taobao.weex.bridge.WXModuleManager.findModule(WXModuleManager.java:284)  
        at com.taobao.weex.bridge.WXModuleManager.callModuleMethod(WXModuleManager.java:213)  
        at com.taobao.weex.bridge.WXBridgeManager.callModuleMethod(WXBridgeManager.java:518)  
        at com.taobao.weex.bridge.WXBridgeManager.callNativeModule(WXBridgeManager.java:700)  
        at com.taobao.weex.bridge.WXBridge.callNativeModule(WXBridge.java:371)  
        at com.taobao.weex.base.SystemMessageHandler.nativeRunWork(Native Method)  
        at com.taobao.weex.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:104)  
        at android.os.Handler.dispatchMessage(Handler.java:106)  
        at android.os.Looper.loop(Looper.java:173)  
        at android.os.HandlerThread.run(HandlerThread.java:65)

看提示以为是继承出了问题
但是修改为继承:com.taobao.weex.common.WXModule 还是 com.taobao.weex.WXSDKEngine.DestroyableModule 都还仍然报这个错

折腾了几个小时后,仔细对比,发现和以前自己开发的插件 只有一个差别:
以前的Module建的Class ide自动使用了public修饰
升级到了Andoroid Studio 4.0后,ide默认没有public修饰Class
遂用public 修饰 Class之后,一切调用运行正常
很隐蔽的一个小坑,记录一下

继续阅读 »

最近升级到了Andoroid Studio 4.0,然后开发插件时遇到的一个小问题

本来一切流程照常,和以前创建Android原生插件一样新建了Module,但是跑起来的时候,调用任何原生方法都报这个错
代码、详细报错如下

java.lang.Class"\<"com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class"\<"com.taobao.weex.common.TypeModuleFactory>

2020-07-15 12:44:26.429 2905-2960/com.dapaoxiaoyingxiong.game E/weex: easy-protector module build instace failed.java.lang.IllegalAccessException: java.lang.Class<com.fenger.uniplugin.uniplugin_easyprotector.easyProtector> is not accessible from java.lang.Class<com.taobao.weex.common.TypeModuleFactory>  
        at java.lang.Class.newInstance(Native Method)  
        at com.taobao.weex.common.TypeModuleFactory.buildInstance(TypeModuleFactory.java:79)  
        at com.taobao.weex.bridge.WXModuleManager.findModule(WXModuleManager.java:284)  
        at com.taobao.weex.bridge.WXModuleManager.callModuleMethod(WXModuleManager.java:213)  
        at com.taobao.weex.bridge.WXBridgeManager.callModuleMethod(WXBridgeManager.java:518)  
        at com.taobao.weex.bridge.WXBridgeManager.callNativeModule(WXBridgeManager.java:700)  
        at com.taobao.weex.bridge.WXBridge.callNativeModule(WXBridge.java:371)  
        at com.taobao.weex.base.SystemMessageHandler.nativeRunWork(Native Method)  
        at com.taobao.weex.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:104)  
        at android.os.Handler.dispatchMessage(Handler.java:106)  
        at android.os.Looper.loop(Looper.java:173)  
        at android.os.HandlerThread.run(HandlerThread.java:65)

看提示以为是继承出了问题
但是修改为继承:com.taobao.weex.common.WXModule 还是 com.taobao.weex.WXSDKEngine.DestroyableModule 都还仍然报这个错

折腾了几个小时后,仔细对比,发现和以前自己开发的插件 只有一个差别:
以前的Module建的Class ide自动使用了public修饰
升级到了Andoroid Studio 4.0后,ide默认没有public修饰Class
遂用public 修饰 Class之后,一切调用运行正常
很隐蔽的一个小坑,记录一下

收起阅读 »