相关疑难解决方法(0)

Android 6上的存储访问如何变化?

背景

Android在如何处理SD卡和存储方面有很多变化:

  • API 3 - 您获得所有访问权限,无需权限
  • API 4-15 - 您需要使用WRITE_EXTERNAL_STORAGE,并获得所有访问权限.
  • API 16-18 - 如果您只想阅读,请使用READ_EXTERNAL_STORAGE
  • API 19-20 - 您无法读取或写入辅助外部存储(SD卡),除非您的应用程序是系统应用程序,或者您拥有root用户.
  • API 21-22 - 为了访问SD卡,您需要请求用户许可,并使用DocumentFile API而不是File API.正如我在这里,这里这里所写的那样,这引发了许多问题.

从API 23(Android 6)开始,事情似乎再次发生变化......

问题

对于API 23,至少有两件新东西与存储相关:

  • " 可采用的存储设备 " - 用户可以选择将SD卡作为主要外部存储器.
  • 作为新权限机制(在运行时请求权限)的一部分,存储似乎也是用户需要确认的权限.这适用于READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE

由于没有配备SD卡的Android 6设备,并且因为模拟器本身并不能真正使用SD卡,所以仍然无法知道发生了什么.

问题

  1. SD卡是否可以使用File-API而不是DocumentFile获取访问权限?

  2. 如果我想访问所有外部存储路径(包括SD卡),这是否意味着我需要两次请求此权限:一个用于主外部存储,一个用于SD卡?

  3. 在手动授予许可之前,SD卡上的文件是否可以以任何方式访问?

  4. 假设用户选择使用"Adoptable Storage Devices",这对于检索应用程序文件路径的各种函数意味着什么?例如:getFilesDir,getExternalFilesDir,...?getExternalFilesDirs的oder会因为它而改变吗?

  5. 当用户将应用程序从SD卡移动到SD卡时(使用"可采用的存储设备"),应用程序的文件会发生什么变化?SD卡上的应用程序文件怎么样?他们会留下来吗?或者他们会搬到某个地方?

    例如,如果应用程序在SD卡上有"file1.txt",则在路径"/ storage/extSdCard/Android/data/appPackageName"上,它有一个文件"file2.txt"(或者甚至是同一个名字)在路径"/ storage/emulated/0/Android/data/appPackageName"上的主外部存储上.切换后,这些文件会发生什么?如果有的话,他们将如何合并到一个文件夹中?

  6. 将应用程序移动到SD卡(使用"Adoptable Storage Devices")时,是否意味着不会使用内部存储?

android sd-card android-permissions android-external-storage android-6.0-marshmallow

47
推荐指数
1
解决办法
3万
查看次数

访问getExternalStorageDirectory

使用一些非常简单的android代码我试图根据以下逻辑访问一个文件夹:

public void try_to_navigate_local_dir(){
    Environment e = new Environment();
    ArrayList<String> filesList = new ArrayList<String>();
    String sd_card = Environment.getExternalStorageDirectory().toString() + "/subdir_x";
    File file = new File( sd_card ) ;
    File list[] = file.listFiles();
    for( int i=0; i< list.length; i++) {
        filesList.add( list[i].getName() );
    }
}
Run Code Online (Sandbox Code Playgroud)

subdir_x由我的手机上其他应用程序创建的.

我可以使用文件管理器查看这些文件夹,但是当我尝试时,我的代码返回null file.listFiles().

我如何访问这些文件?

android

7
推荐指数
2
解决办法
2万
查看次数