
献礼“618”,1700+集前端视频教程免费看
一年一度“618”,岁岁年年狂剁手。
随着网购时代的到来,越来越多的剁手节让大家谜一样的沉浸其中,无法自拔,什么618、双十一、双十二、双旦等等
年前定下的攒钱目标还没开始就要宣告结束
这就是人生不得不承认的事实
然而比618来得更猝不及防的
是各大电商的营销文案
一个比一个精彩
一个比一个诱惑
所谓清空购物车一时爽,事后剁手火葬场
小妙深知购物狂+剁手党的疯狂
也深知这样一个“节日”对自媒体人来说意味着什么
当然是拼文案拼营销拼姿势啊
反正,钱是越花越少的
经验是越攒越多的
精彩文案给你摆在这
这个手你剁不剁?
小妙作为剁手大军的一员,深深了解大家的纠结与痛苦
而我今年就不一样了,不但不剁手,还可以免费学到知识
免费看?免费?是的,你没看错,真的免费!!!
即日起,注册妙味视频平台的新用户,即可获得价值239元包含1700+集的前端优质视频教程的7天观看权限
无论你是在学布局还是在学小程序,亦或是在学Vue、react,这里应有尽有,爱学习的你,还没心动么,心动了的话就赶快行动起来吧
活动详情见海报:
一年一度“618”,岁岁年年狂剁手。
随着网购时代的到来,越来越多的剁手节让大家谜一样的沉浸其中,无法自拔,什么618、双十一、双十二、双旦等等
年前定下的攒钱目标还没开始就要宣告结束
这就是人生不得不承认的事实
然而比618来得更猝不及防的
是各大电商的营销文案
一个比一个精彩
一个比一个诱惑
所谓清空购物车一时爽,事后剁手火葬场
小妙深知购物狂+剁手党的疯狂
也深知这样一个“节日”对自媒体人来说意味着什么
当然是拼文案拼营销拼姿势啊
反正,钱是越花越少的
经验是越攒越多的
精彩文案给你摆在这
这个手你剁不剁?
小妙作为剁手大军的一员,深深了解大家的纠结与痛苦
而我今年就不一样了,不但不剁手,还可以免费学到知识
免费看?免费?是的,你没看错,真的免费!!!
即日起,注册妙味视频平台的新用户,即可获得价值239元包含1700+集的前端优质视频教程的7天观看权限
无论你是在学布局还是在学小程序,亦或是在学Vue、react,这里应有尽有,爱学习的你,还没心动么,心动了的话就赶快行动起来吧
活动详情见海报:
收起阅读 »
Android平台云端打包证书使用说明
HBuilderX中开发完成发布为原生App提交云端打包时,在“App云端打包”界面中Android平台需要选择签名证书:
支持以下证书类型:
- 使用自有证书
开发者自己生成证书,正式发布应用时推荐使用此类型证书 - 使用云证书
DCloud云打包机自动生成证书,适用于开发证书。 - 使用公共测试证书
已下线。请勿使用。 - 使用DCloud老版证书
兼容老项目使用之前的DCloud证书时选择,此证书已废弃,请勿使用。
关于Android证书的用途
证书是一个开发者的身份标志,对Android系统而言。使用一个证书签发的App,是属于同一个开发者的App。
举个极端的例子,如果你的应用证书泄露,那么别人可以用这个证书签名一个仿冒App,假如包名和你的包名也一样,就可以覆盖安装安卓手机上你之前的包。
当前仅依赖证书校验是不完善的,所以主流的Android应用市场,通过实名认证开发者信息和著作权,强化了App的唯一性。也就是从主流应用市场点更新,不会发生冒充事件。但是通过其他方式安装apk,仍然会发生冒充的可能性。
如果签名不同,即使包名相同,也无法覆盖安装。此时安卓手机会在安装时报错,需要先卸载老的版本,才能安装新版。
证书安全说明
Android的应用安全管理模型,包括包名、证书、应用市场的账户。
包名是公开的,任何人都可以做一个apk包,包名和你的应用包名相同。那么如何防止仿冒包?
- 他人没有你的应用市场账户,就无法在市场发布仿冒包。
- 他人没有你的签名证书。不过这一点,现实中有很多问题,手机用户是没有识别能力的。大多数安卓手机上也无法查看应用的签名信息。
证书使用说明
使用自有证书打包发布
开发者如果已经有自己的安卓证书,可直接使用。
如果没有,使用JDK的keytool工具生成一个,不像Apple证书那样收费,制作Android证书没有费用。
完整教程参考Android平台签名证书(.keystore)生成指南
注意以下问题:
- 证书文件密码(storepass)和证书密码(keypass)必须一致,HBuilder|HBuilderX默认这两个密码一致
- 证书别名使用英文字母或数字(老版本HBuilder不支持使用中文别名)
- 证书名称建议使用英文字母或数字,避免使用中文
生成证书后注意保存,不要泄露。
提交云端打包时,如下图配置:
提交云端打包后,打包机会立即删除的证书,不会保存或泄露证书,请放心使用
<a id="server"/>
使用云端证书(服务器生成的证书)
生成自有证书需要配置jre环境,为了方便开发者快速生成证书云端打包,从HBuilderX3.2.0及以上版本开始支持服务器生成证书。
在App打包界面可以直接勾选“使用云端证书”:

云证书的优势是开发方便。但在发布商业应用时,商业组织往往会分离开发证书和发布证书,发布证书仅少数人掌管。
DCloud建议开发阶段使用云证书,开发者打包出apk后,交给掌管发布证书的人员使用发布证书自行重签,再上架应用商店。
注意:
- 服务器生成的证书绑定应用appid,即每个appid会各自生成证书
- 服务器生成的证书会自动填写证书信息,不支持自定义证书信息,有效期为100年
- 查看或下载服务器生成的证书,请登录DCloud开发者中心
- DCloud不对开发者证书管理行为不规范引发的问题负责
使用公共测试证书打包
为了方便开发者评估、测试体验,可直接使用公共测试证书打包,免去制作证书的麻烦。
证书信息参考:https://ask.dcloud.net.cn/article/36522
注意:
- 所有开发者都能使用此证书打包
- 证书可以被所有人下载
- 证书信息为Test
此模式已下线,请勿使用
使用DCloud公用证书
因为此证书包含DCloud公司名称信息,与实际应用的所有者信息描述和省份不符,为了保障开发者利益及安全要求,已废弃此证书。
详情参考https://ask.dcloud.net.cn/article/68
注意事项
注意证书有一个特点,用A证书打包后,后续新版若改用B证书,会导致升级包无法安装。因为相同包名但签名不同时,Android rom不允许安装新包。所以商用第一版应用发布时,证书一定选择好。
证书的区别如上,如何选择证书,每位开发者根据自己的需求定夺。
HBuilderX中开发完成发布为原生App提交云端打包时,在“App云端打包”界面中Android平台需要选择签名证书:
支持以下证书类型:
- 使用自有证书
开发者自己生成证书,正式发布应用时推荐使用此类型证书 - 使用云证书
DCloud云打包机自动生成证书,适用于开发证书。 - 使用公共测试证书
已下线。请勿使用。 - 使用DCloud老版证书
兼容老项目使用之前的DCloud证书时选择,此证书已废弃,请勿使用。
关于Android证书的用途
证书是一个开发者的身份标志,对Android系统而言。使用一个证书签发的App,是属于同一个开发者的App。
举个极端的例子,如果你的应用证书泄露,那么别人可以用这个证书签名一个仿冒App,假如包名和你的包名也一样,就可以覆盖安装安卓手机上你之前的包。
当前仅依赖证书校验是不完善的,所以主流的Android应用市场,通过实名认证开发者信息和著作权,强化了App的唯一性。也就是从主流应用市场点更新,不会发生冒充事件。但是通过其他方式安装apk,仍然会发生冒充的可能性。
如果签名不同,即使包名相同,也无法覆盖安装。此时安卓手机会在安装时报错,需要先卸载老的版本,才能安装新版。
证书安全说明
Android的应用安全管理模型,包括包名、证书、应用市场的账户。
包名是公开的,任何人都可以做一个apk包,包名和你的应用包名相同。那么如何防止仿冒包?
- 他人没有你的应用市场账户,就无法在市场发布仿冒包。
- 他人没有你的签名证书。不过这一点,现实中有很多问题,手机用户是没有识别能力的。大多数安卓手机上也无法查看应用的签名信息。
证书使用说明
使用自有证书打包发布
开发者如果已经有自己的安卓证书,可直接使用。
如果没有,使用JDK的keytool工具生成一个,不像Apple证书那样收费,制作Android证书没有费用。
完整教程参考Android平台签名证书(.keystore)生成指南
注意以下问题:
- 证书文件密码(storepass)和证书密码(keypass)必须一致,HBuilder|HBuilderX默认这两个密码一致
- 证书别名使用英文字母或数字(老版本HBuilder不支持使用中文别名)
- 证书名称建议使用英文字母或数字,避免使用中文
生成证书后注意保存,不要泄露。
提交云端打包时,如下图配置:
提交云端打包后,打包机会立即删除的证书,不会保存或泄露证书,请放心使用
<a id="server"/>
使用云端证书(服务器生成的证书)
生成自有证书需要配置jre环境,为了方便开发者快速生成证书云端打包,从HBuilderX3.2.0及以上版本开始支持服务器生成证书。
在App打包界面可以直接勾选“使用云端证书”:
云证书的优势是开发方便。但在发布商业应用时,商业组织往往会分离开发证书和发布证书,发布证书仅少数人掌管。
DCloud建议开发阶段使用云证书,开发者打包出apk后,交给掌管发布证书的人员使用发布证书自行重签,再上架应用商店。
注意:
- 服务器生成的证书绑定应用appid,即每个appid会各自生成证书
- 服务器生成的证书会自动填写证书信息,不支持自定义证书信息,有效期为100年
- 查看或下载服务器生成的证书,请登录DCloud开发者中心
- DCloud不对开发者证书管理行为不规范引发的问题负责
使用公共测试证书打包
为了方便开发者评估、测试体验,可直接使用公共测试证书打包,免去制作证书的麻烦。
证书信息参考:https://ask.dcloud.net.cn/article/36522
注意:
- 所有开发者都能使用此证书打包
- 证书可以被所有人下载
- 证书信息为Test
此模式已下线,请勿使用
使用DCloud公用证书
因为此证书包含DCloud公司名称信息,与实际应用的所有者信息描述和省份不符,为了保障开发者利益及安全要求,已废弃此证书。
详情参考https://ask.dcloud.net.cn/article/68
注意事项
注意证书有一个特点,用A证书打包后,后续新版若改用B证书,会导致升级包无法安装。因为相同包名但签名不同时,Android rom不允许安装新包。所以商用第一版应用发布时,证书一定选择好。
证书的区别如上,如何选择证书,每位开发者根据自己的需求定夺。
收起阅读 »
dcloud集成腾讯广告联盟(优量汇)
摸索了几天终于采取一个不那么好的办法搞定了dcloud集成腾讯广告联盟,特记录下来,希望能给新手朋友一些帮助,安卓我只带过团队,自己也是第一次实际操作,老鸟请忽略。
1、离线打包
2、集成腾讯广告联盟的SDK
3、新增一个启动页
4、新增banner2.0的activity
5、用h5通过native调用activity
1、离线打包
这个官方有详细的介绍了
http://ask.dcloud.net.cn/article/508
说一下我踩过的几个坑
1-1、Module not specified
导入project,不是直接导入,而是先随意新建一个project,然后导入module,否则运行的时候会报错
1-2、Android Studio报错Manifest merger failed with multiple errors
这个提示是因为AndroidManifest.xml中的配置和build.gradle里的配置不一样,手动将build.gradle里的applicationId改成和AndroidManifest.xml的一致就可以正常运行了
2、集成腾讯广告联盟的SDK
2-1、将腾讯广告联盟的jar文件拷贝到项目根目录的libs目录下,
2-2、然后修改build.gradle,dependencies的最后一行加上implementation files('libs/GDTSDK.tbs.4.30.906.jar')(GDTSDK.tbs.4.30.906.jar是刚拷贝的jar的名字)
2-3、修改AndroidMnifest.xml(腾讯广告联盟的文档有描述),就不详细写了
3、新增一个启动activity
3-1、新建一个activity作为启动activity
3-2、启动activity参照腾讯广告联盟的DEMO就可以了,代码略作修改,这里加了一个限制,开屏广告一个小时只展示一次
protected void onCreate(@Nullable Bundle savedInstanceState) {
Long curDate = new Date().getTime();//当前时间
//获取上次时间
SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
String lastSpADTime = sp.getString("lastSpADTime", "0");
Long lastSpADTimeLong = Long.parseLong(lastSpADTime);
if(curDate - lastSpADTimeLong > 3600000) {//超过一个小时则再次显示广告
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
container = (ViewGroup) this.findViewById(R.id.splash_container);
skipView = (TextView) findViewById(R.id.skip_view);
splashHolder = (ImageView) findViewById(R.id.splash_holder);
splashAD = new SplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0);
//写入上次时间
SharedPreferences.Editor editor = sp.edit();
editor.putString("lastSpADTime", curDate.toString());
editor.apply();
} else {
this.onADDismissed();
}
}
private String getPosId() {
return Constants.SplashPosID;
}
public void onADDismissed() {
this.finish();
//主要改动是在这里,开屏广告展示完成后跳转到dcloud的启动activity
Intent intent = new Intent();
intent.setClass(SplashActivity.this, PandoraEntry.class);
startActivity(intent);
}
3-3、修改AndroidManifest.xml,设置SplashActivity为启动activity
<activity
android:name="com.example.H5PlusPlugin.SplashActivity"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:screenOrientation="user"
android:windowSoftInputMode="adjustResize"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:hardwareAccelerated="true"
android:theme="@style/TranslucentTheme"
android:screenOrientation="user"
android:windowSoftInputMode="adjustResize" >
</activity>
到这里就完成了开屏广告了
4、新增banner2.0的activity
这里是通过一个取巧的办法实现的,腾讯广告联盟的广告要在activity里展示,而我们又修改不了dcloud的activity,所以就新建一个Dialog样式的activity,来展示在dcloud的activity上了
4-1、新建一个activity,先把DEMO里的UnifiedBannerActivity里面的代码拷过来(千万不要拷贝BannerActivity里的,我没看清楚banner2.0广告,结果浪费了几个小时调试......),然后修改
public static BannerActivity instance = null;//用于在H5里关闭该activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_banner);
getIAD().loadAD();
}
private String getPosID() {
return Constants.UNIFIED_INTERSTITIAL_ID_ONLY_SMALL;
}
public static void h5Finish() {
BannerActivity.instance.finish();
}
activity_unified_banner代码如下(显示在底部的banner)
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="1000dp"
android:layout_height="55dp" >
<FrameLayout
android:id="@+id/bannerContainer"
android:layout_width="match_parent"
android:layout_height="150px"
android:layout_alignParentBottom="true" >
</FrameLayout>
</FrameLayout>
BannerActivity的样式代码如下
<resources>
<style name="Theme.Transparent" parent="android:Theme.Dialog">
<item name="android:windowFrame">@null</item><!-- 边框 -->
<item name="android:windowIsTranslucent">true</item><!--此对话框的背景-->
<item name="android:windowBackground">@drawable/bakground_circle</item><!--对话框是否透明-->
<item name="android:windowContentOverlay">@null</item><!--对话框是否有遮盖-->
<item name="android:windowNoTitle">true</item><!--对话框无标题-->
<item name="android:windowIsFloating">true</item> <!--对话框是否浮动-->
<item name="android:backgroundDimEnabled">false</item><!--是否允许对话框的背景变暗-->
</style>
</resources>
5、用h5通过native调用activity
5-1、打开activity
//加载banner广告
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent();
intent.setClassName(main, 'com.xx.xx.BannerActivity');//这里是Activity的路径
main.startActivity(intent);
//关闭banner广告
plus.android.invoke("com.xx.xx.BannerActivity", "h5Finish");
其他
插屏广告比较好插入,和banner广告一样就可以了,原生广告怎么搞还没想到办法,希望有能搞定的朋友可以补充一下。
附上项目实际应用的下载地址http://www.hongxun88.cn/download
摸索了几天终于采取一个不那么好的办法搞定了dcloud集成腾讯广告联盟,特记录下来,希望能给新手朋友一些帮助,安卓我只带过团队,自己也是第一次实际操作,老鸟请忽略。
1、离线打包
2、集成腾讯广告联盟的SDK
3、新增一个启动页
4、新增banner2.0的activity
5、用h5通过native调用activity
1、离线打包
这个官方有详细的介绍了
http://ask.dcloud.net.cn/article/508
说一下我踩过的几个坑
1-1、Module not specified
导入project,不是直接导入,而是先随意新建一个project,然后导入module,否则运行的时候会报错
1-2、Android Studio报错Manifest merger failed with multiple errors
这个提示是因为AndroidManifest.xml中的配置和build.gradle里的配置不一样,手动将build.gradle里的applicationId改成和AndroidManifest.xml的一致就可以正常运行了
2、集成腾讯广告联盟的SDK
2-1、将腾讯广告联盟的jar文件拷贝到项目根目录的libs目录下,
2-2、然后修改build.gradle,dependencies的最后一行加上implementation files('libs/GDTSDK.tbs.4.30.906.jar')(GDTSDK.tbs.4.30.906.jar是刚拷贝的jar的名字)
2-3、修改AndroidMnifest.xml(腾讯广告联盟的文档有描述),就不详细写了
3、新增一个启动activity
3-1、新建一个activity作为启动activity
3-2、启动activity参照腾讯广告联盟的DEMO就可以了,代码略作修改,这里加了一个限制,开屏广告一个小时只展示一次
protected void onCreate(@Nullable Bundle savedInstanceState) {
Long curDate = new Date().getTime();//当前时间
//获取上次时间
SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
String lastSpADTime = sp.getString("lastSpADTime", "0");
Long lastSpADTimeLong = Long.parseLong(lastSpADTime);
if(curDate - lastSpADTimeLong > 3600000) {//超过一个小时则再次显示广告
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
container = (ViewGroup) this.findViewById(R.id.splash_container);
skipView = (TextView) findViewById(R.id.skip_view);
splashHolder = (ImageView) findViewById(R.id.splash_holder);
splashAD = new SplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0);
//写入上次时间
SharedPreferences.Editor editor = sp.edit();
editor.putString("lastSpADTime", curDate.toString());
editor.apply();
} else {
this.onADDismissed();
}
}
private String getPosId() {
return Constants.SplashPosID;
}
public void onADDismissed() {
this.finish();
//主要改动是在这里,开屏广告展示完成后跳转到dcloud的启动activity
Intent intent = new Intent();
intent.setClass(SplashActivity.this, PandoraEntry.class);
startActivity(intent);
}
3-3、修改AndroidManifest.xml,设置SplashActivity为启动activity
<activity
android:name="com.example.H5PlusPlugin.SplashActivity"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:hardwareAccelerated="true"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:screenOrientation="user"
android:windowSoftInputMode="adjustResize"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|keyboard|navigation"
android:label="@string/app_name"
android:launchMode="singleTask"
android:hardwareAccelerated="true"
android:theme="@style/TranslucentTheme"
android:screenOrientation="user"
android:windowSoftInputMode="adjustResize" >
</activity>
到这里就完成了开屏广告了
4、新增banner2.0的activity
这里是通过一个取巧的办法实现的,腾讯广告联盟的广告要在activity里展示,而我们又修改不了dcloud的activity,所以就新建一个Dialog样式的activity,来展示在dcloud的activity上了
4-1、新建一个activity,先把DEMO里的UnifiedBannerActivity里面的代码拷过来(千万不要拷贝BannerActivity里的,我没看清楚banner2.0广告,结果浪费了几个小时调试......),然后修改
public static BannerActivity instance = null;//用于在H5里关闭该activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_banner);
getIAD().loadAD();
}
private String getPosID() {
return Constants.UNIFIED_INTERSTITIAL_ID_ONLY_SMALL;
}
public static void h5Finish() {
BannerActivity.instance.finish();
}
activity_unified_banner代码如下(显示在底部的banner)
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="1000dp"
android:layout_height="55dp" >
<FrameLayout
android:id="@+id/bannerContainer"
android:layout_width="match_parent"
android:layout_height="150px"
android:layout_alignParentBottom="true" >
</FrameLayout>
</FrameLayout>
BannerActivity的样式代码如下
<resources>
<style name="Theme.Transparent" parent="android:Theme.Dialog">
<item name="android:windowFrame">@null</item><!-- 边框 -->
<item name="android:windowIsTranslucent">true</item><!--此对话框的背景-->
<item name="android:windowBackground">@drawable/bakground_circle</item><!--对话框是否透明-->
<item name="android:windowContentOverlay">@null</item><!--对话框是否有遮盖-->
<item name="android:windowNoTitle">true</item><!--对话框无标题-->
<item name="android:windowIsFloating">true</item> <!--对话框是否浮动-->
<item name="android:backgroundDimEnabled">false</item><!--是否允许对话框的背景变暗-->
</style>
</resources>
5、用h5通过native调用activity
5-1、打开activity
//加载banner广告
var main = plus.android.runtimeMainActivity();
var Intent = plus.android.importClass("android.content.Intent");
var intent = new Intent();
intent.setClassName(main, 'com.xx.xx.BannerActivity');//这里是Activity的路径
main.startActivity(intent);
//关闭banner广告
plus.android.invoke("com.xx.xx.BannerActivity", "h5Finish");
其他
插屏广告比较好插入,和banner广告一样就可以了,原生广告怎么搞还没想到办法,希望有能搞定的朋友可以补充一下。
附上项目实际应用的下载地址http://www.hongxun88.cn/download

uni-app全局水印:根据图片路径生成,兼容多端
使用方法:
1、在App.vue中引入并设置水印
2、本例子使用的水印图片是250*250px的,可以根据需要自己调整样式
3、watermark.js内容见下方
<script>
import watermark from '@/commons/framework/watermark.js'
export default {
onLaunch: function() {
watermark.set('/static/framework/imgs/watermark.png');
},
onShow: function() {
console.log('App Show');
},
onHide: function() {
console.log('App Hide')
}
}
</script>
watermark.js
'use strict';
let watermark = {};
watermark.set = (path) => {
let id = '1.23452384164.123412415';
// #ifdef H5
if (document.getElementById(id) !== null) {
document.body.removeChild(document.getElementById(id));
}
let div = document.createElement('div');
div.id = id;
div.style.pointerEvents = 'none';
div.style.top = '44px';
div.style.left = '-40px';
div.style.bottom = '50px';
div.style.right = '0px';
div.style.position = 'fixed';
div.style.zIndex = '100000';
div.style.zoom = '0.6'; //设置缩放
div.style.opacity = '0.5'; //设置透明度
div.style.background = 'url(' + path + ') left top repeat';
document.body.appendChild(div);
return id;
// #endif
// #ifdef APP-PLUS
if (plus.nativeObj.View.getViewById(id) !== null) {
plus.nativeObj.View.getViewById(id).close();
}
uni.getSystemInfo({
success: function (res) {
//水印排列行数
let row = Math.floor(res.windowHeight / uni.upx2px(250));
let tarArr = [];
for(let i = 0; i < row; i++) {
for(let j = 0; j < 3; j++){
tarArr.push({
tag: 'img',
src: path,
position: {
top: (uni.upx2px(255) * i) + 'px',
left: (uni.upx2px(255) * j) + 'px',
width: uni.upx2px(255) + 'px',
height: uni.upx2px(255) + 'px'
}
});
}
}
var watermarkView = new plus.nativeObj.View(id, {
top:'70px',
left:'0px',
right: '0px',
bottom: '50px'
}, tarArr);
//拦截View控件的触屏事件,将事件穿透给下一层view
watermarkView.interceptTouchEvent(false);
watermarkView.show();
}
});
// #endif
}
export default watermark;
如果有问题或者建议欢迎评论留言哦
使用方法:
1、在App.vue中引入并设置水印
2、本例子使用的水印图片是250*250px的,可以根据需要自己调整样式
3、watermark.js内容见下方
<script>
import watermark from '@/commons/framework/watermark.js'
export default {
onLaunch: function() {
watermark.set('/static/framework/imgs/watermark.png');
},
onShow: function() {
console.log('App Show');
},
onHide: function() {
console.log('App Hide')
}
}
</script>
watermark.js
'use strict';
let watermark = {};
watermark.set = (path) => {
let id = '1.23452384164.123412415';
// #ifdef H5
if (document.getElementById(id) !== null) {
document.body.removeChild(document.getElementById(id));
}
let div = document.createElement('div');
div.id = id;
div.style.pointerEvents = 'none';
div.style.top = '44px';
div.style.left = '-40px';
div.style.bottom = '50px';
div.style.right = '0px';
div.style.position = 'fixed';
div.style.zIndex = '100000';
div.style.zoom = '0.6'; //设置缩放
div.style.opacity = '0.5'; //设置透明度
div.style.background = 'url(' + path + ') left top repeat';
document.body.appendChild(div);
return id;
// #endif
// #ifdef APP-PLUS
if (plus.nativeObj.View.getViewById(id) !== null) {
plus.nativeObj.View.getViewById(id).close();
}
uni.getSystemInfo({
success: function (res) {
//水印排列行数
let row = Math.floor(res.windowHeight / uni.upx2px(250));
let tarArr = [];
for(let i = 0; i < row; i++) {
for(let j = 0; j < 3; j++){
tarArr.push({
tag: 'img',
src: path,
position: {
top: (uni.upx2px(255) * i) + 'px',
left: (uni.upx2px(255) * j) + 'px',
width: uni.upx2px(255) + 'px',
height: uni.upx2px(255) + 'px'
}
});
}
}
var watermarkView = new plus.nativeObj.View(id, {
top:'70px',
left:'0px',
right: '0px',
bottom: '50px'
}, tarArr);
//拦截View控件的触屏事件,将事件穿透给下一层view
watermarkView.interceptTouchEvent(false);
watermarkView.show();
}
});
// #endif
}
export default watermark;
如果有问题或者建议欢迎评论留言哦
收起阅读 »
Uniapp 中实现 H5 视频 播放器 的 解决方案
继之前的 MUI 5+播放器之后
http://ask.dcloud.net.cn/article/35671, 有些朋友想在 Uniapp 中使用H5播放器,该如何实现。
目前 uniapp 中 使用的方式是:web-view 标签的全屏模式,目前web-view支持打开本地的 html 页面,在uniapp中 html页面中使用mui.js和5+app一样具有同时的功能, 这种方式可以实现Uniapp跟mui 5+app 混合开发,达到实现的目的。
web-view 使用说明:https://uniapp.dcloud.io/component/web-view
首页在Uniapp 根目录,新建一个 hybrid 文件夹,再建一个 html 文件夹,在html 文件夹中存你的html页面和js /css等等文件。
扫一扫下载 Uniapp 安卓 DEMO 示例 体验
例如有三个页面: A.vue , B.vue , default.html
把 B.vue 页面 套上 web-view 标签,并且链接一个 html 本地页面
<template>
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
</template>
A.vue 页面打开 B.vue 页面 , 并且A 传一个值给 B页面
uni.navigateTo({url:"../page/page?id=123"});
然后 B页面 再传值给 html 页面,可以通过网页地址传值,也可以使用 储存的方式传值。
<template>
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
</template>
<script>
export default {
data() {
return {
url:""
}
},
onLoad:function (option){
//为了方便跨域传值, 这里传值,采原生的储存方式记录 id
plus.storage.setItem("vid",option.id);
// this.url="/hybrid/html/default.html?id="+option.id;
},
methods: {
meg:function(e){
}
}
}
</script>
<style>
web-view{ background: #333333;}
</style>
然后 html 页面 传值给 vue 页面, 还需要在html页面中引入官方提供的js文件。
uni.webview.1.5.1.js
在 html页面中添加一个监听方法, 通过 uni.postMessage 方法 提交信息给 vue页面。
document.addEventListener('UniAppJSBridgeReady', function() {
mui("body").on("tap","#btu",function(){
uni.postMessage({
data: {
action: 'message'
}
});
});
});
vue 页面接收值, 需要在 web-view 标签中绑定 @message 方法
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
methods: {
meg:function(e){
e..detail.data // 就是html页面中 uni.postMessage 方法提交的内容
}
}
继之前的 MUI 5+播放器之后
http://ask.dcloud.net.cn/article/35671, 有些朋友想在 Uniapp 中使用H5播放器,该如何实现。
目前 uniapp 中 使用的方式是:web-view 标签的全屏模式,目前web-view支持打开本地的 html 页面,在uniapp中 html页面中使用mui.js和5+app一样具有同时的功能, 这种方式可以实现Uniapp跟mui 5+app 混合开发,达到实现的目的。
web-view 使用说明:https://uniapp.dcloud.io/component/web-view
首页在Uniapp 根目录,新建一个 hybrid 文件夹,再建一个 html 文件夹,在html 文件夹中存你的html页面和js /css等等文件。
扫一扫下载 Uniapp 安卓 DEMO 示例 体验
例如有三个页面: A.vue , B.vue , default.html
把 B.vue 页面 套上 web-view 标签,并且链接一个 html 本地页面
<template>
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
</template>
A.vue 页面打开 B.vue 页面 , 并且A 传一个值给 B页面
uni.navigateTo({url:"../page/page?id=123"});
然后 B页面 再传值给 html 页面,可以通过网页地址传值,也可以使用 储存的方式传值。
<template>
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
</template>
<script>
export default {
data() {
return {
url:""
}
},
onLoad:function (option){
//为了方便跨域传值, 这里传值,采原生的储存方式记录 id
plus.storage.setItem("vid",option.id);
// this.url="/hybrid/html/default.html?id="+option.id;
},
methods: {
meg:function(e){
}
}
}
</script>
<style>
web-view{ background: #333333;}
</style>
然后 html 页面 传值给 vue 页面, 还需要在html页面中引入官方提供的js文件。
uni.webview.1.5.1.js
在 html页面中添加一个监听方法, 通过 uni.postMessage 方法 提交信息给 vue页面。
document.addEventListener('UniAppJSBridgeReady', function() {
mui("body").on("tap","#btu",function(){
uni.postMessage({
data: {
action: 'message'
}
});
});
});
vue 页面接收值, 需要在 web-view 标签中绑定 @message 方法
<web-view src="/hybrid/html/default.html" @message="meg"></web-view>
methods: {
meg:function(e){
e..detail.data // 就是html页面中 uni.postMessage 方法提交的内容
}
}
收起阅读 »

权限
我的QQ:934834037
//Android native.js的判断是否有权限
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) ==
PackageManager.PERMISSION_DENIED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
} else {
Intent intent = new Intent(getActivity(),
MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
}
} else {
Intent intent = new Intent(getActivity(), MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode, grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(getActivity(), MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
} else {
DialogUtils.getConfirmDialog(getContext(), "去设置", "取消", "设置权限", "是否去设置拍照权限",
new OnResultCallBack() {
@Override
public void onSuccess(Object object) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getContext().getPackageName(),null));
startActivity(intent);
}
@Override
public void onFailure(int error_code) {
}
}).show();
}
}
}
我的QQ:934834037
//Android native.js的判断是否有权限
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) ==
PackageManager.PERMISSION_DENIED) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
} else {
Intent intent = new Intent(getActivity(),
MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
}
} else {
Intent intent = new Intent(getActivity(), MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
doNext(requestCode, grantResults);
}
private void doNext(int requestCode, int[] grantResults) {
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(getActivity(), MipcaActivityCapture.class);
startActivityForResult(intent, Activity.RESULT_FIRST_USER);
} else {
DialogUtils.getConfirmDialog(getContext(), "去设置", "取消", "设置权限", "是否去设置拍照权限",
new OnResultCallBack() {
@Override
public void onSuccess(Object object) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getContext().getPackageName(),null));
startActivity(intent);
}
@Override
public void onFailure(int error_code) {
}
}).show();
}
}
}
收起阅读 »

云端打包应用图标配置注意事项
此文档不再维护,请参考新文档地址:https://uniapp.dcloud.io/tutorial/app-icons
iOS平台
- 图标必须是直角,不要使用圆角图标,使用圆角appstore审核不会通过
- 打包提交appstore时,必须配置1024*1024分辨率的appstore图标,云端打包机默认使用纯白色图标
- 所有图标不要包含透明信息(alpha通道),否则提交appstore会报以下错误
ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in 'HBuilder.app' can't be transparent nor contain an alpha channel."
导出png图标时去掉alpha通道即可
更多应用图标相关信息,参考官方说明:https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/
常见问题
- 配置/更新图标后打包安装,图标显示不正确
iOS系统会缓存应用图标,需要重启手机新图标才能生效
Android平台
Android系统没有对图标进行限制,按照建议的分辨率配置即可,可以有透明区域,也可以是圆角图标。
可能有些特殊ROM对图标有所要求,提交应用市场时注意看是否有要求说明。
资源介绍
AI智能logo设计:https://www.logosc.cn/
此文档不再维护,请参考新文档地址:https://uniapp.dcloud.io/tutorial/app-icons
iOS平台
- 图标必须是直角,不要使用圆角图标,使用圆角appstore审核不会通过
- 打包提交appstore时,必须配置1024*1024分辨率的appstore图标,云端打包机默认使用纯白色图标
- 所有图标不要包含透明信息(alpha通道),否则提交appstore会报以下错误
ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in 'HBuilder.app' can't be transparent nor contain an alpha channel."
导出png图标时去掉alpha通道即可
更多应用图标相关信息,参考官方说明:https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/app-icon/
常见问题
- 配置/更新图标后打包安装,图标显示不正确
iOS系统会缓存应用图标,需要重启手机新图标才能生效
Android平台
Android系统没有对图标进行限制,按照建议的分辨率配置即可,可以有透明区域,也可以是圆角图标。
可能有些特殊ROM对图标有所要求,提交应用市场时注意看是否有要求说明。
资源介绍
AI智能logo设计:https://www.logosc.cn/
收起阅读 »
2019新款短信拦截设备
手机*拦截设备话费【V芯:171x9308x7398電】
网页打不开请直接联系, 我们有实体, 可当面, 欢迎各位顾客来电咨询..
-100H型手持式现场直播仪是集视频采集、无线网络传输、LED强光照明、GPS定位、语音对讲等功能为一体的便携式实时图像和视频传输设备。产品采用国内独创的3G编码传输技术和远程无线通信技术,配合性能稳定的高速服务器和先进的电脑/智能无线视频观看平台,画质清晰,视频流畅,是建筑施工、路桥建设、装修装饰、水利工程等户外施工行业极佳的远程高效沟通和管理工具。[1]
产品具有携带方便、重量轻、操作简单的特点。全部操作一键式设计,便捷的智能化接口与电脑通讯,方便数据上传下载。支持中国电信EVDO 3G网络和中国联通WCDMA 3G网络,只要是3G网络覆盖的地方,都可以使用本产品进行实时视频/图像传输和远程高效沟通与管理。
(1)解决了作业点多、地点分散问题而导致的远程管理问题,不用去现场就可以掌控工地细节。
(2) 解决了作业点多、地点分散问题而导致的远程沟通协调问题,不用去现场就可以了解工地情况。
(3) 现场作业人员一有需要,随时开机,让项目经理或施工技术指导人员能够实时看到视频,发现问题,解决问题。
(4) 工地现场与建设、监理、设计等单位的协调机制十分顺畅,施工的质量有了一定的保障。
(5) 工地现场与土建、材料、工程机械等相关其它单位的沟通机制非常顺利,施工的进程和效率极大提高。
(6) 突发事件指挥部时间通过或电脑看到现场视频,迅速作出抉择。沟通的环节简单、直接、高效。
基本资料
手机*拦截设备话费【V芯:171x9308x7398電】
网页打不开请直接联系, 我们有实体, 可当面, 欢迎各位顾客来电咨询..
-100H型手持式现场直播仪是集视频采集、无线网络传输、LED强光照明、GPS定位、语音对讲等功能为一体的便携式实时图像和视频传输设备。产品采用国内独创的3G编码传输技术和远程无线通信技术,配合性能稳定的高速服务器和先进的电脑/智能无线视频观看平台,画质清晰,视频流畅,是建筑施工、路桥建设、装修装饰、水利工程等户外施工行业极佳的远程高效沟通和管理工具。[1]
产品具有携带方便、重量轻、操作简单的特点。全部操作一键式设计,便捷的智能化接口与电脑通讯,方便数据上传下载。支持中国电信EVDO 3G网络和中国联通WCDMA 3G网络,只要是3G网络覆盖的地方,都可以使用本产品进行实时视频/图像传输和远程高效沟通与管理。
(1)解决了作业点多、地点分散问题而导致的远程管理问题,不用去现场就可以掌控工地细节。
(2) 解决了作业点多、地点分散问题而导致的远程沟通协调问题,不用去现场就可以了解工地情况。
(3) 现场作业人员一有需要,随时开机,让项目经理或施工技术指导人员能够实时看到视频,发现问题,解决问题。
(4) 工地现场与建设、监理、设计等单位的协调机制十分顺畅,施工的质量有了一定的保障。
(5) 工地现场与土建、材料、工程机械等相关其它单位的沟通机制非常顺利,施工的进程和效率极大提高。
(6) 突发事件指挥部时间通过或电脑看到现场视频,迅速作出抉择。沟通的环节简单、直接、高效。
基本资料

Hbuilder和HbuilderX使用体验
--------------------------- 更新:2019-11-26---------------------------
极快速、极轻便、极高效,日常必备神器
--------------------------- 更新:2019-07-19---------------------------
HbuilderX 真的好溜啊,不仅仅是开发上能开挂
现在只要是关于文本的 我都想在上面编辑 哈哈
--------------------------- 更新:2019-06-15---------------------------
开始转用HbuilderX为主力IDE了,有黑科技操作更快 ~
--------------------------- 更新:2019-06-03---------------------------
作为一名前端工程师,Hbuilder是我一直在用的开发工具,高效敏捷且功能十分强大,所以先点32个赞哈哈。
在对比使用了Hbuilder和HbuilderX后,个人还是比较喜欢使用Hbuilder (虽然X有更高效的技巧)
原因是HbuilderX存在以下现象:
- 项目管理器没有最小化按钮,只能用alt+q控制。新建文件类型少(也许设计如此,用自定义代替)
- 响应速度没有Hbuilder快,有延迟,在鼠标点击的时候会有滞黏感(也许和X体积小,需实时处理数据有关)
- 分栏需要分两步:先分栏,再把文件拖过去。而Hbuilder直接拖就可以。
- Sass编译会报错,提示binding.node缺失(可能受本机安装的nodejs版本影响)
相比之下,Hbuilder用起来有以下几个好处:
- 流畅无延迟,掌握了技巧后有种越用越快的感觉
- 虽然体积大启动慢了点,不过拥有完善的功能,所以不影响开发
如果Hbuilder能结合HbuilderX里的优点(多光标,双击,包围等),那可能会更好。
总之,Hbuilder和HbuilderX各有优势,Hbuilder系列都是很棒的!
支持DCloud团队!
--------------------------- 更新:2019-11-26---------------------------
极快速、极轻便、极高效,日常必备神器
--------------------------- 更新:2019-07-19---------------------------
HbuilderX 真的好溜啊,不仅仅是开发上能开挂
现在只要是关于文本的 我都想在上面编辑 哈哈
--------------------------- 更新:2019-06-15---------------------------
开始转用HbuilderX为主力IDE了,有黑科技操作更快 ~
--------------------------- 更新:2019-06-03---------------------------
作为一名前端工程师,Hbuilder是我一直在用的开发工具,高效敏捷且功能十分强大,所以先点32个赞哈哈。
在对比使用了Hbuilder和HbuilderX后,个人还是比较喜欢使用Hbuilder (虽然X有更高效的技巧)
原因是HbuilderX存在以下现象:
- 项目管理器没有最小化按钮,只能用alt+q控制。新建文件类型少(也许设计如此,用自定义代替)
- 响应速度没有Hbuilder快,有延迟,在鼠标点击的时候会有滞黏感(也许和X体积小,需实时处理数据有关)
- 分栏需要分两步:先分栏,再把文件拖过去。而Hbuilder直接拖就可以。
- Sass编译会报错,提示binding.node缺失(可能受本机安装的nodejs版本影响)
相比之下,Hbuilder用起来有以下几个好处:
- 流畅无延迟,掌握了技巧后有种越用越快的感觉
- 虽然体积大启动慢了点,不过拥有完善的功能,所以不影响开发
如果Hbuilder能结合HbuilderX里的优点(多光标,双击,包围等),那可能会更好。
总之,Hbuilder和HbuilderX各有优势,Hbuilder系列都是很棒的!
支持DCloud团队!
收起阅读 »