Desejo obter o tamanho da memória livre no armazenamento interno / externo do meu dispositivo de forma programática. Estou usando este código:
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
long bytesAvailable = (long)stat.getBlockSize() *(long)stat.getBlockCount();
long megAvailable = bytesAvailable / 1048576;
Log.e("","Available MB : "+megAvailable);
File path = Environment.getDataDirectory();
StatFs stat2 = new StatFs(path.getPath());
long blockSize = stat2.getBlockSize();
long availableBlocks = stat2.getAvailableBlocks();
String format = Formatter.formatFileSize(this, availableBlocks * blockSize);
Log.e("","Format : "+format);
e o resultado que estou obtendo é:
11-15 10:27:18.844: E/(25822): Available MB : 7572
11-15 10:27:18.844: E/(25822): Format : 869MB
O problema é que quero obter a memória livre do SdCard que está 1,96GB
agora. Como posso corrigir este código para obter o tamanho gratuito?
android
android-sdcard
diskspace
Android-Droid
fonte
fonte
Respostas:
Abaixo está o código para sua finalidade:
Obter tamanho de RAM
fonte
getBlockSize()
egetBlockCount
estão obsoletos.Foi assim que fiz:
fonte
getBlockSize
egetAvailableBlocks
porgetBlockSizeLong
egetAvailableBlocksLong
.Desde a API 9, você pode fazer:
fonte
File.getUsableSpace()
parece com um método mais fácil de usar em vez de usarStatFs
. Por que eu usariaStatFs
@MarkCarter?Para obter todas as pastas de armazenamento disponíveis (incluindo cartões SD), primeiro você obtém os arquivos de armazenamento:
Então você pode obter o tamanho disponível de cada um deles.
Existem 3 maneiras de fazer isso:
API 8 e inferior:
API 9 e superior:
API 18 e superior (não necessário se o anterior estiver ok):
Para obter uma string formatada legal do que você tem agora, você pode usar:
ou você pode usar isso no caso de desejar ver o número exato de bytes, mas muito bem:
Observe que acho que o armazenamento interno pode ser o mesmo que o primeiro armazenamento externo, já que o primeiro é o emulado.
EDIT: Usando StorageVolume no Android Q e acima, acho que é possível obter o espaço livre de cada um, usando algo como:
Não tenho certeza se isso está correto e não consigo encontrar uma maneira de obter o tamanho total de cada um, então escrevi sobre isso aqui e perguntei sobre isso aqui .
fonte
@ Android-Droid - você tem
Environment.getExternalStorageDirectory()
pontos errados para armazenamento externo que não precisa ser cartão SD, também pode ser montado na memória interna. Vejo:Encontre um local externo para cartão SD
fonte
Experimente este trecho simples
fonte
java.lang.ArrayIndexOutOfBoundsException: length=5; index=-2147483648
erro, parece que odigitGroups
resultado é -2147483648.É muito fácil descobrir o armazenamento disponível se você obtiver um caminho de armazenamento interno ou externo. Além disso, o caminho de armazenamento externo do telefone é realmente muito fácil de descobrir usando
Então, estou apenas me concentrando em como descobrir os caminhos de armazenamento externo removível como sdcard removível, USB OTG (não testei USB OTG porque não tenho USB OTG).
O método abaixo fornecerá uma lista de todos os caminhos de armazenamento removíveis externos possíveis.
fonte
Adição rápida ao tópico de memória externa
Não se confunda com o nome do método
externalMemoryAvailable()
na resposta de Dinesh Prajapati.Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
fornece o estado atual da memória, se a mídia estiver presente e montada em seu ponto de montagem com acesso de leitura / gravação. Você setrue
vingará em dispositivos sem cartões SD, como o Nexus 5. Mas ainda é um método 'obrigatório' antes de qualquer operação com armazenamento.Para verificar se há um cartão SD no seu dispositivo, você pode usar o método
ContextCompat.getExternalFilesDirs()
Não mostra dispositivos transitórios, como unidades flash USB.
Também esteja ciente de que
ContextCompat.getExternalFilesDirs()
no Android 4.3 e inferior sempre retornará apenas 1 entrada (cartão SD se estiver disponível, caso contrário, interno). Você pode ler mais sobre isso aqui .no meu caso foi o suficiente, mas não se esqueça que alguns dos dispositivos Android podem ter 2 cartões SD, então se você precisar de todos eles - ajuste o código acima.
fonte
A classe StorageStatsManager introduziu o Android O e superior, que pode fornecer bytes gratuitos e totais no armazenamento externo / interno. Para detalhes com o código-fonte, você pode ler meu artigo a seguir. você pode usar reflexão para menor do que o Android O
https://medium.com/cashify-engineering/how-to-get-storage-stats-in-android-o-api-26-4b92eca6805b
fonte
É assim que eu fiz ..
memória total interna
Tamanho livre interno
Memória externa livre e total
fonte
Sobre menory externo, há outra maneira:
File external = Environment.getExternalStorageDirectory(); free:external.getFreeSpace(); total:external.getTotalSpace();
fonte
Depois de verificar o código de escrita de diferentes soluções, este é um código completo para encontrar
'' ''
fonte