首页 文章 精选 留言 我的

精选列表

搜索[移动端适配],共10000篇文章
优秀的个人博客,低调大师

Android 几行代码解决6.0以上权限适配问题

GitHub APK 将libray模块复制到项目中,或者直接在build.gradle中依赖: allprojects { repositories { maven { url 'https://jitpack.io' } } } dependencies { compile 'com.github.AnJiaoDe:Permission:V1.0.0' } 注意:如果sync报错,是因为和com.android.tools.build:gradle 3.0有关,可以改将compile改为implementation 或者api Android 6.0以上,危险权限必须经过动态请求,危险权限分组图 1.全部允许 2.拒绝 3.拒绝 4.用户拒绝并且选中了不再询问,弹窗让用户去授权 5.用户同意了授权,闲的难受去关闭了授权 使用方法: public class MainActivity extends PermissionActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { checkPermissionCAMERA(new OnPermissionRequestListener() { @Override public void onPermissionHave() { showToast("用户同意了相机权限"); checkPermissionWRITE_EXTERNAL_STORAGE(new OnPermissionRequestListener() { @Override public void onPermissionHave() { showToast("用户同意了存储权限,可以执行拍照操作了"); } @Override public void onPermissionRefuse() { showToast("用户拒绝了存储权限"); } @Override public void onPermissionRefuseNoAsk() { showToast("用户拒绝了存储权限并且选中了不再询问"); } }); } @Override public void onPermissionRefuse() { showToast("用户拒绝了相机权限"); } @Override public void onPermissionRefuseNoAsk() { showToast("用户拒绝了相机权限并且选中了不再询问"); } }); } }); //或者 // checkPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, // "存储权限已被禁用","拍照功能必须打开存储权限,否则无法使用", new OnPermissionRequestListener() { // // @Override // public void onPermissionHave() { // // showToast("用户同意了存储权限"); // // // } // // @Override // public void onPermissionRefuse() { // showToast("用户拒绝了存储权限"); // // } // // @Override // public void onPermissionRefuseNoAsk() { // showToast("用户拒绝了存储权限并且选中了不再询问"); // // } // }); } @Override public void onClick(View v) { } } 源码: public abstract class PermissionActivity extends AppCompatActivity implements View.OnClickListener { private String toast_perm_refuse,dialog_perm_refuse_noask; private OnPermissionRequestListener onPermissionHaveListener; public <T extends View> T getViewByID(@IdRes int id) { return (T) findViewById(id); } //?????????????????????????????????????????????????????????????????????? public String nullToString(Object object) { return object == null ? "" : object.toString(); } //?????????????????????????????????????????????????????????????????????? public void showToast(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } public void showToast(int string_id) { Toast.makeText(this, getResources().getString(string_id), Toast.LENGTH_SHORT).show(); } public void startAppcompatActivity(Class<?> cls) { startActivity(new Intent(this, cls)); } /* 6.0权限检查存储权限 */ public void checkPermissionWRITE_EXTERNAL_STORAGE( OnPermissionRequestListener onPermissionHaveListener) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); this.toast_perm_refuse = "存储权限已被禁用"; this.dialog_perm_refuse_noask="存储权限被禁用,您将无法使用相机、相册、图片下载等功能"; this.onPermissionHaveListener = onPermissionHaveListener; } /* 6.0权限检查相机权限 */ public void checkPermissionCAMERA( OnPermissionRequestListener onPermissionHaveListener) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1); this.toast_perm_refuse = "相机权限已被禁用"; this.dialog_perm_refuse_noask="相机权限被禁用,您将无法使用相机进行拍照"; this.onPermissionHaveListener = onPermissionHaveListener; } /* 6.0权限检查 */ public void checkPermission(String[] permission, String toast_perm_refuse,String dialog_perm_refuse_noask, OnPermissionRequestListener onPermissionHaveListener) { ActivityCompat.requestPermissions(this, permission, 1); this.toast_perm_refuse = toast_perm_refuse; this.dialog_perm_refuse_noask=dialog_perm_refuse_noask; this.onPermissionHaveListener = onPermissionHaveListener; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); for (int i = 0; i < permissions.length; i++) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { if (onPermissionHaveListener != null) { onPermissionHaveListener.onPermissionHave(); } continue; } if (grantResults[i] == PackageManager.PERMISSION_DENIED) { //在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则 // 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { if (onPermissionHaveListener != null) { onPermissionHaveListener.onPermissionRefuseNoAsk(); } //解释原因,并且引导用户至设置页手动授权 new AlertDialog.Builder(this) .setMessage(dialog_perm_refuse_noask) .setPositiveButton("去授权", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户至设置页手动授权 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); intent.setData(uri); startActivity(intent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //引导用户手动授权,权限请求失败 } }).show(); } else { //权限请求失败,但未选中“不再提示”选项 showToast(toast_perm_refuse); if (onPermissionHaveListener != null) { onPermissionHaveListener.onPermissionRefuse(); } } break; } } } public interface OnPermissionRequestListener { public void onPermissionHave(); public void onPermissionRefuse(); public void onPermissionRefuseNoAsk(); } } GitHub 关注专题Android开发常用开源库 简书

优秀的个人博客,低调大师

语音识别端到端模型解读:FSMN及其变体模型

摘要:在很长一段时间内,语音识别领域最常用的模型是GMM-HMM。但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型。 一、概述 在很长一段时间内,语音识别领域最常用的模型是GMM-HMM。但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型。在各种神经网络类型中,RNN因其能捕捉序列数据的前后依赖信息而在声学模型中被广泛采用。用得最多的RNN模型包括LSTM、GRU等。但RNN在每一个时刻的计算都需要上一个时刻的输出作为输入,因此只能串行计算,速度很慢。 除此之外,相比于FNN等网络结构,RNN的训练易受梯度消失的影响,收敛得更慢,且需要更多的计算资源。前馈序列记忆神经网络(Feedforward Sequential Memory Networks, FSMN)[1][2]的提出,就是为了既能保留RNN对序列前后依赖关系的建模能力,又能加快模型的计算速度,降低计算复杂度。而之后提出的cFSMN[3]、DFSMN[4]和Pyramidal FSMN[5],都是在FSMN的基础上,进一步做出了改进和优化。FSMN、cFSMN和DFSMN都是中科大张仕良博士的工作,Pyramidal FSMN则是云从科技在2018年刷榜Librispeech数据集时提出的模型。 二、FSMN 图1. FSMN模型结构 FSMN从本质上来说是一个前馈全连接网络(FNN),创新之处在于其隐藏层中增加了一个记忆模块(memory block)。记忆模块的作用是把每个隐藏状态的前后单元一并编码进来,从而实现对序列前后关系的捕捉。具体的计算流程如下:假设输入序列为,其中表示t时刻的输入数据,记对应的第层隐藏层状态为,则记忆模块的输出为: 其中,表示逐元素相乘,是需要学习的系数参数。这是单向的FSMN,因为只考虑了t时刻过去的信息,若要考虑未来的信息,只需把t时刻之后的隐藏状态也用同样的方式进行添加,双向FSMN的计算公式如下: 其中,表示考虑过去信息的阶数,表示考虑未来信息的阶数。记忆模块的输出可以视作t时刻的上下文的信息,与t时刻的隐藏层输出一起送入下一隐藏层。下一隐藏层的计算方式为: FSMN也可以与注意力机制相结合,此时记忆模块的参数以及输出的计算方式为: 三、cFSMN 图2. cFSMN模型结构 为了进一步简化模型,压缩模型大小,提高训练和推理速度,cFSMN对FSMN主要做了两个改进: 通过对权重矩阵进行低秩矩阵分解,将隐藏层拆成两层; 在cFSMN层的计算中进行降维操作,并只把记忆模块的输出送入下一层,当前帧的隐藏状态不再直接送入下一层。 cFSMN层的具体计算步骤为:通过一个低秩线性变换将上一层的输出进行降维,得到的低维向量输入记忆模块,记忆模块的计算类似于FSMN,只是多加一个当前帧的低维向量来引入对齐信息。最后把记忆模块的输出进行一次仿射变换和一次非线性变换,作为当前层的输出。参照图2,每个步骤的计算公式如下: 在Switchboard任务上,cFSMN可以在错误率低于FSMN的同时,模型大小缩减至FSMN模型的三分之一。 四、DFSMN 图3. DFSMN模型结构 顾名思义,DeepFSMN (DFSMN)的目的是希望构建一个更深的cFSMN网络结构。但通过直接堆叠cFSMN层很容易在训练时遇到梯度消失的情况,受残差网络(Residual Network)和高速网络(Highway Network)的启发,DFSMN在不同层的记忆模块之间添加了skip connection。同时,由于语音信号的相邻帧之间存在重叠和信息冗余,DFSMN仿照空洞卷积在记忆模块中引入了步幅因子(stride factor)。参照图3,第层记忆模块的计算方式为: 其中,表示skip connection操作,论文中选择的是恒等映射(identity mapping)。和分别是记忆模块在处理过去信息和未来信息时使用的步幅大小。 四、Pyramidal FSMN Pyramidal FSMN(pFSMN)认为之前的FSMN系列模型的一个缺点是,底层和顶层的网络层都会去提取长期上下文信息,这就造成了重复操作。pFSMN提出了金字塔型的记忆模块,越深的网络层提取越高级的特征,即底层网络层提取音素信息,而顶层网络层提取语义信息和句法信息。这种金字塔结构可以同时提高精度、减少模型参数量。pFSMN减少了DSFMN中使用的skip connection的数量,只在记忆模块的维度发生变化时才进行skip connection操作。记忆模块的计算方式为: 除了引入金字塔结构,pFSMN的另外两个改进是: 借鉴图像处理的方法,在FSMN层之前加入一个6层Residual CNN模块,用于提取更为鲁棒的语音特征,并通过降采样减少特征维度。 采用交叉熵损失(CE loss)和LF-MMI损失的加权平均来作为模型训练时使用的损失函数。引入CE loss的原因是训练序列数据时很容易出现过拟合的情况,CE loss相当于起到一个正则化的效果。 图4. Pyramidal FSMN模型结构 参考文献: [1] Zhang S, Jiang H, Wei S, et al. Feedforward sequential memory neural networks without recurrent feedback[J]. arXiv preprint arXiv:1510.02693, 2015. [2] Zhang S, Liu C, Jiang H, et al. Feedforward sequential memory networks: A new structure to learn long-term dependency[J]. arXiv preprint arXiv:1512.08301, 2015. [3] Zhang S, Jiang H, Xiong S, et al. Compact Feedforward Sequential Memory Networks for Large Vocabulary Continuous Speech Recognition[C]//Interspeech. 2016: 3389-3393. [4] Zhang S, Lei M, Yan Z, et al. Deep-fsmn for large vocabulary continuous speech recognition[C]//2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2018: 5869-5873. [5] Yang X, Li J, Zhou X. A novel pyramidal-FSMN architecture with lattice-free MMI for speech recognition[J]. arXiv preprint arXiv:1810.11352, 2018. 点击关注,第一时间了解华为云新鲜技术~

优秀的个人博客,低调大师

js判断是否是pc端打开还是手机端打开

根据浏览器头判断是使用神马设备打开的网页 <script type="text/javascript"> function is_mobile() { var regex_match = /(nokia|iphone|android|motorola|^mot-|softbank|foma|docomo|kddi|up.browser|up.link|htc|dopod|blazer|netfront|helio|hosin|huawei|novarra|CoolPad|webos|techfaith|palmsource|blackberry|alcatel|amoi|ktouch|nexian|samsung|^sam-|s[cg]h|^lge|ericsson|philips|sagem|wellcom|bunjalloo|maui|symbian|smartphone|midp|wap|phone|windows ce|iemobile|^spice|^bird|^zte-|longcos|pantech|gionee|^sie-|portalmmm|jigs browser|hiptop|^benq|haier|^lct|operas*mobi|opera*mini|320x320|240x320|176x220)/i; var u = navigator.userAgent; if (null == u) { return true; } var result = regex_match.exec(u); if (null == result) { return false } else { return true } } if (is_mobile()) { document.location.href = 'https://www.baidu.com/'; }else { document.location.href = 'https://www.baidu.com/'; } </script> 欢迎访问我的个人博客–付博瀚的个人博客

优秀的个人博客,低调大师

端到端构建VPC网络,安全组和ECS资源

序言 在之前的博客中,通过资源编排创建一个ECS实例和利用资源编排创建100台ECS实例并指定自动释放时间,都介绍了怎样快速、方便的创建阿里云 ECS 实例。但是它们都是依赖于您已经在阿里云创建了一些资源,比如,安全组、镜像、VPC,甚至是 ECS实例。本文的重点是,如何通过资源编排服务,来创建ECS实例及其关联资源。 正如通过资源编排创建一个ECS实例文中介绍,创建ECS实例,有几个必选属性: SecurityGroupId: 安全组Id InstanceType: 实例规格, 参考ROS控制台的 关键帮助 -> ECS实例规格 ImageId: 镜像Id, 参考ROS控制台的 关键帮助 -> ECS镜像 VpcId: 当前实例所属的VPC VSwitchId: 当前实例所属的VSwitchId 其中,涉及 SecurityGrou

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册