{"id":3803,"date":"2025-11-27T18:25:57","date_gmt":"2025-11-27T10:25:57","guid":{"rendered":"https:\/\/imastudio.com\/?p=3803"},"modified":"2025-11-27T18:25:58","modified_gmt":"2025-11-27T10:25:58","slug":"android-storage-permission-adaptation-guide","status":"publish","type":"post","link":"https:\/\/imastudio.com\/pt\/blog\/android-storage-permission-adaptation-guide","title":{"rendered":"Guia de adapta\u00e7\u00e3o de permiss\u00f5es de armazenamento do Android para Android 11+"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Quando tentei implementar um requisito muito simples \u2014 <strong>Baixe uma imagem e salve-a no armazenamento local.<\/strong> \u2014 No in\u00edcio, tudo parecia bem.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Honor (Android 10) \u2013 funciona<\/li>\n\n\n\n<li>Redmi (Android 11) \u2013 funciona<\/li>\n\n\n\n<li>Xiaomi (Android 13) \u2013 funciona<\/li>\n\n\n\n<li><strong>Samsung (Android 13)<\/strong> \u2013 Falhou completamente: a caixa de di\u00e1logo de permiss\u00e3o de armazenamento nunca aparecia.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mesmo c\u00f3digo, mesma funcionalidade, mas um dispositivo com Android 13 simplesmente se recusou a exibir a solicita\u00e7\u00e3o de permiss\u00e3o. Foi assim que essa pequena tarefa de &quot;baixar imagem&quot; se transformou em uma investiga\u00e7\u00e3o profunda sobre... <strong>Armazenamento com escopo<\/strong> e <strong>GERENCIAR ARMAZENAMENTO EXTERNO<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta postagem resume como adaptei as permiss\u00f5es de armazenamento para <strong>Android 11 e superior<\/strong>, E como lido com os diferentes comportamentos entre as vers\u00f5es.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. O bug: a caixa de di\u00e1logo de permiss\u00e3o de armazenamento nunca \u00e9 exibida (Samsung Android 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O requisito \u00e9 simples:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Baixe uma imagem e salve-a no dispositivo para que ela apare\u00e7a na galeria.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Nos meus tr\u00eas dispositivos de teste:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Honor \u2013 Android 10 \u2192 OK<\/li>\n\n\n\n<li>Redmi \u2013 Android 11 \u2192 OK<\/li>\n\n\n\n<li>Xiaomi \u2013 Android 13 \u2192 OK<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mas em um <strong>Dispositivo Samsung com Android 13<\/strong>, o sistema <strong>A caixa de di\u00e1logo de permiss\u00e3o de armazenamento nunca foi exibida.<\/strong>, n\u00e3o importa como eu tenha pedido.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg\" alt=\"\" class=\"wp-image-3810\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-1024x184.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-300x54.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-768x138.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182134.jpeg 1277w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"168\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg\" alt=\"\" class=\"wp-image-3811\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1024x168.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-300x49.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-768x126.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-1536x253.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182139.jpeg 1806w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"174\" src=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg\" alt=\"\" class=\"wp-image-3808\" srcset=\"https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1024x174.jpeg 1024w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-300x51.jpeg 300w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-768x131.jpeg 768w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-1536x262.jpeg 1536w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150-18x3.jpeg 18w, https:\/\/imastudio.com\/wp-content\/uploads\/2025\/11\/20251127-182150.jpeg 1879w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A princ\u00edpio, pensei que fosse apenas mais uma peculiaridade do fabricante, mas depois de verificar as altera\u00e7\u00f5es nas permiss\u00f5es de armazenamento entre as vers\u00f5es do Android, percebi que estava dependendo de um comportamento que havia sido efetivamente descontinuado no Android 13 ao usar o SDK 33 como alvo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Causa raiz: as permiss\u00f5es WRITE\/READ_EXTERNAL_STORAGE foram descontinuadas no Android 13 (SDK 33).<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Em vers\u00f5es mais antigas do Android, pod\u00edamos simplesmente declarar essas duas permiss\u00f5es no manifesto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>LER_ARMAZENAMENTO_EXTERNO<\/code><\/li>\n\n\n\n<li><code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">e depois solicit\u00e1-los em tempo de execu\u00e7\u00e3o quando necess\u00e1rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No Android 13 (SDK 33) com <strong>targetSdkVersion = 33<\/strong>, essa abordagem come\u00e7a a falhar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code> \u00e9 <strong>obsoleto e efetivamente in\u00fatil<\/strong> em vers\u00f5es recentes do Android<\/li>\n\n\n\n<li>Se voc\u00ea adicionar <code>maxSdkVersion=32<\/code> Com essas permiss\u00f5es, elas ainda funcionam no Android 11\/12.<br>mas eles s\u00e3o <strong>ignorado<\/strong> no Android 13 ao direcionar para 33<\/li>\n\n\n\n<li>Ao mesmo tempo, a Play Store exige que os novos aplicativos sejam compat\u00edveis com pelo menos o SDK 33.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Portanto, para o Android 11 e vers\u00f5es posteriores, precisamos nos adaptar a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Armazenamento com escopo<\/strong><\/li>\n\n\n\n<li>E, em alguns casos, a permiss\u00e3o especial: <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>GERENCIAR ARMAZENAMENTO EXTERNO<\/strong> Concede a um aplicativo amplo acesso a todo o conte\u00fado do armazenamento compartilhado (incluindo arquivos que n\u00e3o sejam de m\u00eddia). <strong>n\u00e3o<\/strong> Permitir o acesso aos diret\u00f3rios privados de outros aplicativos ainda \u00e9 considerado uma permiss\u00e3o altamente sens\u00edvel pelo Google Play.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Para dar suporte a diferentes vers\u00f5es do Android, acabei dividindo o gerenciamento de permiss\u00f5es em:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Antes do Android 11 (API &lt; 30)<\/strong> \u2013 permiss\u00f5es de armazenamento externo no estilo antigo<\/li>\n\n\n\n<li><strong>Android 11 e superior<\/strong> \u2013 Armazenamento com escopo definido + manuseio especial com <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> onde for estritamente necess\u00e1rio<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Adapta\u00e7\u00e3o passo a passo<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 Declare MANAGE_EXTERNAL_STORAGE no manifesto.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No <code>AndroidManifest.xml<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission\n    android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"\n    tools:ignore=\"ScopedStorage\" \/><\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f Observa\u00e7\u00e3o: Porque <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> \u00c9 uma permiss\u00e3o sens\u00edvel, restrita no Google Play. Falarei sobre alternativas mais tarde, caso voc\u00ea queira apenas salvar imagens.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 Verificar se a permiss\u00e3o foi concedida<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eu usei <strong>Permiss\u00f5es f\u00e1ceis<\/strong> Para simplificar as verifica\u00e7\u00f5es de permiss\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>fun\u00e7\u00e3o privada checkPer(activity: PreViewActivity): Boolean { return if (Build.VERSION.SDK_INT &gt;= 30) { EasyPermissions.hasPermissions( activity, android.Manifest.permission.MANAGE_EXTERNAL_STORAGE ) } else { EasyPermissions.hasPermissions( activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sobre <strong>Android 11+ (API &gt;= 30)<\/strong>: Eu verifico <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code><\/li>\n\n\n\n<li>Sobre <strong>Android 10 e vers\u00f5es anteriores<\/strong>Eu ainda verifico <code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Essa divis\u00e3o \u00e9 crucial, porque <code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code> N\u00e3o se comporta mais da mesma forma que nas vers\u00f5es mais recentes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.3 Solicitar permiss\u00e3o quando ela estiver ausente<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Caso a permiss\u00e3o n\u00e3o seja concedida, eu a solicito de forma diferente, dependendo da vers\u00e3o do sistema.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private fun requestStoragePermission(activity: PreViewActivity, curImg: Int) { if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.R) { \/\/ Android 11+ \u2013 redirecionar para a p\u00e1gina de configura\u00e7\u00f5es do sistema &quot;Acesso a todos os arquivos&quot; val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse(&quot;package:&quot; + activity.packageName) activity.startActivityForResult(intent, 200) } else { \/\/ Android 10 e vers\u00f5es anteriores \u2013 permiss\u00e3o de tempo de execu\u00e7\u00e3o normal val perm = android.Manifest.permission.WRITE_EXTERNAL_STORAGE PaperThreeVariable.isToRequestPer = true EasyPermissions.requestPermissions( PermissionRequest.Builder( activity, 200, perm ).build() ) } }\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sobre <strong>Android 11+<\/strong>Voc\u00ea n\u00e3o pode simplesmente &quot;abrir&quot; uma caixa de di\u00e1logo normal em tempo de execu\u00e7\u00e3o para <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code><br>Voc\u00ea deve enviar o usu\u00e1rio para a p\u00e1gina de configura\u00e7\u00f5es do sistema, onde ele conceder\u00e1 manualmente o acesso a &quot;Todos os arquivos&quot;.<\/li>\n\n\n\n<li>Sobre <strong>Android 10 e vers\u00f5es anteriores<\/strong>A caixa de di\u00e1logo cl\u00e1ssica de permiss\u00e3o em tempo de execu\u00e7\u00e3o ainda funciona.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.4 Gerenciar retornos de chamada de permiss\u00e3o<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">O EasyPermissions ajuda a fazer a ponte entre o retorno de chamada da Activity e a nossa pr\u00f3pria l\u00f3gica:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sobrescreva a fun\u00e7\u00e3o onRequestPermissionsResult(requestCode: Int, permissions: Array) , grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this) } override fun onPermissionsGranted(requestCode: Int, perms: MutableList ) { AppInitUtils().saveFreshAppImageToGallery(this, curImg) PaperThreeVariable.isToRequestPer = false } override fun onPermissionsDenied(requestCode: Int, perms: MutableList ) { PaperThreeVariable.isToRequestPer = false if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { AppSettingsDialog.Builder(this) .setRationale(&quot;Esta fun\u00e7\u00e3o requer que a permiss\u00e3o de armazenamento esteja habilitada&quot;) .setNegativeButton(&quot;N\u00e3o&quot;) .setPositiveButton(&quot;Sim&quot;) .build() .show() } }\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Por que eu uso o EasyPermissions aqui:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Os usu\u00e1rios podem <strong>negar permanentemente<\/strong> permiss\u00f5es, o que faz com que solicita\u00e7\u00f5es repetidas falhem silenciosamente<\/li>\n\n\n\n<li>O EasyPermissions facilita:\n<ul class=\"wp-block-list\">\n<li>Detectar estado de \u201cnega\u00e7\u00e3o permanente\u201d<\/li>\n\n\n\n<li>Exibir uma caixa de di\u00e1logo que oriente os usu\u00e1rios a <strong>Configura\u00e7\u00f5es do sistema \u2192 permiss\u00f5es do aplicativo<\/strong> para habilitar o acesso ao armazenamento manualmente<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Assim que a permiss\u00e3o for concedida, eu ligo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AppInitUtils().saveFreshAppImageToGallery(this, curImg)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para salvar a imagem e atualizar a galeria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s essa adapta\u00e7\u00e3o, o dispositivo Samsung com Android 13 finalmente passou a se comportar da mesma forma que os demais.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Observa\u00e7\u00e3o: Meu dispositivo Xiaomi foi reportado como Android 13, mas o recurso &quot;dispositivos conectados hist\u00f3ricos&quot; do Android Studio o reconheceu como Android 12. Isso pode explicar por que ainda funcionou em alguns casos \u2014 mas \u00e9 exatamente por isso que o gerenciamento de permiss\u00f5es com reconhecimento de vers\u00e3o \u00e9 importante.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Sobre MANAGE_EXTERNAL_STORAGE e restri\u00e7\u00f5es do Google Play<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> \u00e9 poderoso:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Concede acesso de leitura\/grava\u00e7\u00e3o a <strong>todo o armazenamento compartilhado<\/strong> no dispositivo.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Por isso, o Google Play o trata como um <strong>permiss\u00e3o altamente confidencial<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00c9 destinado principalmente a <strong>gerenciador de arquivos \/ backup \/ antiv\u00edrus<\/strong> aplicativos de tipo<\/li>\n\n\n\n<li>Voc\u00ea precisa apresentar uma justificativa para us\u00e1-lo.<\/li>\n\n\n\n<li>Se o seu aplicativo for apenas um aplicativo t\u00edpico para o consumidor (por exemplo, salvar imagens, downloads simples), sua solicita\u00e7\u00e3o provavelmente ser\u00e1 <strong>rejeitado<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Portanto, se sua \u00fanica exig\u00eancia for:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u201cSalvar uma imagem na galeria e torn\u00e1-la vis\u00edvel para o usu\u00e1rio.\u201d<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">ent\u00e3o voc\u00ea deveria <strong>Considere seriamente evitar<\/strong> <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> e em vez disso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usar <strong>MediaStore<\/strong> Para inserir imagens na biblioteca de m\u00eddia do sistema.<\/li>\n\n\n\n<li>Ou utilize APIs que podem salvar imagens sem exigir acesso total ao arquivo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Existem v\u00e1rios padr\u00f5es para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Salvar imagem no diret\u00f3rio Pictures\/DCIM<\/li>\n\n\n\n<li>Avise o scanner de m\u00eddia ou utilize o MediaStore para que a galeria possa detectar o arquivo.<\/li>\n\n\n\n<li>Fa\u00e7a tudo isso <strong>sem solicitar MANAGE_EXTERNAL_STORAGE<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para distribui\u00e7\u00e3o interna ou fora da Play Store (por exemplo, lojas de aplicativos internas de empresas), tecnicamente voc\u00ea ainda pode usar <code>Ambiente.obterDiret\u00f3rioDeArmazenamentoExterno()<\/code>, Mas n\u00e3o recomendo desenvolver um novo aplicativo com base nisso em 2025.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Resumo vers\u00e3o por vers\u00e3o (Android 9 \u2192 13)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para reunir tudo em um s\u00f3 lugar, aqui est\u00e1 um resumo geral de como o armazenamento externo e as permiss\u00f5es se comportam em diferentes vers\u00f5es.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Android 9 e vers\u00f5es anteriores (API 28 e anteriores)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Permiss\u00f5es<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>LER_ARMAZENAMENTO_EXTERNO<\/code><\/li>\n\n\n\n<li><code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comportamento<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Os aplicativos podem acessar livremente <code>\/sdcard<\/code> e seus subdiret\u00f3rios<\/li>\n\n\n\n<li>Os arquivos criados pelo aplicativo permanecem no dispositivo mesmo ap\u00f3s a desinstala\u00e7\u00e3o do aplicativo.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abordagem t\u00edpica<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Leitura\/grava\u00e7\u00e3o direta em caminhos de armazenamento externo<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 10 (API 29) \u2013 Introdu\u00e7\u00e3o do armazenamento com escopo<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Permiss\u00f5es<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>LER_ARMAZENAMENTO_EXTERNO<\/code> ainda funciona<\/li>\n\n\n\n<li><code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code> Ainda existe, mas seu alcance efetivo foi reduzido.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comportamento<\/strong>:\n<ul class=\"wp-block-list\">\n<li><strong>Armazenamento com escopo<\/strong> \u00e9 apresentado:\n<ul class=\"wp-block-list\">\n<li>Os aplicativos ficam restritos ao seu pr\u00f3prio diret\u00f3rio espec\u00edfico, em<br><code>Android\/data\/nome.do.pacote\/<\/code><\/li>\n\n\n\n<li>O acesso direto aos arquivos de outros aplicativos \u00e9 restrito.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Os arquivos de m\u00eddia (imagens, v\u00eddeos, \u00e1udio) devem ser acessados atrav\u00e9s de <strong>MediaStore<\/strong><\/li>\n\n\n\n<li><code>solicitarArmazenamentoExternoLegado=true<\/code> poderia manter temporariamente o comportamento antigo<br>(mas essa flag \u00e9 ignorada a partir do Android 11)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abordagem recomendada<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Para imagens\/v\u00eddeos\/\u00e1udio: use <strong>MediaStore<\/strong><\/li>\n\n\n\n<li>Para arquivos privados: use <code>obterDiret\u00f3rioDeArquivosExternos()<\/code> ou <code>obterDiret\u00f3rioDeDados()<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 11 (API 30) \u2013 Armazenamento com escopo imposto<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Permiss\u00f5es<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>LER_ARMAZENAMENTO_EXTERNO<\/code> Funciona, mas apenas para m\u00eddias gerenciadas pelo MediaStore.<\/li>\n\n\n\n<li><code>GRAVAR_ARMAZENAMENTO_EXTERNO<\/code> \u00e9 efetivamente <strong>obsoleto<\/strong> para armazenamento externo geral<\/li>\n\n\n\n<li><code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> Introduzido para casos de uso especiais de &quot;acesso a todos os arquivos&quot;.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comportamento<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>solicitarArmazenamentoExternoLegado=true<\/code> N\u00e3o funciona mais; o armazenamento com escopo \u00e9 <strong>sempre ligado<\/strong><\/li>\n\n\n\n<li>Acesso a <code>\/sdcard\/<\/code> O root est\u00e1 bloqueado<\/li>\n\n\n\n<li>Os aplicativos s\u00f3 podem:\n<ul class=\"wp-block-list\">\n<li>Acesse seus pr\u00f3prios diret\u00f3rios privados<\/li>\n\n\n\n<li>Acesse m\u00eddias compartilhadas atrav\u00e9s de <strong>MediaStore<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abordagem recomendada<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Para aplica\u00e7\u00f5es t\u00edpicas:\n<ul class=\"wp-block-list\">\n<li>Use o MediaStore ou <strong>SAF<\/strong> (<code>A\u00c7\u00c3O_ABRIR_DOCUMENTO<\/code>, <code>A\u00c7\u00c3O_CRIAR_DOCUMENTO<\/code>) para arquivos selecionados pelo usu\u00e1rio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Considere apenas <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> Se o seu aplicativo for realmente um gerenciador de arquivos, ferramenta de backup, aplicativo de seguran\u00e7a, etc.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Android 13 (API 33) \u2013 Divis\u00e3o de Permiss\u00f5es de M\u00eddia<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Permiss\u00f5es<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>LEIA_IMAGENS_DE_M\u00cdDIA<\/code> \u2013 acessar imagens<\/li>\n\n\n\n<li><code>LEIA_M\u00cdDIA_V\u00cdDEO<\/code> \u2013 acessar v\u00eddeos<\/li>\n\n\n\n<li><code>LER_M\u00cdDIA_\u00c1UDIO<\/code> \u2013 acessar \u00e1udio<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comportamento<\/strong>:\n<ul class=\"wp-block-list\">\n<li>As permiss\u00f5es de m\u00eddia s\u00e3o <strong>de gr\u00e3o fino<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Os usu\u00e1rios podem conceder acesso somente a imagens, somente a v\u00eddeos, etc.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>As regras de armazenamento com escopo do Android 11 permanecem em vigor.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Abordagem recomendada<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Solicite as permiss\u00f5es de m\u00eddia espec\u00edficas de que voc\u00ea precisa:\n<ul class=\"wp-block-list\">\n<li>Por exemplo, se voc\u00ea trabalha apenas com imagens, solicite apenas <code>LEIA_IMAGENS_DE_M\u00cdDIA<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Fazer <strong>n\u00e3o<\/strong> solicitar <code>LER_ARMAZENAMENTO_EXTERNO<\/code> No Android 13+, ele foi substitu\u00eddo pelas novas permiss\u00f5es de m\u00eddia.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Matriz R\u00e1pida (Conceitual)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Android 9 e vers\u00f5es anteriores<\/strong>\n<ul class=\"wp-block-list\">\n<li>O acesso ao armazenamento externo \u00e9 amplo e controlado por READ\/WRITE_EXTERNAL_STORAGE.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 10<\/strong>\n<ul class=\"wp-block-list\">\n<li>O armazenamento com escopo foi introduzido, mas existem sa\u00eddas de emerg\u00eancia (<code>solicitarArmazenamentoExternoLegado<\/code>)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 11<\/strong>\n<ul class=\"wp-block-list\">\n<li>O armazenamento com escopo foi implementado e os switches legados foram removidos.<\/li>\n\n\n\n<li><code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> Aparece, mas \u00e9 altamente restrito.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Android 13<\/strong>\n<ul class=\"wp-block-list\">\n<li>O acesso \u00e0 m\u00eddia foi dividido em <code>LEIA_M\u00cdDIA_*<\/code> permiss\u00f5es<\/li>\n\n\n\n<li>As mesmas regras de armazenamento com escopo, mas com controle de usu\u00e1rio mais detalhado.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Principais conclus\u00f5es<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u00e3o assuma que &quot;funciona em um dispositivo Android 13&quot; significa que funcionar\u00e1 em todos os lugares; os fabricantes de equipamentos originais (OEMs) e os relat\u00f3rios do sistema podem ser inconsistentes.<\/li>\n\n\n\n<li>Para <strong>Android 11+<\/strong>, Pense em termos de:\n<ul class=\"wp-block-list\">\n<li><strong>Diret\u00f3rios privados de aplicativos + MediaStore + SAF<\/strong>, n\u00e3o \u201ccru\u201d <code>\/sdcard<\/code> acesso&quot;\u201d<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Tratar <code>GERENCIAR ARMAZENAMENTO EXTERNO<\/code> como um <strong>\u00faltimo recurso<\/strong> Para tipos de aplicativos muito espec\u00edficos, especialmente se voc\u00ea planeja publicar no Google Play.<\/li>\n\n\n\n<li>Sempre teste em <strong>m\u00faltiplos dispositivos e vers\u00f5es do Android<\/strong>, especialmente no que diz respeito a permiss\u00f5es e armazenamento.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Este artigo \u00e9 fruto da minha pr\u00f3pria experi\u00eancia de depura\u00e7\u00e3o e adapta\u00e7\u00e3o em projetos reais de Android (incluindo um dispositivo Samsung com Android 13). O GPT apenas auxiliou na tradu\u00e7\u00e3o e no aprimoramento do texto; todo o conte\u00fado t\u00e9cnico e as decis\u00f5es s\u00e3o de minha autoria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/blockquote>","protected":false},"excerpt":{"rendered":"<p>Quando tentei implementar um requisito muito simples \u2014 baixar uma imagem e salv\u00e1-la no armazenamento local \u2014 tudo parecia bem a princ\u00edpio. Mesmo c\u00f3digo, mesma funcionalidade, mas um dispositivo com Android 13 simplesmente se recusou a exibir a solicita\u00e7\u00e3o de permiss\u00e3o. Foi assim que essa pequena tarefa de &quot;baixar imagem&quot; se transformou em uma profunda investiga\u00e7\u00e3o sobre [\u2026]<\/p>","protected":false},"author":10,"featured_media":3804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"","rank_math_description":"","footnotes":""},"categories":[35],"tags":[],"class_list":["post-3803","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledge-hub"],"_links":{"self":[{"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/posts\/3803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/comments?post=3803"}],"version-history":[{"count":4,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/posts\/3803\/revisions"}],"predecessor-version":[{"id":3812,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/posts\/3803\/revisions\/3812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/media\/3804"}],"wp:attachment":[{"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/media?parent=3803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/categories?post=3803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/imastudio.com\/pt\/wp-json\/wp\/v2\/tags?post=3803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}