0
votes

Comment choisir une vidéo de la galerie dans la nouvelle API?

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;
    }

    }


1 commentaires

Le sujet de votre message n'a rien à voir avec le problème décrit dans votre message. S'il vous plaît adapter.


4 Réponses :


0
votes

Cela vous permettra de choisir une vidéo à partir de la galerie: xxx

lire Ceci pour plus d'informations sur intention et mediatstore .


3 commentaires

Je reçois le chemin correct mais cela me donne java.nio.file.accessdeniedException: /storage/emulated/0/dcim/camera/vid_20191105_203230.mp4


Veuillez ajouter une autorisation de dépendance de stockage


Veuillez suivre ce lien: Stackoverflow.com/Questtions/47164357/... Cela peut vous aider.



0
votes

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])
                    )
                }


0 commentaires

0
votes

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>

Voir https://developer.android.com/reference/andrroid/ fournisseur / mediatstore.mediacolumns.html # données p>

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>

https://developer.android.com/reference/andrroid/content/contentresolver#OpenFileDeSossor (android.net.uri,% 20java.lang.string.string ) 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
                }
            }
        }
    }


5 commentaires

Mis à jour pour ajouter un exemple de code sur la manière d'obtenir un filedescriptor


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 ou cadre d'accès au stockage avec action_create_document 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



0
votes

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"/>


0 commentaires