首页 文章 精选 留言 我的

精选列表

搜索[GPU适配],共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开发常用开源库 简书

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

Weex布局尺寸通用适配方案的研究

问题 weex为前端赋予了强大的跨端开发能力和较一致的良好的用户体验。weex一般是与native进行协作开发: 同app内不同页面用两者分别开发,统一串联 同页面两者协作开发,比如native提供组件,weex使用 由于native布局一般采用定高不定宽的方式,以求不同尺寸的屏幕可以得到基本一致的布局体验,然而weex布局采用基于750的等比例缩放,这种不一致导致的问题: 同一元素在不同屏幕的尺寸展现不一致,大屏手机尺寸偏大,小屏手机尺寸偏小 与native尺寸偏差较多 字号的差异也比较明显。 默认依据ip6尺寸布局,惨不忍睹的现场直击... 红框部分的滑动组件是native的,而背景容器是weex布局的,由于weex等比例缩放,而native使用pt,导致iphone 5s native组件溢出,而iphone 6p组件相比于容器过小。 下面是i

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册