web-dev-qa-db-fra.com

Comment obtenir l'URI à partir d'un fichier d'actif?

J'ai essayé d'obtenir le chemin d'accès URI pour un fichier d'actif.

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

Quand je vérifie si le fichier existe, je vois que ce fichier n'existe pas

File f = new File(filepath);
if (f.exists() == true) {
    Log.e(TAG, "Valid :" + filepath);
} else {
    Log.e(TAG, "InValid :" + filepath);
}

Quelqu'un peut-il me dire comment mentionner le chemin absolu d'un fichier existant dans le dossier des ressources

110
Titus

Il n'y a pas de "chemin absolu pour un fichier existant dans le dossier des actifs". Le contenu du dossier assets/ de votre projet est conditionné dans le fichier APK. Utilisez un objet AssetManager pour obtenir un InputStream sur un actif.

Pour WebView, vous pouvez utiliser le schéma fileUri de la même manière que vous utiliseriez une URL. La syntaxe des ressources est file:///Android_asset/... (remarque: trois barres obliques), où Ellipsis est le chemin du fichier situé dans le dossier assets/.

145
CommonsWare

L'URL correcte est:

file:///Android_asset/RELATIVEPATH

où RELATIVEPATH est le chemin d'accès à votre ressource par rapport au dossier des actifs.

Note les 3/dans le schéma. La vue Web ne chargerait aucune de mes ressources sans 3. J'ai essayé 2 comme commenté (précédemment) par CommonsWare et cela ne fonctionnerait pas. Ensuite, j'ai regardé la source de CommonsWare sur github et remarqué la barre oblique supplémentaire.

Ces tests n'ont cependant été effectués que sur l'émulateur 1.6 Android, mais je doute que ce soit différent sur un périphérique réel ou une version ultérieure.

EDIT: CommonsWare a mis à jour sa réponse pour refléter ce changement minime. Donc, j'ai édité cela, donc cela a encore du sens avec sa réponse actuelle.

68
Russ

enter image description here

Assurez-vous que votre dossier d'actifs est correctement placé.

8
Chuanhang.gu

S'il vous plaît essayez ce code fonctionne bien

 Uri imageUri = Uri.fromFile(new File("//Android_asset/luc.jpeg"));

    /* 2) Create a new Intent */
    Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
            .setData(imageUri)
            .build();
7
Raaz Thakur

Fonctionne pour WebView mais semble échouer sur URL.openStream(). Vous devez donc distinguer les protocoles fichier: // et les gérer via AssetManager comme suggéré.

6
Gaylord Zach
InputStream is = getResources().getAssets().open("terms.txt");
    String textfile = convertStreamToString(is);

public static String convertStreamToString(InputStream is)
            throws IOException {
            Writer writer = new StringWriter();

            char[] buffer = new char[2048];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is,
                        "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            } finally {
                is.close();
            }
            String text = writer.toString();
            return text;
3
jayesh kavathiya

Essayez ceci: ça marche

InputStream in_s = getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

si vous avez une exception de valeur nulle, essayez celle-ci:

InputStream in_s1 =   TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

TopBranData est une classe

3
Jaspreet Singh

essaye ça :

Uri uri = Uri.parse("Android.resource://"+getPackageName()+"/"+R.raw.cat); 

Je l'avais fait et cela a fonctionné

1
Nyle

Enfin, j'ai trouvé un moyen d'obtenir le chemin d'un fichier présent dans les actifs à partir de this dans Kotlin. Ici, nous copions le fichier d’actifs dans le cache et obtenons le chemin d’accès à partir de ce fichier.

@Throws(IOException::class)
fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
    .also {
        it.outputStream().use { cache -> context.assets.open(fileName).use { it.copyTo(cache) } }
    }

Obtenir le chemin du fichier comme:

val filePath =  getFileFromAssets(context, "fileName.extension").absolutePath
0
Shylendra Madda

Oui, vous ne pouvez pas accéder à votre dossier de lecteurs depuis votre téléphone Android ou votre émulateur, car votre ordinateur et Android sont deux systèmes d’exploitation différents. Je choisirais le dossier res de Android. _ parce qu'il a de bonnes méthodes de gestion des ressources. Jusqu'à ce que et à moins que vous n'ayez une très bonne raison de placer votre fichier dans le dossier des actifs. Au lieu de cela, vous pouvez le faire

try {
      Resources res = getResources();
      InputStream in_s = res.openRawResource(R.raw.yourfile);

      byte[] b = new byte[in_s.available()];
      in_s.read(b);
      String str = new String(b);
    } catch (Exception e) {
      Log.e(LOG_TAG, "File Reading Error", e);
 }
0
willnotquit