J'essaie d'obtenir le chemin d'une vidéo dans la galerie, mais l'URI me donne quelque chose comme "/ Document / Vidéo: xxxx". Quand j'utilise getsPath (), je reçois toujours NULL.
J'ai mis en place un fichier FileProvider et a accordé toutes les autorisations, mais rien ne fonctionne. P>
//Start intent Intent intent = new Intent(); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent,"Select Video"), 1); //Turn URI to Path String getPath(Uri uri) { String[] projection = { MediaStore.Video.Media.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { // HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL. THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } else { return null; } }
4 Réponses :
Cela vous permettra de choisir une vidéo à partir de la galerie: lire Ceci pour plus d'informations sur intention code> et
mediatstore code>. p> p>
Je reçois le chemin correct mais cela me donne java.nio.file.accessdeniedException: /storage/emulated/0/dcim/camera/vid_20191105_203230.mp4 code>
Veuillez ajouter une autorisation de dépendance de stockage
Veuillez suivre ce lien: Stackoverflow.com/Questtions/47164357/... Cela peut vous aider.
Ajouter ci-dessous dépendance dans Build.Gradle (App):
val surveyImagesParts: Array<MultipartBody.Part?> = arrayOfNulls(imageBase64.size) for (index in imageBase64.indices) { surveyImagesParts[index] = MultipartBody.Part.createFormData( "message", imageBase64[index].name, RequestBody.create(MediaType.parse("*/*"), imageBase64[index]) ) }
La partie de cueillette n'est pas le problème, vous obtenez un dos URI. Le problème est par défaut un chemin sans signification, car vous ne pourrez y accéder.
mediastore.video.media.data p>
Cette constante a été obsolète au niveau de l'API 29. Les applications peuvent ne pas disposer d'autorisations de système de fichiers pour accéder directement à ce chemin. Au lieu d'essayer d'ouvrir ce chemin directement, les applications doivent utiliser le contenuSolver # OpenFileDedescriptor (URI, String) pour avoir accès. p> blockquote>
Même si vous pouviez obtenir un chemin, vous n'auriez pas la permission de l'utiliser, vous devez utiliser
contentResolver #openfiledescriptor (Uri, String) Code> Pour avoir accès. P>
Je vous suggère de lire https://developer.andrid.com/training/data-storage/files/external-scoped Pour fonctionner avec stockage sur la dernière API P>
Mise à jour: Exemple supplémentaire de Comment gérer le résultat de l'intention
code> appelez et obtenez un java
filedescriptor code> qui peut être transmis à la plupart des opérations Java IO. p>
@Override protected void onActivityResult(int requestCode, int resultCode, Intent resultData) { super.onActivityResult(requestCode, resultCode, resultData); Uri uri = null; // The `requestCode` was `1` in the code in the question if (requestCode == 1 && resultCode == RESULT_OK) { if (resultData != null) { uri = resultData.getData(); try { // Open for Read ParcelFileDescriptor pfd = this.getContentResolver(). openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = pfd.getFileDescriptor(); // Now do something fileDescriptor like read the input Stream FileInputStream fileInputStream = new FileInputStream( fileDescriptor); .... } catch (Exception e) { // Do something with Exceptions } } } }
Mis à jour pour ajouter un exemple de code sur la manière d'obtenir un filedescriptor code>
Merci encore, le fichier est censé être une vidéo, puis-je écrire ces octets à un nouveau fichier (copie)?
Oui, vous pouvez écrire des fichiers, mais en fonction de l'endroit où vous souhaitez l'enregistrer, vous devrez peut-être utiliser mediatstore code> ou
cadre d'accès au stockage code> avec
action_create_document code> mais vous n'aura pas accès au chemin avec ces méthodes
Je vais l'enregistrer à GetExternalfilesDir (). Comment puis-je le faire?
Je vous suggère de poser une autre question comme des fichiers d'écriture sont hors de portée de cette question
Utilisez ci-dessous la permission dans le fichier manifeste et si votre appareil est guimauve et ci-dessus, donnez également la permission d'exécution.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Le sujet de votre message n'a rien à voir avec le problème décrit dans votre message. S'il vous plaît adapter.