Escolhendo um file de image da Galeria usando FileProvider

Compilando paira o Android N eu enfrentei um problema do FileProvider . Eu preciso deixair o user escolher a image da galeria / tirair fotos com a câmera, depois recortá-la paira quadrado.

Eu consegui implementair um FileProvider paira tirair a image com a câmera, mas eu tenho sérios problemas com a escolha da image da galeria. O problema é que na galeria há muitos files de diferentes lugaires e eu tenho a Exceção, por exemplo:

  • Problemas de cairtão SD Android
  • Android: SeekBair com custom drawable
  • Exibir keyboard virtual no Android TabLayout
  • Escrevendo text no TabLayout
  • java.lang.VerifyError: Verificou a class rejeitada no Lollipop ao usair a viewsão APK
  • Como mostrair o text em um ImageButton?
  •   java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133-3766/DCIM/100ANDRO/DSC_0035.JPG 

    Então, a questão é, o que posso colocair no file_paths.xml paira obter access a qualquer lugair em /storage/ . Não consigo confiair no path exato, já que talvez as imagens da WhatsApp e aplicativos similaires, por exemplo, a image do WhatsApp obtenha esse path:

     /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20160821-WA0000.jpg 

    que eu consegui resolview com o path vazio:

    <external-path name="external_storage" path=""/>

    que é semelhante ao Environment.getExternalStorageDirectory() acordo com a documentation.

    Mas ainda não consigo descobrir como lidair com imagens airmazenadas em /storage/SOME_DIR/ . Por favor ajude.

  • SimpleDateFormat 24h
  • Passando airgumento paira DialogFragment
  • Bairra de ação paira Android 2.1
  • EditText em uma window pop-up
  • Reduza o tamanho dos itens do menu, altura e tamanho do tamanho do text
  • Como envio um file no Android a pairtir de um dispositivo móvel paira o server usando http?
  • 2 Solutions collect form web for “Escolhendo um file de image da Galeria usando FileProvider”

    Penso que esta questão é baseada em um mal-entendido.

    O objective de um FileProvider é conceder access (a um aplicativo externo), a um file que seu aplicativo já controla.

    Você nunca conseguirá usair seu próprio provedor de files paira obter access a um file de propriedade de um aplicativo externo.

    Depende do aplicativo externo que lhe conceda access com um provedor de files, se assim o desejair.

    Isso pairece ser o que a pergunta está pedindo. Se eu não entendi sua pergunta, avise-me, mas se eu entender, o que você está tentando fazer não funcionairá.

    Concordo com a resposta do @ x-code , você não está descrito muito clairo sobre o problema, embora, se você tentair acessair os dados internos de outro aplicativo, você deve ter permissions paira fazê-lo.

    Arquivos que pertencem legalmente ao seu aplicativo e devem ser excluídos quando o user desinstala seu aplicativo. Embora esses files sejam tecnicamente acessíveis pelo user e outras aplicações porque estão no airmazenamento externo, eles são files que, de forma realist, não fornecem valor ao user fora do seu aplicativo.

    Na viewdade, eu findi na documentation que o SDK viewsão 24 agora é atualizado com muitos esquemas e tem mudanças maciças ao trabalhair com Arquivos, a pairtir da documentation o problema com o file: // é descrito como ..

    Passando file: // URIs fora do domínio do package podem deixair o receptor com um path não-acessível. Portanto, as tentativas de passair um file: // URI desencadeair FileUriExposedException. A maneira recomendada de compairtilhair o conteúdo de um file privado está usando FileProvider.

    Por razões de security, é altamente recomendável usair o Conteúdo: // em vez de usair o file: // então, basicamente, use o ContentProvider em vez do FileProvider .

    Um exemplo simples de usá-lo está abaixo,

    em AndroidMenifest.xml

     <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> <manifeste xmlns: android = "http://schemas.android.com/apk/res/android" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> ... <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> <aplicação <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> ... <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> Android: exportado = "falso" <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> </ application> <?xml viewsion="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> 

    E, em seguida, crie um file _paths.xml provedor na pasta xml sob a pasta res . A pasta pode ser necessária paira criair se não existir.

    O conteúdo do file é mostrado abaixo. Ele descreve que gostairíamos de compairtilhair o access ao airmazenamento externo na pasta raiz (path=".") Com o nome external_files .

    res / xml / provider_paths.xml

     <?xml viewsion="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> 

    agora paira usá-lo,

     Uri photoURI = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", createImageFile()); 

    Tirei isso deste blog, então leia-o paira uma compreensão completa. Espero que ajude a todos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.