|   FOROS      |     Tutoriales    |     KIO4 |      
   Inicio B4A (Basic4Android) App inventor 2 Arduino
   Elastix - VoIP Cosas de Windows Webs interesantes  Telecomunicaciones

 


Nuevo concurso para España, Argentina, Brasil, Chile, Colombia, Ecuador, México, Perú y Portugal.

Nueva sección en esta web: Elastix - VoIP

¿Qué es esto?

- Monta un servidor telefónico en tu ordenador para poderte comunicar mediante tu móvil con otros móviles que estén en tu red Wifi. Parecido a Skipe o Whatsapp-teléfono, pero en este caso tú controlas al servidor.

- Si sabes abrir puertos del router, también puedes comunicarte con tu móvil de una red Wifi a teléfonos de otra red Wifi.

- También puedes comunicarte con teléfonos "normales", pero para eso necesitas un dispositivo que vale unos 60 €.

- Es muy recomendable aprender el funcionamiento de este servidor telefónico Asterisk-Elastix.

 Elastix - VoIP

 

B4A en español - Juan Antonio Villalpando
(BASIC4Android)

-- Tutorial de B4A --

Volver al índice del tutorial                    Return to index tutorial

____________________________

Basic4Android.

32.- Elegir archivos...

Tutoriales. Elegir archivos. Listar archivos. Guardar, leer y escribir

Presentación

Mediante la librería Dialogs, podemos elegir archivos, colores, día, hora, número...

El tutorial de la librería Dialogs lo encontramos en:
http://www.basic4ppc.com/android/help/dialogs.html

El tutorial de la utilización de archivos y directorios lo encontramos en:
http://www.basic4ppc.com/android/help/files.html

NOTA: Échale un vistazo al final de página donde hay aclaraciones con DirRoorExternal y resumen de trabajo con carpetas y archivos.

 

Vamos al Basic4Android

_______________________
1.- Librería Dialogs

Conociendo esta librería podemos elegir la Subrutina que necesitamos: elección de archivo, de colores, de números, de fecha...

Designer - Layout

 

 

El Botón Get File es que se utilizará para elegir un archivo, los demás botones se utilizan para elegir color, fecha, hora,...

 


Creamos mediante el Designer un layout con 10 Button.
Le llamamos Layout.

A los Button le damos de nombre:

btnDate
btnInput
btnTime
btnColor
btnColor2
btnColor3
btnNumber
btnFile
btnCustom1
btnCustom2

 

Cargamos la librería: Dialogs


 

Código del Basic4Android
 'Activity module
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
End Sub

Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.

Dim btnDate As Button
Dim btnInput As Button
Dim getTime As Button
Dim Bmp As Bitmap
Dim btnColor As Button
Dim btnColor2 As Button
Dim btnNumber As Button
Dim btnFile As Button
Dim btnCustom As Button

Dim lbl1 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Bmp.Initialize(File.DirAssets, "android48.png")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnInput_Click
Dim Id As InputDialog
'Id.PasswordMode = True
'Id.InputType = Id.INPUT_TYPE_DECIMAL_NUMBERS
'Id.InputType = Id.INPUT_TYPE_NUMBERS
'Id.InputType = Id.INPUT_TYPE_PHONE
Id.Input = ""
Id.Hint = "Enter some text!"
Id.HintColor = Colors.ARGB(196, 255, 140, 0)
ret = DialogResponse.CANCEL
ret = Id.Show("Input the required text", "B4A Input Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Id.Input, False) 
End Sub

Sub btnDate_Click
Dim Dd As DateDialog
Dd.Year = DateTime.GetYear(DateTime.Now)
Dd.Month = DateTime.GetMonth(DateTime.Now) 
Dd.DayOfMonth = DateTime.GetDayOfMonth(DateTime.Now)
ret = Dd.Show("Set the required date", "B4A Date Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Dd.DayOfMonth & "/" & Dd.Month & "/" & Dd.Year , False)
End Sub

Sub btnTime_Click
Dim td As TimeDialog
Dim txt As String

Td.Hour = DateTime.GetHour(DateTime.Now)
Td.Minute = DateTime.GetMinute(DateTime.Now)
Td.Is24Hours = True
ret = Td.Show("Set the required time", "B4A Time Dialog", "Yes", "No", "Maybe", Bmp)
ToastMessageShow(ret & " : " & Td.Hour & ":" & Td.Minute, False)
End Sub

Sub btnColor_Click
Dim cd As ColorDialog
Dim color As Int
cd.RGB = Colors.RGB(128, 128, 128)
ret = cd.Show("B4A Color Dialog", "Yes", "No", "Maybe", Bmp) 
ToastMessageShow(ret & " : " & cd.Red & " " & cd.Green & " " & cd.Blue, False)
Activity.Color = cd.RGB

End Sub

Sub btnColor2_Click
Dim cd As ColorPickerDialog
Dim color As Int
cd.RGB = Colors.DarkGray
ret = cd.Show("B4A ColorPicker Dialog", "Yes", "No", "Maybe", Bmp) 
ToastMessageShow(ret & " : " & cd.RGB, False)
Activity.Color = cd.RGB
End Sub

Sub btnColor3_Click
Dim cd As ColorDialogHSV
Dim color As Int
cd.Hue = 180
cd.Saturation = 0.5
cd.Value = 0.5
ret = cd.Show("B4A ColorPicker Dialog HSV", "Yes", "No", "Maybe", Bmp) 
ToastMessageShow(ret & " : " & cd.RGB, False)
Activity.Color = cd.RGB
End Sub

Sub btnNumber_Click
Dim nd As NumberDialog
nd.Digits = 10
nd.Number = -12345
nd.Decimal = 2
nd.ShowSign = True
ret = nd.Show("B4A Number Dialog", "Yes", "No", "Maybe", Bmp) 
ToastMessageShow(ret & " : " & nd.Number, False) 
End Sub

Sub btnFile_Click
Dim fd As FileDialog
fd.FastScroll = True
fd.FilePath = File.DirRootExternal ' also sets ChosenName to an emtpy string
'fd.FilePath = File.DirInternal
'fd.ShowOnlyFolders = true
'fd.FileFilter = ".txt" ' for example or ".jpg,.png" for multiple file types
ret = fd.Show("B4A File Dialog", "Yes", "No", "Maybe", Bmp) 
ToastMessageShow(ret & " : Path : " & fd.FilePath & CRLF & "File : " & fd.ChosenName, False) 
End Sub

Sub btnCustom_Click
Dim cd As CustomDialog
Dim pnl As Panel
pnl.Initialize("pnl")
Dim bgnd As ColorDrawable
bgnd.Initialize(Colors.Green, 5dip)
pnl.Background = bgnd
Dim btn1 As Button
btn1.Initialize("btn1")
btn1.Text = "Press me"
pnl.AddView(btn1, 80dip, 50dip, 60dip, 60dip)
lbl1.Initialize("")
pnl.AddView(lbl1, 50dip, 120dip, 120dip, 60dip)
cd.AddView(pnl, 5%x, 0%y, 77%x, 70%y) ' sizing relative to the screen size is probably best
ret = cd.Show("B4A Custom Dialog", "Yes", "No", "Maybe", Bmp) 
End Sub

Sub btnCustom2_Click
Dim cd As CustomDialog2
Dim pnl As Panel
pnl.Initialize("pnl")
Dim bgnd As ColorDrawable
bgnd.Initialize(Colors.Cyan, 5dip)
pnl.Background = bgnd
Dim btn1 As Button
btn1.Initialize("btn1")
btn1.Text = "Press me"
pnl.AddView(btn1, 80dip, 50dip, 60dip, 60dip)
lbl1.Initialize("")
pnl.AddView(lbl1, 50dip, 120dip, 120dip, 60dip)
cd.AddView(pnl, 77%x, 60%y) ' sizing relative to the screen size is probably best
ret = cd.Show("B4A Custom Dialog", "Yes", "No", "Maybe", Bmp) 
End Sub

Sub btn1_Click
lbl1.Text = "Pressed!"
lbl1.Color = Colors.Black
ToastMessageShow("Pressed!", False) 
End Sub

_______________________

2.- Elegir directorio y archivo

Basado en el código anterior vamos a crear un programa para elegir un directorio y un archivo.

- Habilitamos la librería Dialogs, como lo hicimos en el proyecto anterior.

- Creamos un Botón y dos Label mediante código.

- El directorio File.DirRootExternal es la tarjeta de memoria SD Card

- La tarjeta está "montada" en /mnt/sdcard

- Si desde el principio quisieramos posicionarnos en el directorio Android que está en la tarjeta, deberíamos poner:

fd.FilePath = File.Combine(File.DirRootExternal, "/Android/")

- Si quisieramos obtener la dirección absoluta pondríamos:

Label1.Text = "Todo = " & fd.FilePath & "/" & fd.ChosenName

NOTA: si no funciona con el DirRootExternal, cámbialo por el DirAssets.

Código del Basic4Android
' Juan Antonio Villalpando
' juana1991@yahoo.com

Sub Process_Globals

End Sub

Sub Globals
    Dim boton As Button
    Dim Label1, Label2 As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
      ' Crea Botón
       boton.Initialize("boton")
       Activity.AddView(boton, 5, 50, 260, 55) ' Posicion, ancho y alto
       boton.Text = "Pulsa para elegir archivos"
       
       ' Crea etiqueta Ruta
       Label1.Initialize("Label1")
       Label1.TextColor = Colors.Red
       Label1.Text = "Ruta = "
       Activity.AddView(Label1, 5, 150, 400, 90) ' Posicion, ancho y alto
       
        ' Crea etiqueta Archivo
        Label2.Initialize("Label2")
        Label2.TextColor = Colors.Red
        Label2.Text = "Archivo = "
        Activity.AddView(Label2, 5, 250, 400, 30) ' Posicion, ancho y alto       
                    
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub boton_Click
    Dim fd As FileDialog
    fd.FastScroll = True
    fd.FilePath = File.DirRootExternal ' Para ir a la raiz del SD Card
    ' fd.FilePath = File.Combine(File.DirRootExternal, "/Android/") ' Para ir a esa carpeta del SD Card
    ' fd.FileFilter = ".pdf" ' Para filtrar pdf
    ret = fd.Show("Elige archivo", "Sí", "No", "Tal vez", Null)    
    Label1.Text = "Ruta = " & fd.FilePath
    Label2.Text = "Archivo = " & fd.ChosenName
End Sub

_______________________

3.- Elegir archivos
(no hace falta librería Dialogs)

 

Mediante el siguiente código podemos ver un listado de archivos que se encuentran en /mnt/sdcard, este directorio se refiere a la tarjeta de memoria SD, que en el código se llama mediante DirRootExternal.

Para realizar este proyecto vamos al Designer y ubicamos: Label1, y un ListView1.
Luego guardamos el Designer llamándolo Layout.

Con este código no es necesario añadir ninguna librería.

- Mediante estas líneas podemos ver a la ruta de cada Directorio


' Msgbox(File.DirRootExternal, "")

' Msgbox(File.DirAssets, "")

' Msgbox(File.DirInternal, "")

' Msgbox(File.DirDefaultExternal, "")

 


Código del Basic4Android
Sub Process_Globals
    ' Juan Antonio Villalpando
    ' juana1991@yahoo.com
End Sub

Sub Globals
    Dim ListView1 As ListView
    Dim Label1 As Label
    Dim ruta, archivo As String
    Dim Listado As List
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Listado.Initialize
    Activity.LoadLayout("Layout")
'    Habilita las siguientes líneas para ver la ruta de los distintos directorios    
'    Msgbox(File.DirRootExternal, "")
'    Msgbox(File.DirAssets, "")
'    Msgbox(File.DirInternal, "")
'    Msgbox(File.DirDefaultExternal, "")

    ListFolderContent("/")
    ' ListFolderContent(File.DirRootExternal)
    
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub ListFolderContent(folder As String) As String

    ruta = folder
    Listado.Initialize

    Listado = File.ListFiles(ruta)
    Listado.Sort(True)
    ListView1.Clear
    
    ListView1.AddSingleLine("..") ' Directorio superior
    For n = 0 To Listado.Size-1
    archivo = Listado.Get(n)
  
    If File.IsDirectory(ruta, archivo)=True Then
    ListView1.AddTwoLines2(archivo, "DIR", archivo)
    Else
    ListView1.AddSingleLine(archivo)
    End If
    Next
 
End Sub


Sub ListView1_ItemClick (Position As Int, Value As String)

Try
        Activity.Title = File.Combine(ruta & "/", Value)
        Label1.Text = File.Combine(ruta & "/", Value)
        
        If Value = ".." Then
            ' Elimina el último directorio de la ruta
            ' /mnt/sdcard/Android/data --->>> /mnt/sdcard/Android
            ruta = ruta.SubString2(0, ruta.LastIndexOf("/"))
            If ruta ="" Then ruta ="/"
 
            ListFolderContent(ruta)
            Value = ""
            Activity.Title = File.Combine(ruta & "/", Value)
            Label1.Text = File.Combine(ruta & "/", Value)

        Else
            If File.IsDirectory (ruta, Value) Then
            ListFolderContent(File.Combine(ruta & "/", Value))
            End If
        
        End If
Catch
        
        Msgbox("Error al entrar en el directorio","error")
        Value=""
        ListFolderContent("/")
        
End Try

End Sub 

_______________________

4.- Otro programa: Elegir archivos
(no hace falta librería Dialogs)

 

Mediante el siguiente código podemos ver un listado de archivos que se encuentran en /mnt/sdcard, este directorio se refiere a la tarjeta de memoria SD, que en el código se llama mediante DirRootExternal.

Para realizar este proyecto vamos al Designer y ubicamos: Label1, Label2 y un ScrollView1.
Luego guardamos el Designer llamándolo Layout.

Con este código no es necesario añadir ninguna librería.

Código del Basic4Android
' Juan Antonio Villalpando
' juana1991@yahoo.com

Sub Process_Globals

End Sub

Sub Globals
    Dim label2 As Label
    Dim ScrollView1 As ScrollView
    Dim Send As Label    
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
Dim files As List

files = File.ListFiles(File.DirRootExternal) 'Toma todos los archivos de la raíz SD Card
ScrollView1.Panel.Height = 20dip * files.Size

For i = 0 To files.Size - 1
Dim Label1 As Label
Label1.Initialize("Label1")
Label1.Text = files.Get(i)
Label1.Tag=files.Get(i)
ScrollView1.Panel.AddView(Label1, 25dip, 1dip + i * 20dip, ScrollView1.Width, 18dip)

Next
End Sub

Sub Label1_Click
Send=Sender 

Label2.Text = File.DirRootExternal & "/" &  Send.Tag
End Sub

_______________________

5.- Ejemplos con archivos. Guardar, Leer y Escribir.
(no hace falta librería Dialogs)

NOTA: si tienes problemas al escribir en la SdCard (DirRootExternal), añade estas líneas en el AndroidManifest.xml

(Project / Manifest Editor)

AddPermission ("android.permission.WRITE_EXTERNAL_STORAGE")
AddPermission ("android.permission.READ_EXTERNAL_STORAGE")

____________________________________________________

En el tutorial del foro se explica las distintas posibilidades que tiene la lectura, escritura, borrado... de archivo:

http://www.basic4ppc.com/android/help/files.html

En los foros de Basic4Android en inglés explican y exponen el siguiente código como ejemplo de trabajo con archivos...

Foros de Basic4Android:
http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/6690-text-files.html

 

Código del Basic4Android
 Sub Process_Globals

End Sub

Sub Globals

End Sub

Sub Activity_Create(FirstTime As Boolean)
    If File.ExternalWritable = False Then
        Msgbox("Cannot write on storage card.", "")
        Return
    End If
    SaveStringExample
    ReadStringExample
    
    WriteListExample
    ReadListExample
    
    WriteMapExample
    ReadMapExample
    
    WriteTextWriter
    ReadTextReader
End Sub

Sub SaveStringExample
    File.WriteString(File.DirRootExternal, "String.txt", _
        "This is some string" & CRLF & "and this is another one.")
End Sub

Sub ReadStringExample
    Msgbox(File.ReadString(File.DirRootExternal, "String.txt"), "")
End Sub

Sub WriteListExample
    Dim List1 As List
    List1.Initialize
    For i = 1 To 100
        List1.Add(i)
    Next
    File.WriteList(File.DirRootExternal, "List.txt", List1)
End Sub

Sub ReadListExample
    Dim List1 As List
    'We are not initializing the list because it just holds the list that returns from File.ReadList
    List1 = File.ReadList(File.DirRootExternal, "List.txt")
    Msgbox("List1.Size = " & List1.Size & CRLF & "The third item is: " & List1.Get(2), "")
End Sub

Sub WriteMapExample
    Dim Map1 As Map
    Map1.Initialize
    For i = 1 To 10
        Map1.Put("Key" & i, "Value" & i)
    Next
    File.WriteMap(File.DirRootExternal, "Map.txt", Map1)
End Sub

Sub ReadMapExample
    Dim Map1 As Map
    'Again we are not initializing the map.
    Map1 = File.ReadMap(File.DirRootExternal, "Map.txt")
    'Append all entries to a string builder
    Dim sb As StringBuilder
    sb.Initialize
    sb.Append("The map entries are:").Append(CRLF)
    For i = 0 To Map1.Size - 1
        sb.Append("Key = ").Append(Map1.GetKeyAt(i)).Append(", Value = ")
        sb.Append(Map1.GetValueAt(i)).Append(CRLF)
    Next
    Msgbox(sb.ToString,"")
End Sub

Sub WriteTextWriter
    Dim TextWriter1 As TextWriter
    TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "Text.txt", False))
    For i = 1 To 10
        TextWriter1.WriteLine("Line" & i)
    Next
    TextWriter1.Close
End Sub

Sub ReadTextReader
    Dim TextReader1 As TextReader
    TextReader1.Initialize(File.OpenInput(File.DirRootExternal, "Text.txt"))
    Dim line As String
    line = TextReader1.ReadLine    
    Do While line <> Null
        Log(line) 'write the line to LogCat
        line = TextReader1.ReadLine
    Loop
    TextReader1.Close
End Sub

TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "Text.txt", False))

Importante, según la línea anterior acabe en False o True, se añadirá o no un renglón.
Es decir, si ponemos True, lo que escribamos se añadirá al archivo.
Si ponemoa False, solo contendrá la última línea escrita.

_______________________

6.- Aquí tenemos otro código más simple de escritura y lectura de archivo.
(no hace falta librería Dialogs)

El Activity consta de un Layout y dentro de él, un EditText1, un Label1 y dos Botones.

A la SD Card podemos acceder mediante LINUX entrando en el directorio: /mnt/sdcard

 

Escribe y lee un archivo de la SD Card
'Activity module
Sub Process_Globals

End Sub

Sub Globals
    Dim pfilename As String
    
    pfilename = "ejemplo.txt"
    Dim EditText1 As EditText
    Dim Label1 As Label
    Dim linea As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub Button1_Click
    Dim mFilePath As String
    linea = EditText1.Text
    If File.ExternalWritable = True Then
        'SD Card Installed
        mFilePath = File.DirRootExternal
    Else
        'No SD Card
        mFilePath = File.DirInternal
    End If
    Dim tw As TextWriter
    tw.Initialize(File.OpenOutput(mFilePath, pfilename, True))
    tw.WriteLine(linea)
'    tw.Write(linea)

    tw.Close

End Sub

Sub Button2_Click
    Dim mFilePath As String
    If File.ExternalWritable = True Then
        ' Hay tarjeta SD Card Instalada
        mFilePath = File.DirRootExternal
    Else
        'No hay tarjeta SD Card
        mFilePath = File.DirInternal
    End If
    If File.Exists(mFilePath, pfilename) = True Then
        Dim tr As TextReader
        tr.Initialize(File.OpenInput(mFilePath, pfilename))
        Label1.Text = tr.ReadLine
        'Label1.Text = ReadList(mFilePath, pfilename)
        Label1.Text = File.ReadString(mFilePath, pfilename)
'        Label1.Text = tr.ReadAll
        tr.Close
    End If    
End Sub

_______________________

7.- Otro código de escritura y lectura de archivo.
Guardar información en distintos :campos: de una línea.
(no hace falta librería Dialogs)

Creamos un Layout, lo llamamos Layout.

Insertamos:

Label1.... Nombre
Label2.... Edad
Label3.... Ciudad

EditText1
EditText2
EditText3

Button1
Button2

En este caso escribimos tres datos: nombre, edad y ciudad y lo guardamos en el archivo fichero.txt

Los datos se agrupan en una línea separada por un separador de campo, en este caso ":"

Juan:23:Grazalema

Si tenemos tarjeta de memoria SD Card, se guardará alli, si no la tenemos se guardará en el directorio interno.

Escribimos la línea con este código:

escribir.Initialize(File.OpenOutput(directorio, archivo, False))
escribir.WriteLine(linea)

Si en vez poner False, ponemos True, las distintas líneas que escribamos se añadirán al final de la última.
En este código particular no vemos el efecto de añadir, solo se muestra una línea.

El botón de lectura de código contiene esta línea de lectura:

leer.Initialize(File.OpenInput(directorio, archivo))
linea = leer.ReadLine

Lee una línea, la línea obtenida es de la forma

Juan:23:Grazalema

Mediante las funciones de cadenas, se van obteniendo los distintos campos.

Esta función encuentra la primera aparición del carácter ":" y nos devuelve su posición, en este caso está en el lugar 4

linea.IndexOf2(":",0) ' 4

Esta función toma los caracteres desde el 0 hasta el finalnombre

nombre = linea.SubString2(0, finalnombre) ' Juan

Esta función muestra la longitud de la cadena.

finallinea = linea.Length ' 16

Nota: una vez más este código se podría realizar con otros algoritmos: Listas, Maps, tablas... pero he querido presentar la opciones de cadenas.

Este código nos puede servir para guardar las variables en un archivo, para que en el caso que el programa se apague o vaya a segundo plano, se guarden las variables, la parte de guardar de este código lo tendríamos que poner en Activity_Pause.

Escribe y lee datos en un archivo
' Juan Antonio Villalpando
    ' juana1991@yahoo.com

Sub Process_Globals

End Sub

Sub Globals
   Dim archivo As String
   archivo = "fichero.txt"
   Dim EditText1, EditTExt2, EditText3 As EditText
   Dim Label1, Label2, Label3 As Label
   Dim linea As String
   Dim nombre, edad, ciudad As String

End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Sub Button1_Click
    nombre = EditText1.Text
    edad = EditText2.Text
    ciudad = EditText3.Text
    ' Voy a unirlo todo en una línea con un separador de campo :
    '                 Juan:23:Grazalema
    linea = nombre & ":" & edad & ":" & ciudad
    
    Dim directorio As String
    If File.ExternalWritable = True Then
        ' Si hay SD Card lo guarda en ella
        directorio = File.DirRootExternal
    Else
        ' Si no hay SD Card lo guarda en directorio interno
        directorio = File.DirInternal
    End If
    
    Dim escribir As TextWriter
    ' Sobreescribe línea
    escribir.Initialize(File.OpenOutput(directorio, archivo, False))
    escribir.WriteLine(linea)

    escribir.Close
    
        EditText1.Text = ""
        EditText2.Text = ""
        EditText3.Text = ""

End Sub

Sub Button2_Click
    Dim directorio As String
    If File.ExternalWritable = True Then
        ' Si hay SD Card lo leerá de ella
        directorio = File.DirRootExternal
    Else
        ' Si no hay SD Card lo leerá del directorio interno
        directorio = File.DirInternal
    End If
    
    If File.Exists(directorio, archivo) = True Then
        Dim leer As TextReader
        ' Lee Línea
        leer.Initialize(File.OpenInput(directorio, archivo))
        linea = leer.ReadLine
        ' linea = Juan:23:Grazalema
        
        finalnombre = linea.IndexOf2(":",0) ' 4
        nombre = linea.SubString2(0, finalnombre) ' Juan
        EditText1.Text= nombre
        
        finaledad = linea.IndexOf2(":", finalnombre+1) ' 8
        edad = linea.SubString2(finalnombre+1, finaledad) ' 23
        EditText2.Text = edad
        
        finallinea = linea.Length ' 16
        ciudad = linea.SubString2(finaledad+1, finallinea) ' Grazalema
        EditText3.Text = ciudad        
        
        leer.Close
    End If    
End Sub
      

NOTA: Para cortar (Split) una cadena en trozos según un separador de campo, se puede utilizar la instrucción:

Dim  data  As String
data =  " 123,432,13,4,12,534 "
Dim  numbers()  As String
numbers =  Regex.Split( "," , data)
Dim  l  As List
l.Initialize2(numbers)
Log (l)

Ver en el tutorial oficial.

_______________________

8.- Obtener un listado de los archivos que se encuentren en la SD Card

Consultamos el archivo TweetRecursive de este tutorial:

http://www.basic4ppc.com/forum/basic4android-updates-questions/12285-recursive-method-traversing-sdcard.html#post68941

Hay que tener en cuenta que según la marca del móvil o tablet, la SD Card estará "montada" en un directorio u otro.

Ver en foros.

En LINUX hay un archivo importante, llamado fstab, en donde están indicados los dispositivos montados y la forma en que se pueden montar.

En Android ese archivo se llama vold.fstab y está en el directorio /system/etc

_______________________

9.- Ver un listado de los archivos que están en la carpeta File.
(no hace falta librería Dialogs)

Dentro de cada carpeta de programa hay una subcarpeta llamada File, en ella suele estar el layout.bal, imagenes, sonidos...

Los archivos de esta carpeta son estáticos, es decir, los podemos introducir mientras realizamos el programa, pero cuando el programa está en funcionamiento no podemos crear ni manipular archivos en esa carpeta, es un directorio de solo lectura.

El directorio File, se representa en el código mediante: File.DirAssets

Para ver un listado de los archivos existentes en la carpeta Files mediante código podemos hacerlo así...

 

Dim Lista As List
Dim i As Int
    
Lista.Initialize 

Lista.AddAll(File.ListFiles(File.DirAssets)) 

Msgbox("Archivos = " & Lista.Size, "") 

For i = 0 To Lista.Size - 1 

Msgbox(Lista.Get(i), "") 

Next
_______________________

10.- Otra manera de ver un listado de archivos que están en la carpeta Files.
(no hace falta librería Dialogs)


En este caso hace un listado de los archivos que extensión .txt que existen en esa carpeta.

 

' http://www.basic4ppc.com/forum/basic4android-updates-questions/20718-path-assetsdir-does-not-exist.html

'Read available files
Dim AllFiles As List
AllFiles.Initialize
AllFiles.AddAll(File.ListFiles(File.DirAssets))

Dim myDropDown As Spinner
myDropDown.Initialize("myDropDown")

Dim text As String
For I = 0 To AllFiles.Size -1
text = AllFiles.Get(I)
If text.IndexOf(".txt") > - 1 Then
myDropDown.Add(text)
End If 
Next

'Let the user select a file
Dim cd As CustomDialog
cd.AddView(myDropDown, 0, 0, 300, 40)
cd.Show("DropDown Title", "OK", "Cancel", "", Null)
text = myDropDown.SelectedItem


End Sub 

En vez de poner la carpeta Files (File.DirAssets) se puede poner cualquier otra carpeta.

_______________________

11.- Ver el árbol de directorios.

También es interesante estudiar este ejemplo del foro. Se trata de mostrar los directorios y archivos, en este caso de la SdCard, en forma de árbol de directorios.

Se nos presenta los directorios y archivos, y pulsando en un directorio podemos ver la información que contiene, es un explorador de archivos.

Se encuentra en este foro y la podemos bajar en Treeview.zip

En el código podemos ver la línea:

tv.rootnode.tag = File.DirRootExternal ' example for directory treeview

en donde pondremos la raíz desde donde queremos ver los ficheros.

_______________________

12.- Resumen de trabajo con carpetas y archivos. IMPORTANTE.
(no hace falta dialogs)

- Creamos con el Designer un Layout, lo llamamos "Layout" con estos botones:

Para permitir que se pueda leer y escribir en elementos externos debemos añadir estas líneas en el Manifest Editor

AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)

AddPermission(android.permission.READ_EXTERNAL_STORAGE )

Trabajo con carpeta y archivo.
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com

' Enero 2015
End Sub

Sub Globals

End Sub

Sub Activity_Create(FirstTime As Boolean)
  Activity.LoadLayout("Layout")
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Button1_Click
     If File.ExternalWritable = False Then
        Msgbox("La SdCard no tiene permiso de escritura.", "")
        Else
        Msgbox("La SdCard sí tiene permiso de escritura.", "")
    End If
    If File.ExternalReadable = False Then
        Msgbox("La SdCard no tiene permiso de lectura.", "")
        Else
        Msgbox("La SdCard sí tiene permiso de lectura.", "")
    End If
End Sub
' Crea una carpeta
Sub Button2_Click
     If File.Exists(File.DirRootExternal, "MiCarpeta" ) = False Then '
        File.MakeDir(File.DirRootExternal, "MiCarpeta")
        Msgbox("Se ha creado MiCarpeta.", "")
    Else
         Msgbox("MiCarpeta ya existía.", "")
    End If     
End Sub

' Borra una carpeta
Sub Button3_Click
     If File.Exists(File.DirRootExternal, "MiCarpeta" ) = False Then '
         Msgbox("MiCarpeta no existía.", "")
    Else
        File.Delete(File.DirRootExternal,"MiCarpeta")
        Msgbox("Acaba de ser borrada MiCarpeta.", "")
    End If    
End Sub

' Crea un archivo de texto
Sub Button4_Click
     If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
       File.WriteString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt","")
       Msgbox("Se ha creado MiArchivo.", "")
    Else
        Msgbox("MiArchivo ya existía.", "")
    End If    
End Sub

' Borra un archivo
Sub Button5_Click
     If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
       Msgbox("MiArchivo.txt no existía.", "")
    Else
       File.Delete(File.DirRootExternal,"/MiCarpeta/MiArchivo.txt")
       Msgbox("Acaba de ser borrado MiArchivo.txt.", "")
    End If    
End Sub

' Escribir hola en un archivo mediante WriteString
' (Se puede crear un archivo y a la vez escribirle algo)
' Con esta forma de WriteString solo podemos escribir una vez cuando creamos el archivo nuevo.
' Si escribimos otra vez se borrará lo anterior.
' Por eso cuando escribes varias veces solo se ve la última línea.
' Se pueden escribir varias líneas mediante una List
Sub Button6_Click
     If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
       Msgbox("MiArchivo.txt no existía. No se puede ESCRIBIR. Crealo antes", "")
    Else
       File.WriteString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt","hola")
       Msgbox("Ya he escrito la palabra: 'hola'", "")
    End If    
End Sub

' Leer el contenido de un archivo.
Sub Button7_Click
     If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then '
       Msgbox("MiArchivo.txt no existía. No se puede LEER. Crealo antes", "")
    Else
       Msgbox(File.ReadString(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt"), "")
    End If    
End Sub

' Escribir adios en un archivo mediante TextWriter
' Con TextWriter se pueden escribir varios renglones con facilidad.
' Luego podemos leerlo con el ReadString (Button7) visto anteriormente
Sub Button8_Click
     If File.Exists(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt" ) = False Then
       Msgbox("MiArchivo.txt no existía. No se puede ESCRIBIR. Crealo antes", "")
    Else
       Dim TextWriter1 As TextWriter
       TextWriter1.Initialize(File.OpenOutput(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt", True)) 
' Si ponemos False al final de la línea anterior, solo escribe una línea TextWriter1.WriteLine("adios") TextWriter1.Close Msgbox("Ya he escrito la palabra: 'adios'", "") End If End Sub ' Otra forma de leerlo es mediante TextReader ' Dim TextReader1 As TextReader ' TextReader1.Initialize(File.OpenInput(File.DirRootExternal, "/MiCarpeta/MiArchivo.txt")) ' Dim linea As String ' linea = TextReader1.ReadLine ' Do While linea <> Null ' Log(linea) ' linea = TextReader1.ReadLine ' Loop ' TextReader1.Close

_______________________
_______________________

Recordamos tres lugares de directorios.

Ejecuta esta órdenes para comprobar la ruta de cada directorio


Msgbox(File.DirRootExternal, "")
Msgbox(File.DirAssets, "")

Msgbox(File.DirInternal, "")

Msgbox(File.DirDefaultExternal, "")

 

DirAssets es el directorio del programa C:\Android\<Programa>\Files
es un directorio de solo lectura durante la ejecución del programa, por lo tanto no podemos (desde el programa), cambiar nada en él.


Carpeta Files, de solo lectura durante la ejecución del programa.

DirRootExternal es un directorio en la tarjeta de memoria SD de nuestro móvil. Si tenemos un directorio que se llama Fotos, podemos ir a ese directorio de esta manera...

out = File.OpenOutput(File.DirRootExternal & "/" & "Fotos", "foto2.jpg", True)

ATENCIÓN, consulta al final de esta página una aclaración importante sobre DirRootExternal, no es la tarjetita que insertamos a nuestro móvil.

- Podemos llegar a la SD Card, entrando en... /mnt/sdcard

Esto lo debemos hacer desde el shell de LINUX como vimos en un tutorial anterior.

La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta

cd /mnt/sdcard

ls

DirInternal es un directorio existente en nuestro Programa y que solo podemos acceder mediante ese Programa.
Para ver el listado de archivos en ese directorio, lo debemos hacer mediante el shell del LINUX, esto lo he comentado anteriormente y se explica con más detalle en el tutorial LINUX. Este directorio se encuentra en una subcarpeta de nuestro Programa, pero no podemos verlo mediante el Explorador de Windows.

out = File.OpenOutput(File.DirInternal & "/" , "logo2.png", True)

La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta

cd /data/data/<tu.programa>/files

ls


DirInternal visto con Dalvik Debug Monitor.
/data/data/
com.variasmarcas/files

- Copiar un archivo desde la carpeta Files a la DirInternal

File.Copy(File.DirAssets,"web4.htm", File.DirInternal,"web4.htm")

 

DirDefaultExternal es el directorio por defecto de la aplicación en el móvil. Puede acceder a él cualquier aplicación mediante la ruta [external device]/Android/data/[package name]/files/

Por ejemplo: /mnt/sdcard/Android/data/tu.programa/files/

La manera de llegar a ese directorio es yendo a linux y pasando a la carpeta

cd /mnt/sdcard/Android/data/tu.programa/files

ls

 

DirDefaultExternal visto con Dalvik Debug Monitor.
/mnt/sdcard/Android/data/
com.variasmarcas/files

- Copiar un archivo desde la carpeta Files a la DirDefaultExternal

File.Copy(File.DirAssets,"web4.htm", File.DirDefaultExternal,"web4.htm")

___________________________________________

 

Aclaraciones sobre DirRoorExternal

Hay dudas acerla de DirRootExternal, no es la tarjetita de memoria que insertamos en el móvil o tablet, esto se refiere a una memoria del dispositivo interno. Para llegar a la tarjetita externa de memoria que insertamos, debemos saber su dirección, de la forma /mnt/sdcard, esto no es tan fácil de saber ya que cada dispositivo según su marca y modelo la monta en un sitio distinto.

Debemos investigar dónde en qué dirección está nuestra tarjetita de memoria.

En los foros leemos:

DirRootExternal No es tu SdCard Externa (no es la tarjetita que tienes insertada), es la SdCard interna.

Los Dispositivos tienen al menos dos almacenamientos estándar, el interno y el externo. Si el dispositivo también tiene una SdCard esta será la tercera SdCard Externa.

Es decir, el directorio DirRootExternal no es nuestra tarjeta de memoria SdCard, es una memoria interna del dispositivo.

Si queremos ir a nuestra tarjeta debemos consultar el archivo vold.fstab para ver dónde está montada y luego llamarla escribiendo su dirección, por ejemplo: /mnt/sdcard

Más adelante dice que el acceso a la tarjeta externa SdCard es limitado a partir de la versión 4.4 de Android

Se puede obtener la dirección de la tarjeta SdCard externa mediante su dirección de absoluta de LINUX

en este mensaje lo indican.

Por ejemplo podría ser
/mnt/sdcard/ext-sd
/storage/sdcard0
/mnt/sdcard/exStorages/SdCard
/mnt/sdcard/sdcard1
/sdcard 1
/mnt/sdcard/external_sd
/mnt/sdcard
/Removable/MicroSD

Pero... Se podría ver dónde está montada desde del archivo vold.fstab, pero desde la versión 4.3 este archivo ya no está presente ha sido sustituido por fstab.xxx y para leerlo es necesario permiso de root.

http://stackoverflow.com/questions/19272852/vold-fstab-file-in-android-4-3

Así que si quieres entrar en tu tarjeta SdCard, primero debes saber dónde está montada, algo así... /mnt/sdcard (dependiendo de la marca y modelo del móvil será una dirección distinta)

Una vez que sepa dónde está la tarjeta ya puedes trabajar con ella de la forma...

If File .Exists( "" ,  "/mnt/sdcard/MiCarpeta/MiArchivo.txt" )  Then

________________________________

Si quieres que este tutorial se mantenga y lo actualice con más programas, escríbeme un correo a Juan Antonio: juana1991@yahoo.com

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información