web-dev-qa-db-fra.com

Comment passer un chemin de fichier qui se trouve dans le dossier des ressources vers un fichier (chemin de chaîne)?

Duplicata possible:
Android - Comment déterminer le chemin absolu pour un fichier spécifique à partir des actifs?

J'essaie de passer un fichier à la classe File (String path). Existe-t-il un moyen de trouver le chemin absolu du fichier dans le dossier des actifs et de le transmettre à File (). J'ai essayé file:///Android_asset/myfoldername/myfilename comme chaîne de chemin mais cela n'a pas fonctionné. Une idée?

30
akd

AFAIK, vous ne pouvez pas créer un File à partir d'un fichier d'actifs car ceux-ci sont stockés dans l'apk, cela signifie qu'il n'y a pas de chemin vers un dossier d'actifs.

Mais, vous pouvez essayer de créer ce File en utilisant un tampon et le AssetManager (il donne accès aux fichiers d'actifs bruts d'une application).

Essayez de faire quelque chose comme:

AssetManager am = getAssets();
InputStream inputStream = am.open("myfoldername/myfilename");
File file = createFileFromInputStream(inputStream);

private File createFileFromInputStream(InputStream inputStream) {

   try{
      File f = new File(my_file_name);
      OutputStream outputStream = new FileOutputStream(f);
      byte buffer[] = new byte[1024];
      int length = 0;

      while((length=inputStream.read(buffer)) > 0) {
        outputStream.write(buffer,0,length);
      }

      outputStream.close();
      inputStream.close();

      return f;
   }catch (IOException e) {
         //Logging exception
   }

   return null;
}

Faites-moi part de vos progrès.

55
yugidroid

À moins que vous ne les déballiez, les actifs restent dans l'apk. Par conséquent, il n'y a pas de chemin que vous pouvez insérer dans un fichier. Le chemin que vous avez indiqué dans votre question fonctionnera avec/dans une WebView, mais je pense que c'est un cas particulier pour WebView.

Vous devrez décompresser le fichier ou l'utiliser directement.

Si vous avez un contexte, vous pouvez utiliser context.getAssets().open("myfoldername/myfilename"); pour ouvrir un InputStream sur le fichier. Avec InputStream, vous pouvez l'utiliser directement ou l'écrire quelque part (après quoi vous pouvez l'utiliser avec File).

9
nEx.Software