3 votes

Convertir un fichier PATH en TreeUri (Storage Access Framework)

Dans mon application de galerie d'images, j'utilise l'image du fournisseur de contenu multimédia pour gonfler la vue du recycleur. En appuyant longuement sur une image, je donne à l'utilisateur la possibilité de renommer ce fichier image. J'ai donc le chemin complet du fichier (Ex:- /storage/sdcard1/DCIM/100ANDRO/ak.jpg ) pour chaque image dans la vue du recycleur. Je veux ensuite renommer ce fichier.

Le problème est que le chemin de fichier fourni est celui de la carte SD externe, et pour Android 5 et plus, SAF (Storage Access Framework) est nécessaire pour écrire un fichier.

Nous utilisons donc généralement ce code pour renommer un fichier à l'aide de SAF:-

public void onActivityResult(int requestCode, int resultCode, Intent resultData){
    if (resultCode == RESULT_OK) {
        Uri treeUri = resultData.getData();
        getContentResolver().takePersistableUriPermission(treeUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION |
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
        DocumentFile newFIle = pickedDir.createFile("text/plain","MyFile")
        // or rename as
        pickedDir.renameTo("fdtd.jpg");
    } else {
        Log.d("test","NOt OK RESULT");
    }
}

Mais c'est le cas lorsque nous connaissons le TreeUri. Dans mon cas, je connais fle path et je veux donc le convertir en TreeUri.

4voto

Anku Agarwal Points 96

Pour convertir un chemin de fichier en uri, utilisez ceci:-

DocumentFile fileuri = DocumentFile.fromFile(new File(filepath));

Vous pouvez ensuite effectuer des opérations de suppression ou de renommage sur ce fichieruri.

0voto

Gorio Points 1072

Vous devez définir le chemin complet dans la méthode renameTo.

Utilisez mon exemple pour travailler.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        Uri selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);

        if (cursor != null) {
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            ImageView imageView = (ImageView) findViewById(R.id.image);
            imageView.setOnClickListener(this);

            Bitmap bmp = null;
            try {
                bmp = getBitmapFromUri(selectedImage);
            } catch (IOException e) {
                e.printStackTrace();
            }

            imageView.setImageBitmap(bmp);

            //get file
            File photo = new File(picturePath);

            //file name
            String fileName = photo.getName();

            //resave file with new name
            File newFile = new File(photo.getParent() + "/fdtd." + fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()) );

            photo.renameTo(newFile);
        }

    }
}

Rappelez-vous que dans mon exemple, je considère que l'extension par défaut du fichier original est maintenue, car si vous essayez de renommer PNG en JPG, vous risquez d'avoir des problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X