You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android技术问询:如何在内部/外部存储中私密隐藏音视频PDF文件?

Hey Rakesh, 看来你已经踩过.前缀文件夹的坑了——确实,那种“伪隐藏”太容易被戳破,别说ES文件管理器开个开关就能看到,连电脑连MTP都能直接扒出来。我给你几个真正能满足需求的方案,从简单到硬核,你根据自己的场景选:

方案1:应用专属内部存储目录(最省心的系统级隔离)

Android 本身就给每个应用分配了仅自身可访问的内部存储目录,用getFilesDir()getCacheDir()就能拿到。这个目录的权限是系统锁死的:

  • 其他应用哪怕有存储权限也读不到
  • 电脑通过MTP连接设备时,完全看不到这个目录
  • 卸载应用时会自动清空,不用手动清理

代码示例(Java):

// 获取应用内部私有根目录
File privateRoot = getFilesDir();
// 创建子目录专门存你的隐藏文件
File hiddenMediaDir = new File(privateRoot, "my_secret_files");
if (!hiddenMediaDir.exists()) {
    hiddenMediaDir.mkdirs(); // 创建多级目录
}
// 后续把视频/音频/PDF直接保存到hiddenMediaDir下即可

优点:零额外配置,系统原生保护,完全符合你的需求;
缺点:内部存储空间通常比外部SD卡小,适合存储小体积文件,大文件建议看下面的方案。

方案2:Android 10+ 外部存储私有目录(兼顾空间与安全)

从Android 10开始引入的Scoped Storage,给应用在外部存储也分配了专属私有目录,通过getExternalFilesDir()获取。这个目录的特性:

  • 其他应用无访问权限(哪怕有存储权限也不行)
  • 电脑MTP默认不显示该目录(除非用户刻意去深扒路径,基本没人会这么做)
  • 空间比内部存储大,适合存大体积视频/音频

代码示例(Kotlin):

// 获取外部存储中专门存视频的私有目录(也可以用DIRECTORY_DOCUMENTS存PDF)
val externalPrivateDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES)
// 创建子目录存隐藏文件
val secretDir = File(externalPrivateDir, "hidden_content")
if (!secretDir.exists()) {
    secretDir.mkdirs()
}

注意:Android 9及以下版本,这个外部私有目录其他应用是能看到的,所以低版本适配建议结合方案3。

方案3:文件内容加密(终极安全方案,适配全版本)

如果你的文件涉及敏感内容,或者需要兼容Android 9及以下的外部存储场景,直接加密文件内容是最稳妥的选择。不管文件存在哪里,其他应用拿到的都是乱码,只有你的应用解密后才能正常读取。

核心思路:

  1. 用AES对称加密算法加密文件内容
  2. 密钥必须存在Android Keystore中(绝对不能硬编码到代码或存在SharedPreferences里,否则会被反编译窃取)
  3. 加密后的文件可以存在内部/外部存储的任意目录,哪怕是公共目录也没关系

简化加密代码示例(Java):

// 注意:实际项目中请用Android Keystore生成/存储密钥,此处为简化示例
public void encryptFile(File inputFile, File outputFile, SecretKey secretKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    
    try (FileInputStream fis = new FileInputStream(inputFile);
         FileOutputStream fos = new FileOutputStream(outputFile)) {
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            fos.write(cipher.update(buffer, 0, len));
        }
        fos.write(cipher.doFinal());
    }
}

优点:绝对安全,适配所有Android版本,文件存在哪里都不怕;
缺点:加密解密会消耗少量性能,大文件建议异步处理,避免ANR。

避坑提醒
  • 别用.nomedia文件:这个只是让系统媒体扫描器不索引文件,但文件管理器和电脑还是能看到,完全达不到你的需求。
  • 别改文件后缀伪装:把PDF改成.txt这种操作,懂行的人一眼就能识破,而且容易被误删。
  • Android 11+ 别绕Scoped Storage:Google现在对权限管控很严,强行用旧的存储API会被Play Store拒审,老老实实走官方私有目录。

内容的提问来源于stack exchange,提问作者Rakesh L

火山引擎 最新活动