Como o acesso ao armazenamento é alterado no Android 6?

fundo

O Android teve muitas alterações em como lidar com o cartão SD e o armazenamento em geral:

API 3 - você obtém todo o acesso, sem permissão necessáriaAPI 4-15 - você precisa usar WRITE_EXTERNAL_STORAGE e obtém todo o acesso.API 16-18 - se você deseja apenas ler, use READ_EXTERNAL_STORAGEAPI 19-20 - você não pode ler ou gravar no armazenamento externo secundário (cartão SD), a menos que seu aplicativo seja um sistema, ou você tenha root.API 21-22 - para acessar o cartão SD, você precisa pedir permissão ao usuário e usar a API DocumentFile em vez da API de arquivos. Isso gerou muitas perguntas, como escrevi sobreaqui, aqui eaqui.

A partir da API 23 (Android 6), as coisas parecem mudar mais uma vez ...

O problema

Para a API 23, há pelo menos duas coisas novas e relacionadas ao armazenamento:

"Dispositivos de armazenamento adotáveis"- O usuário pode opcionalmente fazer o cartão SD como algo parecido com o armazenamento externo primário.Como parte donovo mecanismo de permissões (solicitando permissões em tempo de execução), parece que o armazenamento também é uma permissão que o usuário precisa confirmar. Isso é para READ_EXTERNAL_STORAGE e WRITE_EXTERNAL_STORAGE

Como não existe um dispositivo Android 6 com cartão SD, e como o emulador realmente não tem a capacidade de usar um cartão SD, ainda é impossível saber o que está acontecendo.

As questões

O cartão SD obterá o acesso usando a API do arquivo em vez do DocumentFile?

Se eu quiser acessar todos os caminhos de armazenamento externo (incluindo cartão SD), isso significa que preciso solicitar essas permissões duas vezes: uma para o armazenamento externo primário e outra para o cartão SD?

Os arquivos no cartão SD estão acessíveis de alguma forma antes da concessão manual da permissão?

Suponha que o usuário tenha escolhido usar "Dispositivos de armazenamento adotáveis", o que significa para as várias funções que recuperam os caminhos dos arquivos do aplicativo? Por exemplo: getFilesDir, getExternalFilesDir, ...? O oder de getExternalFilesDirs mudaria por causa disso?

O que acontece com os arquivos do aplicativo quando o usuário move o aplicativo de / para o cartão SD (usando os "Dispositivos de armazenamento adotáveis")? E os arquivos do aplicativo no cartão SD? Eles ficariam? Ou eles se mudariam para algum lugar?

Por exemplo, se o aplicativo tiver "file1.txt" no cartão SD, no caminho "/ storage / extSdCard / Android / data / appPackageName" e tiver um arquivo "file2.txt" (ou mesmo o mesmo nome) no armazenamento externo primário no caminho "/ storage / emulated / 0 / Android / data / appPackageName". Após a troca, o que aconteceria com esses arquivos? Como eles se fundiriam em uma única pasta?

Ao mover o aplicativo para o cartão SD (usando "Dispositivos de armazenamento adotáveis"), isso significa que nenhum armazenamento interno será usado?