【问题标题】:how to create a file with world readable permission under subdirectory of files directory如何在文件目录的子目录下创建具有世界可读权限的文件
【发布时间】:2011-12-14 18:35:05
【问题描述】:

我需要在我的应用程序中创建具有全局权限的 myapp/files/subdir 文件。我这样做是因为我使用外部应用程序打开一些文件 使用这个

 FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_WORLD_READABLE);

仅在文件夹下创建文件。使用

    File dir=new File(Constants.TASK_DIRECTORY);
    dir.mkdirs();
    File file=new File(dir, FILENAME);         
    file.createNewFile(); FileOutputStream fos=new FileOutputStream(file);

在子目录下创建文件,但具有私有权限。我需要找到一种方法来组合它们以在子目录中创建一个文件以供世界阅读

我一直在尝试很多东西,但没有一个对我有帮助,这是我最长时间未回答的问题

【问题讨论】:

    标签: android storage file-permissions java-io android-file


    【解决方案1】:

    OP 询问如何授予对以下层次结构中文件的访问权限:appdir/files/subdir/myfile
    这里提供的答案没有考虑子文件夹,所以我觉得还有改进的余地。

    为了访问层次结构中的文件,消费者应该对路径中的每个文件夹具有执行权限,以便访问(读取、写入、执行)其下的文件。


    对于 API >= 24

    从 API 24 开始,Android restricts accessappdir(又名 /data/data/appdir):

    为了提高私有文件的安全性,私有 针对 Android 7.0 或更高版本的应用目录已受到限制 访问(0700)。此设置可防止私有元数据泄漏 文件,例如它们的大小或存在。

    appdir 没有全局执行权限,因此你不能cd 进入它:

    angler:/ $ cd /data/data
    angler:/data/data $ cd com.myapp
    /system/bin/sh: cd: /data/data/com.myapp: Permission denied
    

    底线:您可以为您应用文件夹中的文件之一授予全球可读权限,但其他应用(只要它们不共享相同的 Linux 用户 ID)不会能够阅读它们。

    不仅如此:尝试将file:// URI 传递给外部应用程序将触发FileUriExposedException


    适用于 API

    appdir 文件夹默认拥有 world-execute 权限:

    shell:/ $ cd /data/data
    shell:/data/data $ cd com.myapp
    shell:/data/data/com.myapp $
    

    注意,即使是appdir/files 文件夹也有world-execute 权限:

    shell:/data/data/com.myapp $ cd files
    shell:/data/data/com.myapp/files $ 
    

    但如果您尝试创建一个子文件夹(在files 文件夹下),请使用以下代码:

    File subdir = new File(context.getFilesDir(), "subfolder");
    subdir.mkdir();
    

    它不会有 world-execute 权限:

    shell:/ $ cd /data/data/com.myapp/files
    shell:/data/data/com.myapp/files $ cd subfolder
    /system/bin/sh: cd: /data/data/com.myapp/files/subfolder: Permission denied
    shell:/data/data/com.myapp/files $ run-as com.myapp
    shell:/data/data/com.myapp $ cd files
    shell:/data/data/com.myapp/files $ ls -l 
    total 72
    drwx------ 3 u0_a226 u0_a226 4096 2016-11-06 11:49 subfolder
    shell:/data/data/com.myapp/files $ 
    

    因此,您必须使用 File#setExecutable 方法(在 API 9 中添加)显式授予新创建的文件夹 world-execute 权限:

    subdir.setExecutable(true, false);
    

    只有这样,按照其他人的建议,您才能创建您的文件并授予它世界可读的权限:

    File file = new File(subdir, "newfile");
    if(!file.exists()) {
        file.createNewFile();
        file.setReadable(true, false);
    }
    

    这样做将允许任何外部应用程序读取您的文件:

    shell:/ $ cd /data/data/com.myapp/files
    shell:/data/data/com.myapp/files $ cd subfolder
    shell:/data/data/com.myapp/files/subfolder $ cat newfile > /sdcard/1
    shell:/data/data/com.myapp/files/subfolder $ cd /sdcard        
    shell:/sdcard $ ls 1 
    1
    

    【讨论】:

    • 感谢您提供的重要信息!顺便说一句,我有两个问题。 1. /data/data/com.myapp 下的自定义子文件夹是否变为私有?或者/data/data/com.myapp/files 下的文件夹只是你在这里写的? 2.你打电话setReadable(true, false)是因为默认情况下总是使用MODE_PRIVATE模式创建文件吗?还是只是打电话确认?
    【解决方案2】:

    我过去使用的一种解决方法是在追加模式下使用 openFileOutput 重新打开已经存在的文件,并在此期间传入世界可读和/或世界可写标志。然后立即关闭文件而不写入。

    不过,我更喜欢 API 9 中添加的新方法。

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但这是正确的方法

      public void makeFileWorldReadable(String path)
      {
          File f = new File(path);
      
          if(!f.exists()) // Create the file if it does not exist.
              f.createNewFile();
          f.setReadable(true, false);
      }
      

      【讨论】:

      • 我们知道这是否是“官方的”吗?讨厌它在更新后停止工作。无论哪种方式,它都解决了我的问题,可能应该接受答案。
      • 自 API 级别 9 以来它是 SDK 的一部分,因此任何运行 Gingerbread 或更高版本的 Android 设备都可以运行。编号:developer.android.com/reference/java/io/File.html
      【解决方案4】:

      如果您在有根设备上运行它,请使用以下方法更改文件权限:

      Runtime.getRuntime().exec("chmod 777 " + PATH + fileName);
      

      或者在创建文件时尝试File.setReadable()File.setWritable

      【讨论】:

      • 很好,谢谢,但我需要它用于任何可能没有植根的设备。我认为这是一种错误
      猜你喜欢
      • 2018-04-26
      • 2010-10-09
      • 2018-11-20
      • 2018-08-18
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多