当前位置: 首页 > news >正文

手机可以设计网站吗唐山模板建站系统

手机可以设计网站吗,唐山模板建站系统,wordpress区块链游戏,游戏网页游戏Android13适配所有文件管理权限 前言#xff1a; 很早之前在Android11上面就适配过所有文件管理权限#xff0c;这次是海外版升级到Android13#xff0c;由于选择相册用的是第三方库#xff0c;组内的同事没有上架Google的经验直接就提交代码#xff0c;虽然功能没有问题…Android13适配所有文件管理权限 前言 很早之前在Android11上面就适配过所有文件管理权限这次是海外版升级到Android13由于选择相册用的是第三方库组内的同事没有上架Google的经验直接就提交代码虽然功能没有问题但是上架的时候被打回了于是记录一下适配工作. 1.简介 绝大多数需要共享存储空间访问权限的应用都可以遵循共享媒体文件和共享非媒体文件方面的最佳做法。然而某些应用的核心用例需要广泛访问设备上的文件但无法采用注重隐私保护的存储最佳实践高效地访问这些文件。对于这些情况Android 提供了一种名为“所有文件访问权”的特殊应用访问权限。 例如防病毒应用的主要用例可能需要定期扫描不同目录中的许多文件。如果此扫描需要反复的用户交互让其使用系统文件选择器选择目录就会带来糟糕的用户体验。其他用例如文件管理器应用、备份和恢复应用以及文档管理应用也需要考虑类似情况。 2.Google Play通知: 此部分为在 Google Play 上发布应用的开发者提供通知。 为了限制对共享存储的广泛访问Google Play 商店已更新其政策用来评估以 Android 11API 级别 30或更高版本为目标平台且通过 MANAGE_EXTERNAL_STORAGE 权限请求“所有文件访问权”的应用。此政策自 2021 年 5 月起生效。 当应用以 Android 11 或更高版本为目标平台并声明了 MANAGE_EXTERNAL_STORAGE 权限时Android Studio 会显示图 1 中所示的 lint 警告。此警告会提醒您“Google Play 商店的一项政策限制了对该权限的使用”。 图 1. Android Studio 中的 Lint 警告提醒开发者有关 MANAGE_EXTERNAL_STORAGE 权限的 Google Play 政策。 仅当您的应用无法有效利用更有利于保护隐私的 API如存储访问框架或 Media Store API时您才能请求 MANAGE_EXTERNAL_STORAGE 权限。您的应用对该权限的使用必须在允许的使用情形范围内并且必须与应用的核心功能直接相关。如果您的应用包含与以下任一项类似的用例可能会请求 MANAGE_EXTERNAL_STORAGE 权限 文件管理器备份和恢复应用防病毒应用文档管理应用设备上的文件搜索磁盘和文件加密设备到设备数据迁移 3.选择相册图片 由于使用的是io.github.lucksiege:pictureselector这个库版本为v3.10.9 PictureSelector.create(this).openGallery(SelectMimeType.ofImage()).setImageEngine(GlideEngine.createGlideEngine()).forResult(object : OnResultCallbackListenerLocalMedia? {override fun onResult(result: ArrayListLocalMedia?) {LogUtils.d(返回的图片地址为, result[0]!!.path)Glide.with(thisMainActivity).load(result[0]?.path).into(ivBg)}override fun onCancel() {}})4.使用系统拍照 PictureSelector.create(this).openCamera(SelectMimeType.ofImage()).forResult(object : OnResultCallbackListenerLocalMedia? {override fun onResult(result: ArrayListLocalMedia?) {LogUtils.d(返回的图片地址为, result[0]!!.path)Glide.with(thisMainActivity).load(result[0]?.path).into(ivCamera)}override fun onCancel() {}})5.打开系统相册 private fun openPhotoAlbum() {val intent Intent(Intent.ACTION_GET_CONTENT)intent.addCategory(Intent.CATEGORY_OPENABLE)intent.type image/*//1.以startActivityForResult方式打开Activity /* startActivityForResult(Intent.createChooser(intent, File Browser), Constants.FILE_CHOOSER_RESULT_CODE)*///2.以launch方式打开相册photoLaunch.launch(image/*)}6.未适配前的效果如下 7.去掉本项目的所有文件管理权限 uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGEandroid:maxSdkVersion32 / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGEtools:ignoreScopedStorage android:maxSdkVersion32/8.去掉后权限后再次运行 还是提示申请所有文件管理权限去github查看图片库的版本发现新版本已经适配了Android13和所有文件管理权限于是更新一下图片库的依赖版本. dependencies {implementation(androidx.core:core-ktx:1.9.0)implementation(androidx.appcompat:appcompat:1.6.1)implementation(com.google.android.material:material:1.8.0)implementation(androidx.constraintlayout:constraintlayout:2.1.4)testImplementation(junit:junit:4.13.2)androidTestImplementation(androidx.test.ext:junit:1.1.5)androidTestImplementation(androidx.test.espresso:espresso-core:3.5.1)implementation(io.github.lucksiege:pictureselector:v3.11.1)implementation(com.github.bumptech.glide:glide:4.15.1)annotationProcessor(com.github.bumptech.glide:compiler:4.15.1)implementation(com.blankj:utilcodex:1.31.1) }9.新版本ImageEngine /*** 加载图片** param context 上下文* param url 资源url* param imageView 图片承载控件*/ Override public void loadImage(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).load(url).into(imageView); }Override public void loadImageBitmap(NonNull Context context, NonNull String url, int maxWidth, int maxHeight, OnCallbackListenerBitmap call) {}/*** 加载相册目录封面** param context 上下文* param url 图片路径* param imageView 承载图片ImageView*/ Override public void loadAlbumCover(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).asBitmap().load(url).override(180, 180).sizeMultiplier(0.5f).transform(new CenterCrop(), new RoundedCorners(8)).placeholder(R.drawable.ps_image_placeholder).into(imageView); }/*** 加载图片列表图片** param context 上下文* param url 图片路径* param imageView 承载图片ImageView*/ Override public void loadGridImage(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).load(url).override(200, 200).centerCrop().placeholder(R.drawable.ps_image_placeholder).into(imageView); }Override public void pauseRequests(Context context) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).pauseRequests(); }Override public void resumeRequests(Context context) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).resumeRequests(); }private MyImageGlideEngine() { }private static final class InstanceHolder {static final MyImageGlideEngine instance new MyImageGlideEngine(); }public static MyImageGlideEngine createGlideEngine() {return InstanceHolder.instance; }​ package com.example.allfilemanagerdemo.utils;import android.content.Context; import android.graphics.Bitmap; import android.widget.ImageView;import androidx.annotation.NonNull;import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.example.allfilemanagerdemo.R; import com.luck.picture.lib.engine.ImageEngine; import com.luck.picture.lib.interfaces.OnCallbackListener; import com.luck.picture.lib.utils.ActivityCompatHelper;/*** authorluck* date2019-11-13 17:02* describeGlide加载引擎*/ public class MyImageGlideEngine implements ImageEngine {/*** 加载图片** param context 上下文* param url 资源url* param imageView 图片承载控件*/Overridepublic void loadImage(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).load(url).into(imageView);}Overridepublic void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).load(url).override(maxWidth, maxHeight).into(imageView);}/*** 加载相册目录封面** param context 上下文* param url 图片路径* param imageView 承载图片ImageView*/Overridepublic void loadAlbumCover(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).asBitmap().load(url).override(180, 180).sizeMultiplier(0.5f).transform(new CenterCrop(), new RoundedCorners(8)).placeholder(R.drawable.ps_image_placeholder).into(imageView);}/*** 加载图片列表图片** param context 上下文* param url 图片路径* param imageView 承载图片ImageView*/Overridepublic void loadGridImage(Context context, String url, ImageView imageView) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).load(url).override(200, 200).centerCrop().placeholder(R.drawable.ps_image_placeholder).into(imageView);}Overridepublic void pauseRequests(Context context) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).pauseRequests();}Overridepublic void resumeRequests(Context context) {if (!ActivityCompatHelper.assertValidRequest(context)) {return;}Glide.with(context).resumeRequests();}private MyImageGlideEngine() {}private static final class InstanceHolder {static final MyImageGlideEngine instance new MyImageGlideEngine();}public static MyImageGlideEngine createGlideEngine() {return InstanceHolder.instance;} }10.Android13文件读写权限适配 private fun initPermission() {if (checkPermissions()) {takePhoto()} else {requestPermission()} }private fun requestPermission() {when {Build.VERSION.SDK_INT 33 - {ActivityCompat.requestPermissions(this,arrayOf(Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.READ_MEDIA_AUDIO,Manifest.permission.READ_MEDIA_VIDEO,Manifest.permission.CAMERA,),Constants.REQUEST_CODE_PERMISSIONS)}else - {ActivityCompat.requestPermissions(this,REQUIRED_PERMISSIONS,Constants.REQUEST_CODE_PERMISSIONS)}} }private fun checkPermissions(): Boolean {when {Build.VERSION.SDK_INT 33 - {val permissions arrayOf(Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.READ_MEDIA_AUDIO,Manifest.permission.READ_MEDIA_VIDEO,Manifest.permission.CAMERA,)for (permission in permissions) {return Environment.isExternalStorageManager()}}else - {for (permission in REQUIRED_PERMISSIONS) {if (ContextCompat.checkSelfPermission(this,permission) ! PackageManager.PERMISSION_GRANTED) {return false}}}}return true }override fun onRequestPermissionsResult(requestCode: Int, permissions: ArrayString, grantResults:IntArray ) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when (requestCode) {Constants.REQUEST_CODE_PERMISSIONS - {var allPermissionsGranted truefor (result in grantResults) {if (result ! PackageManager.PERMISSION_GRANTED) {allPermissionsGranted falsebreak}}when {allPermissionsGranted - {// 权限已授予执行文件读写操作takePhoto()}else - {// 权限被拒绝处理权限请求失败的情况ToastUtils.showShort(请您打开必要权限)requestPermission()}}}} }11.打开相册 这里有两种方式 11.1 以startActivityForResult方式打开 private fun openPhotoAlbum() {val intent Intent(Intent.ACTION_GET_CONTENT)intent.addCategory(Intent.CATEGORY_OPENABLE)intent.type image/*//以startActivityForResult方式打开ActivitystartActivityForResult(Intent.createChooser(intent, File Browser), Constants.FILE_CHOOSER_RESULT_CODE)}11.2 以launch方式打开 private fun openPhotoAlbum() {//以launch方式打开相册photoLaunch.launch(image/*) }12.打开相册结果回调: 12.1 startActivityResult方式结果回调 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (resultCode ! RESULT_OK) {return}when (requestCode) {Constants.FILE_CHOOSER_RESULT_CODE - {if (data?.data null) {return}val imgStr: String getImageAbsolutePath(this, data.data).toString()if (!TextUtils.isEmpty(imgStr)) {val imgUri: Uri? FileUtils.getUriFromPath(imgStr, application)if (imgUri ! null) {Glide.with(thisMainActivity).load(imgUri.toString()).into(ivPhoto)}}}}} }12.2 launch方式结果回调 private val photoLaunch registerForActivityResult(ActivityResultContracts.GetContent()) { uri -Glide.with(thisMainActivity).load(uri.toString()).into(ivPhoto) }13.实现的效果如下 14.项目源码如下 https://gitee.com/jackning_admin/all-file-manager-demo
http://www.sadfv.cn/news/116300/

相关文章:

  • 优秀企业建站wordpress中文 插件下载
  • seo网站关键词排名优化商城网站制作
  • 湖南网站建设制作公司网站建设开发简介
  • 网站风格定位微站和网站数据
  • 网站免费制作平台wordpress产品页
  • asp.net 4.0网站开发实例教程自己做网站还能挣钱吗
  • 建设通相似的网站搭建什么平台如何表达
  • 郑州营销型网站设计运营信息推广网站点不开的那种怎么做
  • 山东省建设监理协会官方网站链接网站某一页面如何做
  • 企业官网建站的流程传媒公司vi
  • 济南网站建设行知kejiwordpress 产品展示
  • 洛阳网站建设价格低网站做二维码
  • 建立网站专业公司吗医疗营销网站建设
  • 合肥网站优化排名推广喀什建设网站
  • 网站建设服务合同协议前端网站建设插件
  • 安徽休宁建设厅网站长沙大的建网站公司
  • 网站开发定价wordpress 首页动画
  • 俄华网站建设网站域名自动跳转
  • 网页设计比较好的网站怎么看网站发的外链
  • 凯发网站app代理推广平台
  • 外贸网站收到询盘六安火车站网站
  • 那个网站建设网站被做站公司贩卖
  • 优化站点公司以前做的免费网站太多_新网站搜索不到
  • 域名 做网站和邮箱久久建筑服务网
  • 河北省建设执业资格注册管理中心网站称心的赣州网站建设
  • 个人网站可以做音乐下载网网站设计培训机构
  • 长沙自动化网站建设dw做网站地图
  • 阿里巴巴做网站么效果好企业营销型网站建设开发
  • 建一个网站需要什么潍坊医院网站建设
  • 网站建设项目规划书案例网站建设需要哪些企业资料