Comment déplacer / renommer le fichier du stockage interne de l'application vers un stockage externe sur Android?

Je télécharge des fichiers sur Internet et enregistre les données en continu dans un fichier temporaire dans le stockage interne de mon application donné par getFilesDir () .

Une fois le téléchargement terminé, je dois déplacer le fichier temporaire dans mon répertoire de téléchargement sur la mémoire externe (généralement une carte SD). Pour une raison quelconque, File.renameTo () ne fonctionne pas pour cela. Je suppose qu'il y a un problème parce que ce sont deux systèmes de fichiers distincts, mais je peux encore télécharger directement sur la carte SD et les URI du fichier sont corrects.

  • Comment désactiver le glissement du seul tiroir de navigation droit?
  • Mettre l'outil de mise en oeuvre pour se concentrer sur Camera2 API
  • Existe-t-il un concepteur de formulaire disponible pour Android Google?
  • Comment modifier la couleur de l'élément de liste Android sur le clic ou la sélection?
  • Mises à jour OTA pour l'application Android Device Owner (mode Kiosk)
  • Je ne peux pas demander à IntelliJ de reconnaître mon SDK Android
  • Existe-t-il un autre moyen simple et rapide de transférer ce fichier de la mémoire interne vers un externe ou est-ce que je dois faire une copie du flux d'octets et supprimer l'original?

  • Les méta-données de l'erreur Google Play Services v13 dans AndroidManifest
  • Notification à un moment précis
  • Android Cast v3: ne peut trouver aucun périphérique
  • Comment configurer l'image de manière dynamique dans Android?
  • Pourquoi la toile n'est-elle pas de la même taille que celle de OnDraw? (Android)
  • Comment imiter une étiquette nfc sur un téléphone Android
  • 8 Solutions collect form web for “Comment déplacer / renommer le fichier du stockage interne de l'application vers un stockage externe sur Android?”

    Pour copier des fichiers de la mémoire interne vers une carte SD et vice versa en utilisant le code suivant:

    public static void copyFile(File src, File dst) throws IOException { FileChannel inChannel = new FileInputStream(src).getChannel(); FileChannel outChannel = new FileOutputStream(dst).getChannel(); try { inChannel.transferTo(0, inChannel.size(), outChannel); } finally { if (inChannel != null) inChannel.close(); if (outChannel != null) outChannel.close(); } } 

    Et il fonctionne…

    La mémoire interne et externe est deux systèmes de fichiers différents. Par conséquent, renommerTo () échoue.

    Vous devrez copier le fichier et supprimer l'original

    Après avoir copié le fichier (comme les réponses de réponse de @barmaley ), n'oubliez pas de l'exposer à la galerie du périphérique, de sorte que l'utilisateur puisse le voir plus tard.

    La raison pour laquelle il doit être fait manuellement est que

    Android exécute un scan multimédia complet uniquement lors du redémarrage et lorsque (re) le montage de la carte SD

    (Comme le montre ce guide ).

    La façon la plus facile de le faire est d'envoyer une diffusion pour la numérisation à invoquer:

     Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent.setData(Uri.fromFile(outputFile)); context.sendBroadcast(intent); 

    Et voila! Vous pouvez maintenant afficher votre fichier dans la galerie du périphérique.

    Une alternative à la copie utilisant votre propre fonction est d'utiliser la classe de la bibliothèque Apache "FileUtils", dans la fonction appelée copyFile :

     FileUtils.copyFile(src, dst, true); 

    Pour le fichier Move, le meilleur moyen est de renommer son chemin avec un chemin différent et un exemple de nom:

     File from = new File(Environment.getExternalStorage().getAbsolutePath()+"/kaic1/imagem.jpg"); File to = new File(Environment.getExternalStorage().getAbsolutePath()+"/kaic2/imagem.jpg"); from.renameTo(to); 

    Imaginez que:

    • C'est le chemin interne: chemin interne
    • Et c'est un chemin externe: pathExternal

    Essayez avec ce code:

     public void moveIn (String pathInternal, String pathExternal) { File fInternal = new File (pathInternal); File fExternal = new File (pathExternal); if (fInternal.exists()) { fInternal.renameTo(fExternal); } } 

    Avez-vous apporté des modifications triviales au code @ barmaley?

     public boolean copyFile(File src, File dst) { boolean returnValue = true; FileChannel inChannel = null, outChannel = null; try { inChannel = new FileInputStream(src).getChannel(); outChannel = new FileOutputStream(dst).getChannel(); } catch (FileNotFoundException fnfe) { Log.d(logtag, "inChannel/outChannel FileNotFoundException"); fnfe.printStackTrace(); return false; } try { inChannel.transferTo(0, inChannel.size(), outChannel); } catch (IllegalArgumentException iae) { Log.d(logtag, "TransferTo IllegalArgumentException"); iae.printStackTrace(); returnValue = false; } catch (NonReadableChannelException nrce) { Log.d(logtag, "TransferTo NonReadableChannelException"); nrce.printStackTrace(); returnValue = false; } catch (NonWritableChannelException nwce) { Log.d(logtag, "TransferTo NonWritableChannelException"); nwce.printStackTrace(); returnValue = false; } catch (ClosedByInterruptException cie) { Log.d(logtag, "TransferTo ClosedByInterruptException"); cie.printStackTrace(); returnValue = false; } catch (AsynchronousCloseException ace) { Log.d(logtag, "TransferTo AsynchronousCloseException"); ace.printStackTrace(); returnValue = false; } catch (ClosedChannelException cce) { Log.d(logtag, "TransferTo ClosedChannelException"); cce.printStackTrace(); returnValue = false; } catch (IOException ioe) { Log.d(logtag, "TransferTo IOException"); ioe.printStackTrace(); returnValue = false; } finally { if (inChannel != null) try { inChannel.close(); } catch (IOException e) { e.printStackTrace(); } if (outChannel != null) try { outChannel.close(); } catch (IOException e) { e.printStackTrace(); } } return returnValue; } 

    Vous pouvez le faire en utilisant des opérations avec byte []

    Définissez dans votre classe:

      public static final String DATA_PATH = Environment.getExternalStorageDirectory().toString() + "/MyAppName/"; 

    puis:

     AssetManager assetManager = context.getAssets(); InputStream in = assetManager.open("data/file.txt"); OutputStream out = new FileOutputStream(DATA_PATH + "data/file.txt"); // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.