安卓10.0文件操作

2024-06-22 13:38
文章标签 操作 安卓 10.0

本文主要是介绍安卓10.0文件操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/**
 *
 * app文件分为专属文件和独立文件;
 * 手机存储分内部存储(手机存储,如4G,8G内存) 和外部存储(SD拓展卡,如64G,128G)
 * 专属文件是那些只有该app才可以使用的文件,例如数据库,sharedpreference,专属格式的电子书等;专属文件可存于内部和外部存储;专属文件会随APP卸载而删除.
 * 独立文件是那些不依赖于某特定app的文件,例如照片,视频,apk等;独立文件可存于内部和外部存储;独立文件不应该随APP卸载而卸载.
 *
 * 在安卓10.0之后不建议使用Environment.getExternalStorageDirectory()方法1,推荐使用context.getExternalFilesDir()方法2;
 * 10.0后方法1能访问,但是无法创建自定义的文件夹;方法2创建的文件夹都是在/storage/emulated/0/Android/data/packageName/files下,会随应用卸载被删除;
 * 想要在外部存储创建自定义文件夹就只能把targetSDK设置到28及以下,并使用方法1获取目录并创建自定义文件夹.
 *
 * 此方法测试时,targetSDK=27
 */
private void testDirector() {
    final String privilegePath1 = Utils.getContext().getFilesDir().getAbsolutePath();
    final String privilegePath2 = Utils.getContext().getExternalFilesDir(null).getAbsolutePath();
    final String privilegePath3 = Utils.getContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
    final String privilegePath4 = Utils.getContext().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();

    final String privilegePath5 = Environment.getExternalStorageState();
    final String privilegePath6 = Environment.getRootDirectory().getAbsolutePath();
    final String privilegePath7 = Environment.getDataDirectory().getAbsolutePath();
    final String privilegePath8 = Environment.getDownloadCacheDirectory().getAbsolutePath();
    final String privilegePath9 = Environment.getStorageDirectory().getAbsolutePath();

    final String privilegePath10 = Environment.getExternalStorageDirectory().getAbsolutePath();
    final String privilegePath11 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
    final String privilegePath12 = Environment.getStorageState(null);

    LogUtil.logInfo("aaa",
            "path1=" + privilegePath1 + ";" +
                    "path2=" + privilegePath2 + ";" +
                    "path3=" + privilegePath3 + ";" +
                    "path4=" + privilegePath4 + ";" +
                    "path5=" + privilegePath5 + ";" +
                    "path6=" + privilegePath6 + ";" +
                    "path7=" + privilegePath7 + ";" +
                    "path8=" + privilegePath8 + ";" +
                    "path9=" + privilegePath9 + ";" +
                    "path10=" + privilegePath10 + ";" +
                    "path11=" + privilegePath11 + ";" +
                    "path12=" + privilegePath12 + ";" +
                    "pathAppCache=" + Constant.APP_CACHE_ROOT_PATH);
    /**
     * 打印结果
     * path1=/data/user/0/com.yuwj.modulepatternjwt/files;
     * path2=/storage/emulated/0/Android/data/com.yuwj.modulepatternjwt/files;
     * path3=/storage/emulated/0/Android/data/com.yuwj.modulepatternjwt/files/Download;
     * path5=mounted;
     * path6=/system;
     * path7=/data;
     * path8=/data/cache;
     * path9=/storage;
     * path10=/storage/emulated/0;
     * path12=unknown;
     * pathAppCache=/data/user/0/com.yuwj.modulepatternjwt/files/ModulePatternJWT/
     */
}


==================================================    
==================================================    
==================================================
 /**
     * fileprovider的使用方法,参见https://www.jianshu.com/p/bce6a4c779dd
     * 1. 在manifest的application中定义provider
     * 2. 创建对应的xml/filepath.xml文件,编辑内容
     * 3. 在读取文件时,需要将文件的绝对路径转化为FileProvider提供的URI.
     * 4. filepath.xml说明
     * <root-path/> 代表设备的根目录new File("/");
     * <files-path/> 代表context.getFilesDir()
     * <cache-path/> 代表context.getCacheDir()
     * <external-path/> 代表Environment.getExternalStorageDirectory()
     * <external-files-path>代表context.getExternalFilesDirs()
     * <external-cache-path>代表getExternalCacheDirs()
     * path表示相对于<external-files-path>的子目录
     * name表示将代替<external-files-path>+path对应的目录,使调用者不清楚实际文件路径
     */
    
    
    
    <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepath" />
        </provider>
        
        ============================1=============================
        
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-files-path
            name="files"
            path="" />
    </paths>
</resources>

        ============================2=============================
        
        public static void installApk(Context context, String apkPath) {
        File file = new File(apkPath);
        boolean i = file.exists();
        if(Build.VERSION.SDK_INT>=24) {//判读版本是否在7.0以上
            //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
            Uri apkUri = FileProvider.getUriForFile(context, context.getPackageName()+".provider", file);//在AndroidManifest中的android:authorities值
            Intent install = new Intent(Intent.ACTION_VIEW);
            // 由于没有在Activity环境下启动Activity,设置下面的标签
            install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            install.setDataAndType(apkUri, "application/vnd.android.package-archive");
            context.startActivity(install);
        } else{
            Intent install = new Intent(Intent.ACTION_VIEW);
            install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(install);
        }
    }
    ============================3=============================
 

这篇关于安卓10.0文件操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084447

相关文章

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示