Come ottenere l'URI da un file di risorse?


127

Ho cercato di ottenere il percorso URI per un file di risorse.

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

Quando controllo se il file esiste, vedo che il file non esiste

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

Qualcuno può dirmi come posso menzionare il percorso assoluto di un file esistente nella cartella delle risorse

Risposte:


160

Non esiste un "percorso assoluto per un file esistente nella cartella degli asset". Il contenuto della assets/cartella del progetto è impacchettato nel file APK. Usa un AssetManageroggetto per ottenere unInputStream una risorsa.

Per WebView, puoi usare lo file Urischema più o meno allo stesso modo in cui useresti un URL. La sintassi per le risorse è file:///android_asset/...(nota: tre barre) in cui i puntini di sospensione sono il percorso del file all'interno della assets/cartella.


32
file://android_asset/..., dove si ...trova il percorso relativo all'interno della assets/directory del progetto .
Commons War

4
Ecco un esempio di progetto che utilizza file://android_asset/, anche se non per a Uri: github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
CommonsWare

20
@CommonsWare sembra che tu abbia perso un '/' nel tuo URI. Dovrebbe essere file:///.
ThomasW,

7
Ho provato come new File("file:///android_asset/sounds/beep.mid");, ma il file dei risultati non esiste. Qualche idea? Il file PS è nella assets/sounds/cartella.
zio Lem

3
È giusto che "file: ///android_asset/..." funzioni solo in WebView e non è possibile ottenere InputStream utilizzando URI / URL / Uri all'esterno di WebView?
Lubbo,

74

L'URL corretto è:

file:///android_asset/RELATIVEPATH

dove RELATIVEPATH è il percorso della risorsa relativa alla cartella delle risorse.

Nota i 3 / 'nello schema. La visualizzazione Web non caricarebbe nessuna delle mie risorse senza la 3. Ho provato 2 come (precedentemente) commentato da CommonsWare e non funzionerebbe. Poi ho guardato la fonte di CommonsWare su github e ho notato la barra aggiuntiva in avanti.

Questo test però è stato fatto solo sull'emulatore Android 1.6 ma dubito che sia diverso su un dispositivo reale o versione successiva.

EDIT: CommonsWare ha aggiornato la sua risposta per riflettere questo piccolo cambiamento. Quindi l'ho modificato in modo che abbia ancora senso con la sua risposta attuale.


Non funziona più String fileName = "file:///android_asset/file.csv"; System.out.println(new File(fileName).exists()); // prints false
Elgirhath

@Elgirhath il costruttore per File che accetta una stringa si aspetta un percorso non un URI . Non scrivo codice per Android da alcuni anni e le cose potrebbero essere cambiate. Non sono sicuro se è possibile accedere alla cartella delle risorse incorporate utilizzando una normale classe di file java. Mi sembra di ricordare che devi usare un AssetManager . I file nella cartella delle risorse vengono posizionati sul dispositivo nell'APK in bundle di sola lettura e compressi (gli APK sono in realtà file zip), quindi più lavoro per rileggerlo. Prova qualcosa del generenew File(new URI(filename))
Russ,

10

Si prega di provare questo codice funzionando bene

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

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

8

Alla fine, ho trovato un modo per ottenere il percorso di un file presente nelle risorse da questa risposta in Kotlin. Qui stiamo copiando il file delle risorse nella cache e ottenendo il percorso del file da quel file della cache.

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

Ottieni il percorso del file come:

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

1
Si noti che se fileNamehanno directory dir/file. Si bloccherà con il percorso cache/dir/fileinesistente. Inoltre penso che sia meglio avere un controllo if(!it.exist)all'interno del alsoblocco, quindi non copierà il file ogni volta che anche il file è già nella cache
Yeung

@ShylendraMadda, @Yeung, if(!it.exist)genera un riferimento irrisolto di errore. qualche soluzione?
Binrebin,

Verificare che il file esista nella cache con quel nome file? @binrebin
Shylendra Madda,

@ShylendraMadda, conosco solo il nome file. Possiamo caricarlo con lo script senza conoscere l'uri
binrebin del

Penso che if(!it.exist)dovrei mettere prima it.outputStream()...
Yeung il

7

inserisci qui la descrizione dell'immagine

Assicurati che la cartella delle risorse sia posizionata correttamente.


Puoi metterlo dove vuoi e definire il percorso nel tuo file build.gradle come seguesourceSets { main { assets.srcDirs = ['src/main/assets'] } }
Marcel Bro

2
Come ottenere il percorso di hello.html? si prega di aggiungere
Rohit Singh

6

Funziona per WebView ma sembra non riuscire URL.openStream(). Quindi è necessario distinguere i protocolli file: // e gestirli tramite AssetManager come suggerito.


4

Prova questo, funziona:

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

Se ricevi un'eccezione di valore Null, prova questo (con classe TopBrandData):

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

Se non funziona, prova questo: InputStream in_s1 = TopBrandData.class.getResourceAsStream ("/ assets / TopBrands.xml");
Jaspreet Singh,

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

1

prova questo :

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

L'avevo fatto e ha funzionato


2
In realtà funziona. Controlla ContentResolver.openAssetFileDescriptor
Hippo Seven

1
Lavorato. Molte grazie. Lol, sto solo cercando il file interno dell'URI // CREATE RAW FOLDER INSIDE RES, POI IL NOME FILE CONTIENE SOLO un carattere..z0..9, NESSUNA MAIUSCOLO !!!
phnghue

0

Sì, non puoi accedere alla cartella dell'unità dal tuo telefono o emulatore Android perché il tuo computer e Android sono due sistemi operativi diversi. Vorrei andare alla cartella res di Android perché ha buoni metodi di gestione delle risorse. Fino a quando, a meno che tu non abbia ottime ragioni per inserire il tuo file nella cartella delle risorse. Invece puoi farlo

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

-7

Ha funzionato per me Prova questo codice

   uri = Uri.fromFile(new File("//assets/testdemo.txt"));
   String testfilepath = uri.getPath();
    File f = new File(testfilepath);
    if (f.exists() == true) {
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
    } else {
   Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.