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

沌口网站建设网站计数代码

沌口网站建设,网站计数代码,建设南大街小学网站,怎么建立网站的步骤Android Api 29 对文件和文件夹进行了重大更改。不允许使用外部存储,如下方法: Environment.getExternalStorageDirectory() /mnt/sdcard Environment.getExternalStoragePublicDirectory(“test”) /mnt/sdcard/test 只能使用内部存储 getExterna…

Android Api 29 对文件和文件夹进行了重大更改。不允许使用外部存储,如下方法:

Environment.getExternalStorageDirectory() = /mnt/sdcard  
Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test

只能使用内部存储

getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test
getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files

但谷歌官方给了一个后门,在AndroidManifest.xml文件中application节点中加上android:requestLegacyExternalStorage="true"属性才可以访问沙盒路径下的数据

原来的项目就要重新适配

Android开发:filePath放在哪个文件夹

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache  
外部存储
Environment.getExternalStorageDirectory() = /mnt/sdcard  
Environment.getExternalStoragePublicDirectory(“test”) = /mnt/sdcard/test
Environment.getRootDirectory() = /system
getPackageCodePath() = /data/app/com.my.app-1.apk
getPackageResourcePath() = /data/app/com.my.app-1.apk
getCacheDir() = /data/data/com.my.app/cache
getDatabasePath(“test”) = /data/data/com.my.app/databases/test
getDir(“test”, Context.MODE_PRIVATE) = /data/data/com.my.app/app_test
getExternalCacheDir() = /mnt/sdcard/Android/data/com.my.app/cache
应用内部存储
getExternalFilesDir(“test”) = /mnt/sdcard/Android/data/com.my.app/files/test
getExternalFilesDir(null) = /mnt/sdcard/Android/data/com.my.app/files
getFilesDir() = /data/data/com.my.app/files

参考文章:

安卓Enviroment类的详解-CSDN博客

权限申请

11以上添加如下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

代码动态申请

public final class PermissionActivity extends AppCompatActivity {private static final int REQUEST_CODE = 1024;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestPermission();}private void requestPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {// 先判断有没有权限if (Environment.isExternalStorageManager()) {writeFile();} else {Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + context.getPackageName()));startActivityForResult(intent, REQUEST_CODE);}} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 先判断有没有权限if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);}} else {writeFile();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == REQUEST_CODE) {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {writeFile();} else {ToastUtils.show("存储权限获取失败");}}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (Environment.isExternalStorageManager()) {writeFile();} else {ToastUtils.show("存储权限获取失败");}}}/*** 模拟文件写入*/private void writeFile() {ToastUtils.show("写入文件成功");}
}

动态申请代码三方框架XXPermissions

XXPermissions.with(this)// 不适配 Android 11 可以这样写//.permission(Permission.Group.STORAGE)// 适配 Android 11 需要这样写,这里无需再写 Permission.Group.STORAGE.permission(Permission.MANAGE_EXTERNAL_STORAGE).request(new OnPermissionCallback() {@Overridepublic void onGranted(List<String> permissions, boolean all) {if (all) {toast("获取存储权限成功");}}@Overridepublic void onDenied(List<String> permissions, boolean never) {if (never) {toast("被永久拒绝授权,请手动授予存储权限");// 如果是被永久拒绝就跳转到应用权限系统设置页面XXPermissions.startPermissionActivity(MainActivity.this, permissions);} else {toast("获取存储权限失败");}}});

项目地址:GitHub - getActivity/XXPermissions: Android 权限请求框架,已适配 Android 14

 // JitPack 远程仓库:https://jitpack.iomaven { url 'https://jitpack.io' }
   // 权限请求框架:https://github.com/getActivity/XXPermissionsimplementation 'com.github.getActivity:XXPermissions:18.5

# 表示将第三方库迁移到 AndroidX
android.enableJetifier = true

<manifest>

    <application>

        <!-- 告知 XXPermissions 当前项目已经适配了分区存储特性 -->
        <meta-data
            android:name="ScopedStorage"
            android:value="true" />

    </application>

</manifest>

框架扩展

XXPermissions.with(this)// 申请单个权限.permission(Permission.RECORD_AUDIO)// 申请多个权限.permission(Permission.Group.CALENDAR)// 设置权限请求拦截器(局部设置)//.interceptor(new PermissionInterceptor())// 设置不触发错误检测机制(局部设置)//.unchecked().request(new OnPermissionCallback() {@Overridepublic void onGranted(@NonNull List<String> permissions, boolean allGranted) {if (!allGranted) {toast("获取部分权限成功,但部分权限未正常授予");return;}toast("获取录音和日历权限成功");}@Overridepublic void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {if (doNotAskAgain) {toast("被永久拒绝授权,请手动授予录音和日历权限");// 如果是被永久拒绝就跳转到应用权限系统设置页面XXPermissions.startPermissionActivity(context, permissions);} else {toast("获取录音和日历权限失败");}}});

其他API介绍

// 判断一个或多个权限是否全部授予了
XXPermissions.isGranted(Context context, String... permissions);// 获取没有授予的权限
XXPermissions.getDenied(Context context, String... permissions);// 判断某个权限是否为特殊权限
XXPermissions.isSpecial(String permission);// 判断一个或多个权限是否被勾选了《不再询问》的选项(一定要在权限申请的回调方法中调用才有效果)
XXPermissions.isDoNotAskAgainPermissions(Activity activity, String... permissions);// 跳转到应用权限设置页
XXPermissions.startPermissionActivity(Context context, String... permissions);
XXPermissions.startPermissionActivity(Activity activity, String... permissions);
XXPermissions.startPermissionActivity(Activity activity, String... permission, OnPermissionPageCallback callback);
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions);
XXPermissions.startPermissionActivity(Fragment fragment, String... permissions, OnPermissionPageCallback callback);// 设置不触发错误检测机制(全局设置)
XXPermissions.setCheckMode(false);
// 设置权限申请拦截器(全局设置)
XXPermissions.setInterceptor(new IPermissionInterceptor() {});

http://www.yayakq.cn/news/264485/

相关文章:

  • 网站正在建设中 html源码绵阳住房和城乡建设局网站
  • 郑州建设网站公司大型网站开发实战
  • 简单的企业网站泗阳做网站
  • 建立自己的网站步骤网站开发团队组成
  • 两个网站开发swot分析下载百度地图2022最新版
  • 为什么做的网站别的浏览器打不开怎么办海南汽车网站建设
  • 网站之家四团网站建设
  • 福州志愿者官方网站怎么做做网站装什么服务器
  • 婚庆网站有哪些全球最大的外贸平台
  • 优书网有官方app吗优化大师
  • 网站建设销售顾问开场白西安seo天勤网络营销
  • 百合怎么doi怎么做网站建设什么网站好
  • 重庆网站搭建方案宁波市铁路建设指挥部网站
  • w网站怎么做常用于做网站的软件
  • 网站运营专员具体每天怎么做建设网站那家公司好
  • 该如何建设和优化一个网站网站建设推广合同
  • 提高网站知名度网站域名备案查询官网
  • 手机网站前端开发布局技巧北京建站推广
  • 南宁快速网站建设电话网站制作排名
  • excel网站链接怎么做南宁建站服务公司
  • 保山市住房和城乡建设局门户网站图片设计素材
  • 山西龙采网站建设合同住房和城乡建设部的叉车证能用吗
  • 做网站需要了解哪些知识建筑工程劳务信息平台
  • 广州市网站建设在哪里wordpress先登录再访问
  • 中国石油工程建设有限公司网站天津建设工程信息网几点更新
  • 二手手机回收网站开发企业建立网站
  • 电商网站怎样做优化才最合理桂林哪里可以做网站
  • 传奇广告查询网站网站建设的基础服务
  • 云南网站设计多少钱百度快速收录软件
  • 普达建站快车永康企业网站建设公司