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.