2011-01-27 24 views
86

He estado tratando de obtener la ruta URI para un archivo de activos.¿Cómo obtener URI de un archivo de activos?

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

Cuando puedo comprobar si existe el archivo que veo no existe ese archivo

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

¿Puede alguien decirme cómo puedo hablar de la ruta absoluta para un archivo existente en la carpeta de recursos

Respuesta

118

No existe una "ruta absoluta para un archivo existente en la carpeta de activos". El contenido de la carpeta assets/ de su proyecto está empaquetado en el archivo APK. Use un objeto AssetManager para obtener un InputStream en un activo.

EDITAR

Para reparar uno de mis comentarios a continuación, la sintaxis de URL para los activos es file:///android_asset/... (nota: tres barras).

+0

La razón por la que quería una ruta absoluta era que quería un URI para el archivo. – Titus

+23

'file: // android_asset/...', donde '...' es la ruta relativa dentro del directorio 'assets /' de su proyecto. – CommonsWare

+0

Intenté eso y todavía lo entiendo como una ruta inválida. He verificado que el apk contiene el archivo txt dentro de su carpeta de activos – Titus

6

Funciona para WebView pero parece fallar en URL.openStream(). Por lo tanto, debe distinguir los protocolos file: // y manejarlos a través de AssetManager según lo sugerido.

58

la URL correcta es:

file:///android_asset/RELATIVEPATH 

donde relativePath es la ruta de acceso al recurso relativa a la carpeta activos.

Nota 3/'s en el esquema. La vista web no cargaría ninguno de mis recursos sin el 3. Intenté 2 como (anteriormente) comentado por CommonsWare y no funcionaría. Luego miré a la fuente de CommonsWare en github y noté la barra inclinada adicional.

Esta prueba solo se realizó en el emulador de Android 1.6 pero dudo que sea diferente en un dispositivo real o una versión superior.

EDIT: CommonsWare actualizó su respuesta para reflejar este pequeño cambio. Así que he editado esto, así que todavía tiene sentido con su respuesta actual.

2
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; 
-2

probar esto:

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

que había lo hizo y funcionó

+2

En realidad, funciona Verifique [ContentResolver.openAssetFileDescriptor] (https://developer.android.com/reference/android/content/ContentResolver.html#openAssetFileDescriptor (android.net.Uri% 2C% 20java.lang.String)) –

4

Pruebe esto: funciona

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

si tiene valor de la excepción nula prueba este :

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

TopBranData es una clase

+0

Si no funciona, por favor Pruebe este: InputStream in_s1 = TopBrandData.class.getResourceAsStream ("/ assets/TopBrands.xml"); –

0

Sí usted no puede acceder a su carpeta de la unidad desde su teléfono Android o un emulador porque su equipo y Android son dos OS.I diferente sería ir a la carpeta res de Android, ya que tiene una buena gestión de los recursos métodos. Hasta ya menos que tengas muy buenas razones para poner tu archivo en la carpeta de activos.En su lugar puede hacer esto

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

a mí me funcionó probar este código

uri = Uri.fromFile(new File("//assets/testdemo.txt")); 
    File f = new File(testfilepath); 
    if (f.exists() == true) { 
    Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show(); 
    } else { 
    Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show(); 
} 
6

enter image description here

Asegúrese, sus activos carpeta ponen en la posición correcta.

3

Inténtelo este código funciona 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(); 
Cuestiones relacionadas