Após o Android 4.4 Kitkat, e a partir de 2017, o compartilhamento do Android 4.4 e menos é de cerca de 20% e diminui, não é possível salvar no cartão SD usando File
classe e getExternalStorageDirectory()
método. Esse método retorna a memória interna do dispositivo e as imagens são salvas visíveis para todos os aplicativos. Você também pode salvar imagens privadas apenas em seu aplicativo e ser excluído quando o usuário excluir seu aplicativo comopenFileOutput()
método
A partir do Android 6.0, você pode formatar seu cartão SD como uma memória interna, mas apenas privada para o seu dispositivo. (Se você formatar um carro SD como memória interna, apenas seu dispositivo poderá acessar ou ver seu conteúdo). outras respostas, mas se você quiser usar um cartão SD removível, leia minha resposta abaixo.
Você deve usar o Storage Access Framework para obter o onActivityResult
método de atividade da interface do usuário para a pasta para obter a pasta selecionada pelo usuário e adicionar permissão persistente de recuperação para poder acessar a pasta depois que o usuário reiniciar o dispositivo.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// selectDirectory() invoked
if (requestCode == REQUEST_FOLDER_ACCESS) {
if (data.getData() != null) {
Uri treeUri = data.getData();
tvSAF.setText("Dir: " + data.getData().toString());
currentFolder = treeUri.toString();
saveCurrentFolderToPrefs();
// grantUriPermission(getPackageName(), treeUri,
// Intent.FLAG_GRANT_READ_URI_PERMISSION |
// Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
Agora, salve a pasta Salvar nas preferências compartilhadas para não solicitar ao usuário que selecione a pasta toda vez que quiser salvar uma imagem.
Você deve usar a DocumentFile
classe para salvar sua imagem, não File
ou ParcelFileDescriptor
, para obter mais informações, consulte este tópico para salvar a imagem no cartão SD com compress(CompressFormat.JPEG, 100, out);
método e DocumentFile
classes.
mImage.setImageBitmap(_result.getBitmap());
no meuonTaskComplete()
retorno de chamada. Agora, tenho que permitir que os usuários salvem o arquivo localmente, se quiserem, através do menu de contexto de pressão longa. Eu deveria poder usar a solução abaixo. O que eu quero saber, porém, você descobriu uma abordagem melhor para isso?