2010-07-08 23 views
5

Estoy escribiendo algunos archivos a la tarjeta SD. Mi versión de Android es 2.1. No estoy estableciendo ningún permiso en el archivo de manifiesto, pero me permite escribir en la tarjeta SD.Escribiendo a la tarjeta SD

Háganme saber por qué este comportamiento. solo WRITE_EXTERNAL_STORAGE en los controles de manifiesto escriben en la tarjeta SD o en cualquier otra configuración que deba hacer.

gracias Gururaja B O

Respuesta

2

¿Está recopilando con el nivel API 3 o menos? Ese permiso se agregó en API nivel 4 (Android 1.6), por lo que todas las aplicaciones compiladas con API nivel 3 (para compatibilidad con teléfonos que aún ejecutan 1.5) tendrán ese permiso automáticamente.

+0

Estoy usando la base de código Eclair para construir las imágenes del sistema, que tiene un nivel de API mayor que 3. Si necesito modificar cualquier otra configuración además de verificar el nivel de la API? –

0

He creado un método utils para verificar que una tarjeta SD esté disponible en el dispositivo o no, y obtenga la ruta de la tarjeta SD en el dispositivo si está disponible.

Puede copiar 2 métodos a continuación en la clase de su proyecto que necesite. Crea la carpeta de tu proyecto en la ruta devuelta y escribe datos en ella. Eso es todo.

public String isRemovableSDCardAvailable() { 
    final String FLAG = "mnt"; 
    final String SECONDARY_STORAGE = System.getenv("SECONDARY_STORAGE"); 
    final String EXTERNAL_STORAGE_DOCOMO = System.getenv("EXTERNAL_STORAGE_DOCOMO"); 
    final String EXTERNAL_SDCARD_STORAGE = System.getenv("EXTERNAL_SDCARD_STORAGE"); 
    final String EXTERNAL_SD_STORAGE = System.getenv("EXTERNAL_SD_STORAGE"); 
    final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE"); 

    Map<Integer, String> listEnvironmentVariableStoreSDCardRootDirectory = new HashMap<Integer, String>(); 
    listEnvironmentVariableStoreSDCardRootDirectory.put(0, SECONDARY_STORAGE); 
    listEnvironmentVariableStoreSDCardRootDirectory.put(1, EXTERNAL_STORAGE_DOCOMO); 
    listEnvironmentVariableStoreSDCardRootDirectory.put(2, EXTERNAL_SDCARD_STORAGE); 
    listEnvironmentVariableStoreSDCardRootDirectory.put(3, EXTERNAL_SD_STORAGE); 
    listEnvironmentVariableStoreSDCardRootDirectory.put(4, EXTERNAL_STORAGE); 

    File externalStorageList[] = null; 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     externalStorageList = getContext().getExternalFilesDirs(null); 
    } 
    String directory = null; 
    int size = listEnvironmentVariableStoreSDCardRootDirectory.size(); 
    for (int i = 0; i < size; i++) { 
     if (externalStorageList != null && externalStorageList.length > 1 && externalStorageList[1] != null) 
      directory = externalStorageList[1].getAbsolutePath(); 
     else 
      directory = listEnvironmentVariableStoreSDCardRootDirectory.get(i); 

     directory = canCreateFile(directory); 
     if (directory != null && directory.length() != 0) { 
      if (i == size - 1) { 
       if (directory.contains(FLAG)) { 
        Log.e(getClass().getSimpleName(), "SD Card's directory: " + directory); 
        return directory; 
       } else { 
        return null; 
       } 
      } 
      Log.e(getClass().getSimpleName(), "SD Card's directory: " + directory); 
      return directory; 
     } 
    } 
    return null; 
} 

/** 
* Check if can create file on given directory. Use this enclose with method 
* {@link BeginScreenFragement#isRemovableSDCardAvailable()} to check sd 
* card is available on device or not. 
* 
* @param directory 
* @return 
*/ 
public String canCreateFile(String directory) { 
    final String FILE_DIR = directory + File.separator + "hoang.txt"; 
    File tempFlie = null; 
    try { 
     tempFlie = new File(FILE_DIR); 
     FileOutputStream fos = new FileOutputStream(tempFlie); 
     fos.write(new byte[1024]); 
     fos.flush(); 
     fos.close(); 
     Log.e(getClass().getSimpleName(), "Can write file on this directory: " + FILE_DIR); 
    } catch (Exception e) { 
     Log.e(getClass().getSimpleName(), "Write file error: " + e.getMessage()); 
     return null; 
    } finally { 
     if (tempFlie != null && tempFlie.exists() && tempFlie.isFile()) { 
      // tempFlie.delete(); 
      tempFlie = null; 
     } 
    } 
    return directory; 
} 
Cuestiones relacionadas