Samsung Galaxy S3 tem um slot de cartão SD externo, que é montado /mnt/extSdCard
.
Como posso obter esse caminho por algo assim Environment.getExternalStorageDirectory()
?
Isso retornará mnt/sdcard
, e não consigo encontrar a API para o cartão SD externo. (Ou armazenamento USB removível em alguns tablets.)
android
android-sdcard
Romulus Urakagi Ts'ai
fonte
fonte
Respostas:
Tenho uma variação de uma solução que encontrei aqui
O método original foi testado e trabalhado com
Não tenho certeza de qual versão do Android eles estavam quando foram testados.
Eu testei minha versão modificada com
e alguns dispositivos de armazenamento único que usam um cartão SD como seu armazenamento principal
Com exceção do incrível, todos esses dispositivos retornaram apenas seu armazenamento removível. Provavelmente, há algumas verificações extras que devo fazer, mas isso é pelo menos um pouco melhor do que qualquer solução que encontrei até agora.
fonte
Eu encontrei uma maneira mais confiável de obter caminhos para todos os SD-CARDs no sistema. Isso funciona em todas as versões do Android e caminhos de retorno para todos os armazenamentos (incluindo emulados).
Funciona corretamente em todos os meus dispositivos.
PS: Baseado no código fonte da classe Environment.
fonte
Pattern
para/
System.getenv("SECONDARY_STORAGE")
retorna/storage/sdcard1
. Esse local não existe, mas o local real é/storage/42CE-FD0A
, onde 42CE-FD0A é o número de série do volume da partição formatada.Acho que para usar o cartão SD externo, você precisa usar este:
OU
no seu caso...
em substituição de
Environment.getExternalStorageDirectory()
Funciona para mim. Você deve verificar o que está no diretório mnt primeiro e trabalhar a partir daí.
Você deve usar algum tipo de método de seleção para escolher qual cartão SD usar:
fonte
Para recuperar todos os armazenamentos externos (sejam eles cartões SD ou armazenamentos internos não removíveis ), você pode usar o seguinte código:
Como alternativa, você pode usar System.getenv ("EXTERNAL_STORAGE") para recuperar o diretório de armazenamento externo primário (por exemplo, "/ storage / sdcard0" ) e System.getenv ("SECONDARY_STORAGE") para recuperar a lista de todos os diretórios secundários (por exemplo, " / storage / extSdCard: / storage / UsbDriveA: / storage / UsbDriveB " ). Lembre-se que, também neste caso, você pode querer filtrar a lista de diretórios secundários para excluir as unidades USB.
Em qualquer caso, observe que usar caminhos embutidos em código é sempre uma abordagem ruim (especialmente quando cada fabricante pode alterá-lo como quiser).
fonte
Eu estava usando a solução de Dmitriy Lozenko até verificar em um Asus Zenfone2 , Marshmallow 6.0.1 e a solução não está funcionando. A solução falhou ao obter EMULATED_STORAGE_TARGET , especificamente para o caminho microSD, ou seja: / storage / F99C-10F4 / . Editei o código para obter os caminhos de raiz emulados diretamente dos caminhos de aplicativos emulados
context.getExternalFilesDirs(null);
e adicionar mais caminhos físicos específicos de modelos de telefone conhecidos .Para facilitar a nossa vida, fiz uma biblioteca aqui . Você pode usá-lo via sistema de compilação gradle, maven, sbt e leiningen.
Se você gosta da maneira antiga, também pode copiar e colar o arquivo diretamente daqui , mas não saberá se há uma atualização no futuro sem verificar manualmente.
Se você tiver alguma dúvida ou sugestão, por favor me avise
fonte
context.getExternalFilesDirs(null)
retornaránull
para um dos arquivos e haverá uma exceção no ciclo seguinte. Eu sugiro adicionarif (file == null) continue;
como a primeira linha do loop.Boas notícias! No KitKat agora há uma API pública para interagir com esses dispositivos de armazenamento compartilhados secundários.
Os novos métodos
Context.getExternalFilesDirs()
eContext.getExternalCacheDirs()
podem retornar vários caminhos, incluindo dispositivos primários e secundários. Você pode então iterar sobre eles e verificarEnvironment.getStorageState()
eFile.getFreeSpace()
determinar o melhor lugar para armazenar seus arquivos. Esses métodos também estão disponíveis emContextCompat
biblioteca support-v4.Observe também que, se estiver interessado apenas em usar os diretórios retornados por
Context
, você não precisará mais das permissõesREAD_
ouWRITE_EXTERNAL_STORAGE
. No futuro, você sempre terá acesso de leitura / gravação a esses diretórios, sem a necessidade de permissões adicionais.Os aplicativos também podem continuar trabalhando em dispositivos mais antigos ao final da vida útil de sua solicitação de permissão, como esta:
fonte
Fiz o seguinte para obter acesso a todos os cartões SD externos.
Com:
você obtém o caminho para o SD externo primário Em seguida:
você obtém o diretório pai do armazenamento externo primário e também é o pai de todos os sd externos. Agora, você pode listar todo o armazenamento e selecionar aquele que deseja.
Espero que seja útil.
fonte
Veja como obtenho a lista de caminhos de cartão SD (excluindo o armazenamento externo primário):
fonte
externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()
Isto é uma receita para o desastre. Se você estiver fazendo isso, você também pode apenas codificar permanentemente o caminho que deseja, pois se você obtiver um diretório de cache com qualquer coisa diferente de 4 pais, obterá NullPointerException ou o caminho errado.Obrigado pelas pistas fornecidas por vcs, principalmente @SmartLemon, encontrei a solução. Caso outra pessoa precise, coloco minha solução final aqui (para encontrar o primeiro cartão SD externo listado):
Se não houver nenhum cartão SD externo, ele retornará o armazenamento integrado. Vou usá-lo se o sdcard não existir, talvez seja necessário alterá-lo.
fonte
consulte meu código, espero que seja útil para você:
fonte
Na verdade, em alguns dispositivos, o nome padrão do sdcard externo é mostrado como
extSdCard
e para outros ésdcard1
.Este trecho de código ajuda a descobrir o caminho exato e ajuda a recuperar o caminho do dispositivo externo.
fonte
Sim. Diferentes fabricantes usam diferentes nomes de cartões SD como no Samsung Tab 3 seu extsd, e outros dispositivos Samsung usam sdcard como este fabricante diferente usa nomes diferentes.
Eu tinha os mesmos requisitos que você. então eu criei um exemplo de amostra para você do meu projeto vá para este link Exemplo de seletor de diretório Android que usa a biblioteca androi-dirchooser. Este exemplo detecta o SDcard e lista todas as subpastas e também detecta se o dispositivo tem mais de um SDcard.
Parte do código se parece com isto Para um exemplo completo, vá para o link Android Directory Chooser
fonte
Esta solução (montada a partir de outras respostas a esta pergunta) lida com o fato (conforme mencionado por @ono) que não
System.getenv("SECONDARY_STORAGE")
é útil com o Marshmallow.Testado e trabalhando em:
Samsung Galaxy Tab A (Android 6.0.1 - Estoque)
fonte
rawSecondaryStoragesStr.contains(path)
pode permitir que o armazenamento interno também seja adicionado; podemos remover melhor essa condição. Enfrentei esse problema, pois meu dispositivo retorna o diretório de armazenamento interno comSystem.getenv("SECONDARY_STORAGE")
, mas retorna o caminho do cartão de memória externa comSystem.getenv(EXTERNAL_STORAGE)
em KitKat; parece que diferentes fornecedores implementaram isso de maneira diferente, sem qualquer padrão.Em alguns dispositivos (por exemplo, samsung galaxy sII), o cartão de memória interno pode estar em vfat. Neste caso, use o último código referente, obtemos o cartão de memória interno do caminho (/ mnt / sdcad), mas nenhum cartão externo. Código de referência abaixo para resolver este problema.
fonte
fonte
Tenho certeza de que este código certamente resolverá seus problemas ... Isso está funcionando bem para mim ... \
fonte
isso não é verdade. / mnt / sdcard / external_sd pode existir mesmo se o cartão SD não estiver montado. seu aplicativo irá travar quando você tentar gravar em / mnt / sdcard / external_sd quando não estiver montado.
você precisa verificar se o cartão SD foi montado primeiro usando:
fonte
getExternalStorageState()
retorna o armazenamento interno em vez do cartão SD externo, eu acho.fonte
Você pode usar algo como - Context.getExternalCacheDirs () ou Context.getExternalFilesDirs () ou Context.getObbDirs (). Eles fornecem diretórios específicos ao aplicativo em todos os dispositivos de armazenamento externos onde o aplicativo pode armazenar seus arquivos.
Portanto, algo como isso - Context.getExternalCacheDirs () [i] .getParentFile (). GetParentFile (). GetParentFile (). GetParent () pode obter o caminho raiz de dispositivos de armazenamento externos.
Eu sei que esses comandos têm um propósito diferente, mas outras respostas não funcionaram para mim.
Este link me deu boas dicas - https://possiblemobile.com/2014/03/android-external-storage/
fonte
System.getenv("SECONDARY_STORAGE")
retorna nulo para Marshmallow. Esta é outra maneira de encontrar todos os diretórios externos. Você pode verificar se é removível, o que determina se interno / externofonte
Eu tentei as soluções fornecidas por Dmitriy Lozenko e Gnathonic em meu Samsung Galaxy Tab S2 (modelo: T819Y), mas nenhuma me ajudou a recuperar o caminho para um diretório de cartão SD externo.
mount
a execução do comando continha o caminho necessário para o diretório externo do cartão SD (ou seja, / Storage / A5F9-15F4), mas não correspondia à expressão regular, portanto, não foi retornado. Não entendi o mecanismo de nomenclatura de diretório seguido por Samsung. Por que eles se desviam dos padrões (extsdcard) e aparecem com algo realmente suspeito, como no meu caso (ou seja, / Storage / A5F9-15F4) . Está faltando alguma coisa? De qualquer forma, seguindo as mudanças na expressão regular de Gnatônico solução me ajudou a obter um diretório sdcard válido:Não tenho certeza se esta é uma solução válida e se dará resultados para outros tablets Samsung, mas corrigiu meu problema por enquanto. A seguir está outro método para recuperar o caminho removível do cartão SD no Android (v6.0). Eu testei o método com o Android Marshmallow e funciona. A abordagem usada é muito básica e certamente funcionará com outras versões também, mas o teste é obrigatório. Algumas dicas sobre isso serão úteis:
Por favor, compartilhe se você tiver qualquer outra abordagem para lidar com esse problema. obrigado
fonte
Isso obterá o caminho do armazenamento secundário externo do SD.
fonte
fonte
Para acessar arquivos no meu cartão SD , no meu HTC One X (Android), eu uso este caminho:
Observe o triplo "/"!
fonte
No Galaxy S3 Android 4.3, o caminho que uso é ./storage/extSdCard/Card/ e ele faz o trabalho. Espero que ajude,
fonte
As etapas a seguir funcionaram para mim. Você só precisa escrever estas linhas:
A primeira linha fornecerá o nome do diretório sd, e você só precisa usá-lo no método de substituição para a segunda string. A segunda string conterá o caminho para o sd interno e removível (/ storage / no meu caso) . Eu só precisava desse caminho para meu aplicativo, mas você pode ir mais longe se precisar.
fonte