Store files in a device from a PC

Hello guys,

I need to import and store on a device’s folder some files (text, image, sound, video) from a PC using a cable connection. My App access this folder to load the files then they are need

In simulator I put all the files into the Documents folder of sandbox and all is working, but, if I put the same files into the Documents folder of a device or of an SD card the App don’t find any file.

Do I have to put the files in a different folder? What? And how can I access files in this folder?

Thank you

Stefano

Why don’t you add the files in the root of the app ( Where the main.lua is ) and grab files you need from there? 

Or are you trying to build the app and then on the phone put the files on the phone and access the files from there. Why would you need to do that?

Note – Not a lot of people really want to go through almost 700 lines of code not knowing exactly what you want. 

Can you please explain a scenario of what you want maybe? Thanks!

–SonicX278 

Thank you for your interest.

I’m writing an app for a class os student, i’m a volunteer teacher.

The app is like a virtual store, there are a lot of files, image, text, audio and my be video.

Each student must load his proper contents this is the reason for which I can insert the files il the root of app or in one the system folder.

I put all files in some subfolder of corona Documents system folder and all is working correctly in simulator.

In the device i put files in Docent folder but I don’t know ho to tell the app what is that folder is,

I send you my code and an explanatory text.

Hope u can help me to solve the problem

Stefano

    MY APP

– 01*************************************************************************************

– INIT                                

– Questa parte viene eseguita una sola volta all’avvio del programma e serve per definire

– i parametri di visualizzazione e grandezze varie

– Nasconde la barra di stato. Se si vuole vedere cosa contiene sostituire l’istruzione

– con display.setStatusBar( display.ShowStatusBar)

local lfs = require’lfs’ – lfs is Lua File System

– BASE PARAMETERS

– Quelli a destra vengono forniti dal S/W di gestione e potrebbero essere usati

– direttamente. Vengono copiati in altre variabili er avere nomi più brevi e

– comprensibili. Il segno = non ha lo stesso significato  che ha in matematica e si

– chiama “assegnazione”. le variabili possono contenere non solo numeri ma anche testi,

– immagini, suoni, oggetti, ecc. e anche altre variabili. Le grandezze a destra e a

– sinistra del segno uguale vanno considerate come come due “cassetti” dove con

– l’operazione di assegnazione tutto il contenuto duplichiamo del cassetto di destra

– viene duplicato in quello di sinistra

– Screen Parameters

local screenCenterX = display.contentCenterX – screen coordinate X of center

local screenCenterY = display.contentCenterY – screen coordinate Y of center

local screenWidth = display.contentWidth – screen dimension: width

local screenHeight = display.contentHeight – screen dimension: height

– Platform type parameter; “iPhoneOS” or “Android” or “Mac OS X”

local isAndroid = “Android” == system.getInfo( “platformName”)

local isSimulator = “simulator” == system.getInfo( “environment”)

– General values

local backGroundAlpha = 1 – background alpha

local foreGroundAlpha = 0.85 – foreground alpha

local emptySpaceColor = { 0, 1 ,0} – RGB values ranging from 0 (dark) to 1

– other parameters

local objectScreen

local dtlAudio

local titleOfPage

local firstPage

– groups & tables & stack pointer pieces/object -> obj

local piecesCoordTable = {} – pieces X-Y position

local bkgGroup = display.newGroup () – all groups to hide/show

local objGroup1 = display.newGroup () – elements

local objGroup2 = display.newGroup ()

local objGroup3 = display.newGroup ()

local objGroup4 = display.newGroup ()

local objGroup5 = display.newGroup ()

local objGroup6 = display.newGroup ()

local objGroup7 = display.newGroup ()

local dtlImgGroup = display.newGroup ()

local pagesStack = {} – table to index groups

      pagesStack [1] = objGroup1 – table values

      pagesStack [2] = objGroup2

      pagesStack [3] = objGroup3

      pagesStack [4] = objGroup4

      pagesStack [5] = objGroup5

      pagesStack [6] = objGroup6

      pagesStack [7] = objGroup7

local stackPointer = 1 – pageStack table pointer

– pieces parameters pieces -> pcs

local maxPieces = 20 – numero massimo di tessere

local shiftY = 0.5 – per visualizzazione tessere

local piecesInaRow = 4 – tessere in orizzontale

local objWidth = screenWidth / piecesInaRow - 5 – piece dimensions

local objHeight = objWidth – square

– flags

local fileExist = false – for a piece exist:

local dtlImgExist = false – an image as detail

local dtlTextExist = false – a text as detail

local dtlAudioExist = false – an audio streaming as detail

local dtlVideoExist = false –  a video as detail

local touchEnabled = true – screen touch enable/disable

– button parameters

local button1Width = objWidth

local button1Height = button1Width / 4

local button1Xpos = screenWidth - objWidth / 1.4

local button1Ypos = screenHeight - ( objHeight * shiftY / 2 )

local button1FontSize = button1Height * 0.9

local button1Label1 = “CHIUDI”

local button1Label2 = “HOME”

– title & bottom start value

local titleTextAlpha = 0

local titleShift = objHeight / 4 – shift posizione titolo

local bottomTextAlpha = 1

local bottomTextX = objWidth * 1.5

local bottomTextY = button1Ypos

local bottomTextFontSize = button1FontSize * 1.1

– Objects Dtl. Abbreviazioni: Detail ->, objects/pieces -> objs

local programFolder = “ArtWorkCompose”

local currentFolder 

local titleFileName = “atitle.txt”

local objName = “obj”

local objExt1 = “.png”

local objExt2 = “.jpg”

local objDtlTextExt = “.txt”

local objDtlImgExt = “dtl”

local objDtlAudioExt = “.m4a”

local objDtlVideoExt = “.mp4”

local mainFolder = “mainlevel”

local myFolder = “”

local bckgFileName = “background.jpg”

local tapText = “toccare un oggetto”

– ***************************************************************************************

– Viene creato un rettangolo delle dimensioni dell’intero schermo che sarà l’area che 

– risponde ai tap.

– Il parametro alpha (opacità) viene settato ad un valore molto basso per nn interferire

– con le ie successive immagini

local screen = display.newRect( screenCenterX, screenCenterY, screenWidth, screenHeight )

screen:setFillColor( 1, 0, 0 )

screen.alpha = 0.1

– ***************************************************************************************

– Legge nella cartella “Documents” il nome del main folder

local lfs = require’lfs’ – lfs is Lua File System

local function findMainFolder ()

currentFolder = “”

doc_path = system.pathForFile( myFolder, system.DocumentsDirectory )

for file in lfs.dir( doc_path ) do

if string.find( file, “%.” )then

– name starts with a dot, discard file/directory

else

  – file is the current directory name

– mainFolder = file

currentFolder = file

break – se ci sono più cartelle viene presa la prima

end

end

currentFolder = mainFolder

– Il folder non è stato trovato

if currentFolder == “” then

local options = – define options to display text

  {

  text = “MAIN FOLDER DOESN’T EXIST”,

    x = screenCenterX,

    y = screenCenterY,

    font = native.systemFontBold,   

fontSize = 65,

    align = “center”

}

text = display.newText( options )

text:setTextColor(1, 0, 0)

if isAndroid then

native.requestExit()

else

– call for IOS devices

end

end

end

findMainFolder ()

mainFolder = currentFolder

– ***************************************************************************************

– Visualizza una immagine jpg o png, i parametri sono autoesplicativi

– Viene chiamata ogni volta che deve essere visualizzata un’immagine

piecesLoadAndShow = function ( group, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight, imFrom)

–print( “piecesLoadAndShow”,  group, fileName)

– carica e visualizza filename

local objectScreen = display.newImage( group, fileName, system.DocumentsDirectory )

if objectScreen  then

fileExist = true

   if objectScreen.width >= objectScreen.height then – objectScreen must be global

    scaleFactor = imgWidth/objectScreen.width

    else

    scaleFactor = imgHeight/objectScreen.height

   end

   objectScreen:scale ( scaleFactor, scaleFactor)

   – position from piecesCoordTable

  objectScreen.x = screenObjPosX

  objectScreen.y = screenObjPosY

  objectScreen.alpha = 1

end

–return fileExist

end

– ***************************************************************************************

– Visualizza l’immagine di background

local function backGroundShow ( bckgFileName )

local bkgScreen = display.newImage( bkgGroup, myFolder … “/” … bckgFileName, system.DocumentsDirectory, screenCenterX, screenCenterY )

bkgScreen.width = screenWidth

bkgScreen.height = screenHeight

end

backGroundShow ( bckgFileName )

– ***************************************************************************************

– Scrittura testo in basso

local function writeBottomText (tapText)

display.remove( text )

–alpha = bottomTextAlpha

local options = – define options to display text

{

  text = tapText,

  x = bottomTextX,

    y = bottomTextY,

    font = native.systemFont,   

fontSize = bottomTextFontSize

}

bottomText = display.newText( options ) – display text

bottomText:setTextColor( 0, 0, 1, 1)

end

writeBottomText ( tapText )

– ***************************************************************************************

– Si disegna il tasto in bassa a destra attingendo ad una libreria, widget, di oggetti

– predefiniti. La label del tasto viene usata per gestire le azioni:

– No label: tasto inattivo

– “CHIUDI”: cancella l’immagine o il testo che descrive un particolare oggetto

– “HOME”: riporta il sistema alle condizioni iniziali

local widget = require( “widget” )

– Function to handle button events

local function handleButtonEvent ( event )

if ( “ended” == event.phase ) then

audio.stop () – stop any audio

dtlAudioExist = false – resetta flag riproduzione audio

–video.stop () – stop any video

dtlVideoExist = false – resetta flag riproduzione video

        if button1:getLabel () == button1Label1 then – se label button1 é CHIUDI

        pagesStack [stackPointer].isVisible = true – immagini della griglia visibili

        titleText.alpha = titleTextAlpha – visualizzazione titolo pagina

bottomText.alpha = 1 – visualizzazione testo in basso

touchEnabled = true – abilitazione touch

if stackPointer == 1 then – se in mainlevel

      button1:setLabel ( “” ) – cancellazione label button1

else – altrimenti

button1:setLabel ( “HOME” ) – scrivi label button1

end 

      if dtlImgExist == true then – se è visuallizata immagine di 

dtlImgExist = false – dettaglio immagine viene 

– for i = 2,6 do

– pagesStack [stackPointer].isVisible = false

– end

dtlImgGroup:removeSelf () – cancellata

dtlImgGroup = nil

dtlImgGroup = display.newGroup ()

else

dtlTextExist = false – se è visualizzato testo di

dtlTextFrame:removeSelf () – dettaglio viene cancellato

dtlTextFrame = nil – frame e resto

dtlText:removeSelf ()

dtlText = nil

end

elseif

button1:getLabel () == button1Label2 then

pagesStack [stackPointer].isVisible = false

stackPointer = 1

pagesStack [stackPointer].isVisible = true

currentFolder = mainFolder

pageTitle ( currentFolder )

button1:setLabel ( “” )

– objGroup1:removeSelf ()

– objGroup2:removeSelf ()

– objGroup3:removeSelf ()

– objGroup4:removeSelf ()

– objGroup5:removeSelf ()

– objGroup6:removeSelf ()

– objGroup7:removeSelf ()

– objGroup1 = nil

– objGroup2 = nil

– objGroup3 = nil

– objGroup4 = nil

– objGroup5 = nil

– objGroup6 = nil

– objGroup7 = nil

– objGroup1 = display.newGroup ()

– objGroup2 = display.newGroup ()

– objGroup3 = display.newGroup ()

– objGroup4 = display.newGroup ()

– objGroup5 = display.newGroup ()

– objGroup6 = display.newGroup ()

– objGroup7 = display.newGroup ()

else

        end

    end

end

– Create the widget

local button1Options = 

{

    label = "    ",

    labelAlign = center,

    fontSize = button1FontSize,

    labelColor = { default={ 1, 0, 0 }, over={ 0, 0, 0, 0.5 } },

  onEvent = handleButtonEvent,

    emboss = false,

    shape=“roundedRect”,

    width = button1Width,

    height = button1Height,

    cornerRadius = 2,

    fillColor = { default={ 1, 1, 1, 1 }, over={ 1, 0.1, 0.7, 0.4 } },

    strokeColor = { default={ 0, 0, 1, 1 }, over={ 0.8, 0.8, 1, 1 } },

    strokeWidth = 5

}

button1 = widget.newButton ( button1Options ) – must be Global

– Center the button

button1.x = button1Xpos

button1.y = button1Ypos

– ***************************************************************************************

– Si preparano i dati per visualizzare le tessere. Le coordinate x e y  dove

– posizionare le tessere sono memorizzate nella tavola “piecesCoordTable”.

function populatePiecesCoordTable ()

local tableRow = 1

local countX = 1

local shiftX = 0.5

local posX = -piecesInaRow/2 + shiftX

local countY = 1

local posY = -piecesInaRow/2 + shiftY

while tableRow  <= maxPieces do

local piecePosX = screenCenterX + ( posX + ( countX - 1)) * objWidth

local piecePosY = screenCenterY + ( posY + ( countY - 1)) * objHeight

piecesCoordTable[tableRow] = { x=piecePosX, y=piecePosY, n=tableRow }

–print( "TABLEPREPARE - tR= " … tableRow … ", cX= " … countX … ", pPX= " … piecesCoordTable[tableRow].x … ", cY= " … countY … ", pPY= " … piecesCoordTable[tableRow].y)

  tableRow=tableRow+1

  countX = countX + 1

  if countX > piecesInaRow then

  countX = 1

  countY = countY + 1

  end

  end

end

populatePiecesCoordTable ()

– ***************************************************************************************

– Scrive il titolo della pagina visualizzata

– This function must be global

function pageTitle ( currentFolder )

– Legge il titolo della pagina visualizzata

– path to the file that to be read from. 

local path = doc_path … “/” … currentFolder … “/” … titleFileName

local file = io.open( path, “r” ) – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

– extract TitleOfPage

local stringLenght = string.find( savedData, “,” )

local titleOfPage = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract fontName

local stringLenght = string.find( savedData, “,” )

local fontName = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract fontSize

local stringLenght = string.find( savedData, “,” )

local fontSize = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract red value

local stringLenght = string.find( savedData, “,” )

local red = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract green value

local stringLenght = string.find( savedData, “,” )

local green = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract blue value

local stringLenght = string.find( savedData, “,” )

local blue = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract alpha value

local stringLenght = string.find( savedData, “,” )

local alpha = string.sub( savedData, 1, stringLenght - 1 )

titleTextAlpha = alpha – save to restore, must be global

local savedData = string.sub( savedData, stringLenght + 1 )

pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )

end

end

function pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )

display.remove( titleText )

local options = { – define options to display text

  text = titleOfPage,

    x = screenCenterX,

    – Per la posizione del testo si parte dalla coordinata del centro della prima

    – tessera meno la metà dell’altezza di una tessera - uno shift fisso

    y = piecesCoordTable[1].y - objHeight / 2 - fontSize / 2, 

    font = fontName,   

fontSize = fontSize,

  --width = _W,

    --height = 0,

    align = “center”

}

titleText = display.newText( options )

titleText:setTextColor( red, green, blue, alpha )

end

pageTitle( currentFolder )

– ***************************************************************************************

– Carica e visualizza le immagini della prima pagina

function firstPage( objGroup, folder )

for n = 1, maxPieces do

local screenObjPosX = piecesCoordTable[n].x

local screenObjPosY = piecesCoordTable[n].y

local imgWidth = objWidth

local imgHeight = objHeight

local fileName = myFolder … “/” … folder … “/” … objName … n … objExt1

piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

local fileName = myFolder … “/” … folder … “/” … objName … n … objExt2

piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

– Disegna una griglia

local objectGrid = display.newRect ( objGroup, screenObjPosX , screenObjPosY, objWidth, objWidth )

objectGrid.strokeWidth = 4

objectGrid:setFillColor( 1, 1, 1, 0.0 )

objectGrid:setStrokeColor( 1, 0, 0 )

end

end

firstPage ( pagesStack [1], currentFolder )

– ***************************************************************************************

– Scrive il testo contenuto nel file di descrizione

local function dtlTextWrite ( savedData)

dtlTextFrame = display.newRoundedRect( screenCenterX, screenCenterY + 50, screenWidth - 60, screenHeight - 400, 30)

dtlTextFrame.strokeWidth = 8

dtlTextFrame:setStrokeColor( 1, 0, 0 )

dtlTextFrame:setFillColor( 1, 1, 1 )

local options =

{ – define options to display Dtl text

  text = savedData,

    x = screenCenterX,

    y = screenCenterY +220,

    font = native.systemFontBold,   

fontSize = 50,

    align = “left”,

    width = screenWidth -100,

    height = screenHeight - 100

}

dtlText = display.newText( options )

dtlText:setTextColor( 0,0,0)

end

– ***************************************************************************************

– Visualizza i dettagli dell’oggetto in formato testo se esiste la relativa pagina

– In ingresso il tasto toccato

– La pagina può contenere il nome di una altra cartella

local function getPieceDtlText( tappedObj)

local path = doc_path … “/” … currentFolder … “/” … objName … tappedObj… objDtlTextExt

local file = io.open( path, “r” )   – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

– local isFolder 

if string.find( savedData, “/” ) then

savedData = string.sub( savedData, 2 )

stringLenght = string.find( savedData, “/” )

if stringLenght then – la stringa è corretta

savedData = string.sub( savedData, 1 , stringLenght - 1 )

– cancella il titolo della pagina

titleText:removeSelf ()

titleText = nil

– si tratta di una pagina di oggetti, legge il nuovo titolo e lo visualizza; il nome del nuovo folder era stato trovato in precedenza e si trova nella variabile savedData

local path = doc_path … “/” … savedData … “/” … titleFileName

local file = io.open( path, “r” )   – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

end

currentFolder = savedData

pageTitle ( currentFolder)

– 1 nasconde la griglia di oggetti

– 2 incrementa il puntatore di stackPointer

– 3 visualizza la nuova griglia di oggetti

– 4 cancella la label di button1

pagesStack[stackPointer].isVisible = false

–print(“fffffffff”,#pagesStack)

if stackPointer  < 5 then

stackPointer = stackPointer + 1

else

stackPoiner = 1

end

firstPage ( pagesStack [stackPointer], currentFolder )

pagesStack[stackPointer].isVisible = true

button1:setLabel ( “HOME” )

end

else

– si tratta di una pagine di descrizione in forma testo, il parametro dtlTextExist (dettaglio del pezzo in forma di testo) deve essere falso e viene posto a vero

print(“ddddddddd”,dtlTextExist)

if dtlTextExist == false then

dtlTextExist = true

print(“ddddddddd”,dtlTextExist)

– 1 memorizza i paramentri del titolo per rispristinarlo

– 2 nasconde il titolo ponendo a zero il parametro alpha

– 3 nasconde il testo il testo in basso

– 4 nasconde la griglia di tessere

– 5 disabilita lo schermo al touch

– 6 scrive il dettaglio in forma di testo

– 7 scrive la label su button1

titleTextAlpha = titleText.alpha 

titleText.alpha = 0

bottomText.alpha = 0

pagesStack[stackPointer].isVisible = false

touchEnabled = false

dtlTextWrite ( savedData )

button1:setLabel ( “CHIUDI” )

end

end

else

– si tratta di un oggetto senza descrizione, visualizza una scritta per 1 secondi, il parametro dtlTextExist deve essere falso e viene lasciato falso

print(“ddddddddd”,dtlTextExist, dtlAudioExist)

if  dtlTextExist == false and  dtlAudioExist == false then

local options = – define options to display text

  {

  text = “DESCRIZIONE”,

    x = screenCenterX,

    y = screenCenterY,

    font = native.systemFontBold,   

fontSize = objWidth / 3,

    align = “center”

}

text = display.newText( options )

text:setTextColor(1, 0, 0)

– viene usata la funzione transition.fadeOut per visualizzare il testo per 1 solo secondo, insieme al testo vengono visualizzate du e linee incrociate

  transition.fadeOut( text, {time = 1000})

 

  line1 = display.newLine ( screenCenterX - objWidth, screenCenterY - objHeight / 3, screenCenterX + objWidth, screenCenterY + objHeight / 3 )

line1:setStrokeColor( 1, 0, 0, 1 )

line1.strokeWidth = 10

transition.fadeOut( line1, {time = 1000})

  line2 = display.newLine ( screenCenterX - objWidth, screenCenterY + objHeight / 3, screenCenterX + objWidth, screenCenterY - objHeight / 3 )

line2:setStrokeColor( 1, 0, 0, 1 )

line2.strokeWidth = 10

transition.fadeOut( line2, {time = 1000})

end

end

end

– ***************************************************************************************

– Vede se esiste una descrizione dell’oggetto in forma di immagine e se esiste la carica – e la visualizza.nel caso esista lo carica e lo manda in esecuzione.

– Vede anche se esiste un file video o audio audio 

local function getPieceDtlImg( tappedObj)

– video

local fileName =  myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlVideoExt

if dtlVideoExist == false then

– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)

dtlVideo = media.playVideo( “movie.m4v”, true, onComplete )

if dtlVideo then

dtlVideoExist = true

end

end

– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)

– audio

local fileName =  myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlAudioExt

if dtlAudioExist == false then

dtlAudio = audio.loadStream(fileName, system.DocumentsDirectory )

if dtlAudio then

audio.play( dtlAudio, { channel=1, loops=0, fadein=100 } )

dtlAudioExist = true

end

end

– immagine

local screenObjPosX = screenCenterX

local screenObjPosY = screenCenterY * 1.05

local imgWidth = screenWidth

local imgHeight = screenHeight * 0.77

local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt1

fileExist = false

piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt2

if fileExist == false then

piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

end

if fileExist == true then

if dtlImgExist == false then

dtlImgExist = true

– cancella titolo e testo in basso e scrive la label di button1

titleText.alpha = 0

bottomText.alpha = 0

button1:setLabel ( “CHIUDI” )

touchEnabled = false

– nasconde le tessere

pagesStack[stackPointer].isVisible = false

end

else

dtlImgExist = false

– controlla se esiste una descrizione testuale

getPieceDtlText( tappedObj)

end

end

– ***************************************************************************************

– Toccando lo schermo viene eseguita questa funzione

local function onScreenTouch( event )

if event.phase == “began” then

if dtlAudioExist == true then

audio.stop( ) – stop audio

dtlAudioExist = false

end

if touchEnabled == true then  

– viene individuato la tessera toccata in base alle sue coordinate

– tappedObj contiene il numero della tessera

        for n=1,#piecesCoordTable do

        if event.x > ( piecesCoordTable[n].x - objWidth /2 ) and event.x < ( piecesCoordTable[n].x + objWidth /2 ) then

        if event.y > ( piecesCoordTable[n].y - objWidth /2 ) and event.y < ( piecesCoordTable[n].y + objWidth /2 ) then

        getPieceDtlImg (piecesCoordTable[n].n)

        end

        end

        end

        end

    end

    return tappedPiece

end

– ***************************************************************************************

– funzione di sistema che gestisce il tocco dello schermo e chiama la funzione

– onScreenToutch

– Register to call methods an infinite number of times

screen:addEventListener( “touch”, onScreenTouch )

–timer1 = timer.performWithDelay( 100, t, 0 )–]]

So you want the user to upload an image or something onto the app? And image that is on the users phone?

–SonicX278

the App is on the user phone and files (not only images) must be stored in the SD card  by a cable connection to a PC or removing the SD from phone and insert it into the PC slot. This why user have to load a lot of files, as you seen the main page of the App has 20 image and tapping one  of these can open a new window with 20 images and so on. If it’s better to store anything in the SD card Documents or Download folders

Hope to be clear,

Thank Stefano

Why don’t you add the files in the root of the app ( Where the main.lua is ) and grab files you need from there? 

Or are you trying to build the app and then on the phone put the files on the phone and access the files from there. Why would you need to do that?

Note – Not a lot of people really want to go through almost 700 lines of code not knowing exactly what you want. 

Can you please explain a scenario of what you want maybe? Thanks!

–SonicX278 

Thank you for your interest.

I’m writing an app for a class os student, i’m a volunteer teacher.

The app is like a virtual store, there are a lot of files, image, text, audio and my be video.

Each student must load his proper contents this is the reason for which I can insert the files il the root of app or in one the system folder.

I put all files in some subfolder of corona Documents system folder and all is working correctly in simulator.

In the device i put files in Docent folder but I don’t know ho to tell the app what is that folder is,

I send you my code and an explanatory text.

Hope u can help me to solve the problem

Stefano

    MY APP

– 01*************************************************************************************

– INIT                                

– Questa parte viene eseguita una sola volta all’avvio del programma e serve per definire

– i parametri di visualizzazione e grandezze varie

– Nasconde la barra di stato. Se si vuole vedere cosa contiene sostituire l’istruzione

– con display.setStatusBar( display.ShowStatusBar)

local lfs = require’lfs’ – lfs is Lua File System

– BASE PARAMETERS

– Quelli a destra vengono forniti dal S/W di gestione e potrebbero essere usati

– direttamente. Vengono copiati in altre variabili er avere nomi più brevi e

– comprensibili. Il segno = non ha lo stesso significato  che ha in matematica e si

– chiama “assegnazione”. le variabili possono contenere non solo numeri ma anche testi,

– immagini, suoni, oggetti, ecc. e anche altre variabili. Le grandezze a destra e a

– sinistra del segno uguale vanno considerate come come due “cassetti” dove con

– l’operazione di assegnazione tutto il contenuto duplichiamo del cassetto di destra

– viene duplicato in quello di sinistra

– Screen Parameters

local screenCenterX = display.contentCenterX – screen coordinate X of center

local screenCenterY = display.contentCenterY – screen coordinate Y of center

local screenWidth = display.contentWidth – screen dimension: width

local screenHeight = display.contentHeight – screen dimension: height

– Platform type parameter; “iPhoneOS” or “Android” or “Mac OS X”

local isAndroid = “Android” == system.getInfo( “platformName”)

local isSimulator = “simulator” == system.getInfo( “environment”)

– General values

local backGroundAlpha = 1 – background alpha

local foreGroundAlpha = 0.85 – foreground alpha

local emptySpaceColor = { 0, 1 ,0} – RGB values ranging from 0 (dark) to 1

– other parameters

local objectScreen

local dtlAudio

local titleOfPage

local firstPage

– groups & tables & stack pointer pieces/object -> obj

local piecesCoordTable = {} – pieces X-Y position

local bkgGroup = display.newGroup () – all groups to hide/show

local objGroup1 = display.newGroup () – elements

local objGroup2 = display.newGroup ()

local objGroup3 = display.newGroup ()

local objGroup4 = display.newGroup ()

local objGroup5 = display.newGroup ()

local objGroup6 = display.newGroup ()

local objGroup7 = display.newGroup ()

local dtlImgGroup = display.newGroup ()

local pagesStack = {} – table to index groups

      pagesStack [1] = objGroup1 – table values

      pagesStack [2] = objGroup2

      pagesStack [3] = objGroup3

      pagesStack [4] = objGroup4

      pagesStack [5] = objGroup5

      pagesStack [6] = objGroup6

      pagesStack [7] = objGroup7

local stackPointer = 1 – pageStack table pointer

– pieces parameters pieces -> pcs

local maxPieces = 20 – numero massimo di tessere

local shiftY = 0.5 – per visualizzazione tessere

local piecesInaRow = 4 – tessere in orizzontale

local objWidth = screenWidth / piecesInaRow - 5 – piece dimensions

local objHeight = objWidth – square

– flags

local fileExist = false – for a piece exist:

local dtlImgExist = false – an image as detail

local dtlTextExist = false – a text as detail

local dtlAudioExist = false – an audio streaming as detail

local dtlVideoExist = false –  a video as detail

local touchEnabled = true – screen touch enable/disable

– button parameters

local button1Width = objWidth

local button1Height = button1Width / 4

local button1Xpos = screenWidth - objWidth / 1.4

local button1Ypos = screenHeight - ( objHeight * shiftY / 2 )

local button1FontSize = button1Height * 0.9

local button1Label1 = “CHIUDI”

local button1Label2 = “HOME”

– title & bottom start value

local titleTextAlpha = 0

local titleShift = objHeight / 4 – shift posizione titolo

local bottomTextAlpha = 1

local bottomTextX = objWidth * 1.5

local bottomTextY = button1Ypos

local bottomTextFontSize = button1FontSize * 1.1

– Objects Dtl. Abbreviazioni: Detail ->, objects/pieces -> objs

local programFolder = “ArtWorkCompose”

local currentFolder 

local titleFileName = “atitle.txt”

local objName = “obj”

local objExt1 = “.png”

local objExt2 = “.jpg”

local objDtlTextExt = “.txt”

local objDtlImgExt = “dtl”

local objDtlAudioExt = “.m4a”

local objDtlVideoExt = “.mp4”

local mainFolder = “mainlevel”

local myFolder = “”

local bckgFileName = “background.jpg”

local tapText = “toccare un oggetto”

– ***************************************************************************************

– Viene creato un rettangolo delle dimensioni dell’intero schermo che sarà l’area che 

– risponde ai tap.

– Il parametro alpha (opacità) viene settato ad un valore molto basso per nn interferire

– con le ie successive immagini

local screen = display.newRect( screenCenterX, screenCenterY, screenWidth, screenHeight )

screen:setFillColor( 1, 0, 0 )

screen.alpha = 0.1

– ***************************************************************************************

– Legge nella cartella “Documents” il nome del main folder

local lfs = require’lfs’ – lfs is Lua File System

local function findMainFolder ()

currentFolder = “”

doc_path = system.pathForFile( myFolder, system.DocumentsDirectory )

for file in lfs.dir( doc_path ) do

if string.find( file, “%.” )then

– name starts with a dot, discard file/directory

else

  – file is the current directory name

– mainFolder = file

currentFolder = file

break – se ci sono più cartelle viene presa la prima

end

end

currentFolder = mainFolder

– Il folder non è stato trovato

if currentFolder == “” then

local options = – define options to display text

  {

  text = “MAIN FOLDER DOESN’T EXIST”,

    x = screenCenterX,

    y = screenCenterY,

    font = native.systemFontBold,   

fontSize = 65,

    align = “center”

}

text = display.newText( options )

text:setTextColor(1, 0, 0)

if isAndroid then

native.requestExit()

else

– call for IOS devices

end

end

end

findMainFolder ()

mainFolder = currentFolder

– ***************************************************************************************

– Visualizza una immagine jpg o png, i parametri sono autoesplicativi

– Viene chiamata ogni volta che deve essere visualizzata un’immagine

piecesLoadAndShow = function ( group, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight, imFrom)

–print( “piecesLoadAndShow”,  group, fileName)

– carica e visualizza filename

local objectScreen = display.newImage( group, fileName, system.DocumentsDirectory )

if objectScreen  then

fileExist = true

   if objectScreen.width >= objectScreen.height then – objectScreen must be global

    scaleFactor = imgWidth/objectScreen.width

    else

    scaleFactor = imgHeight/objectScreen.height

   end

   objectScreen:scale ( scaleFactor, scaleFactor)

   – position from piecesCoordTable

  objectScreen.x = screenObjPosX

  objectScreen.y = screenObjPosY

  objectScreen.alpha = 1

end

–return fileExist

end

– ***************************************************************************************

– Visualizza l’immagine di background

local function backGroundShow ( bckgFileName )

local bkgScreen = display.newImage( bkgGroup, myFolder … “/” … bckgFileName, system.DocumentsDirectory, screenCenterX, screenCenterY )

bkgScreen.width = screenWidth

bkgScreen.height = screenHeight

end

backGroundShow ( bckgFileName )

– ***************************************************************************************

– Scrittura testo in basso

local function writeBottomText (tapText)

display.remove( text )

–alpha = bottomTextAlpha

local options = – define options to display text

{

  text = tapText,

  x = bottomTextX,

    y = bottomTextY,

    font = native.systemFont,   

fontSize = bottomTextFontSize

}

bottomText = display.newText( options ) – display text

bottomText:setTextColor( 0, 0, 1, 1)

end

writeBottomText ( tapText )

– ***************************************************************************************

– Si disegna il tasto in bassa a destra attingendo ad una libreria, widget, di oggetti

– predefiniti. La label del tasto viene usata per gestire le azioni:

– No label: tasto inattivo

– “CHIUDI”: cancella l’immagine o il testo che descrive un particolare oggetto

– “HOME”: riporta il sistema alle condizioni iniziali

local widget = require( “widget” )

– Function to handle button events

local function handleButtonEvent ( event )

if ( “ended” == event.phase ) then

audio.stop () – stop any audio

dtlAudioExist = false – resetta flag riproduzione audio

–video.stop () – stop any video

dtlVideoExist = false – resetta flag riproduzione video

        if button1:getLabel () == button1Label1 then – se label button1 é CHIUDI

        pagesStack [stackPointer].isVisible = true – immagini della griglia visibili

        titleText.alpha = titleTextAlpha – visualizzazione titolo pagina

bottomText.alpha = 1 – visualizzazione testo in basso

touchEnabled = true – abilitazione touch

if stackPointer == 1 then – se in mainlevel

      button1:setLabel ( “” ) – cancellazione label button1

else – altrimenti

button1:setLabel ( “HOME” ) – scrivi label button1

end 

      if dtlImgExist == true then – se è visuallizata immagine di 

dtlImgExist = false – dettaglio immagine viene 

– for i = 2,6 do

– pagesStack [stackPointer].isVisible = false

– end

dtlImgGroup:removeSelf () – cancellata

dtlImgGroup = nil

dtlImgGroup = display.newGroup ()

else

dtlTextExist = false – se è visualizzato testo di

dtlTextFrame:removeSelf () – dettaglio viene cancellato

dtlTextFrame = nil – frame e resto

dtlText:removeSelf ()

dtlText = nil

end

elseif

button1:getLabel () == button1Label2 then

pagesStack [stackPointer].isVisible = false

stackPointer = 1

pagesStack [stackPointer].isVisible = true

currentFolder = mainFolder

pageTitle ( currentFolder )

button1:setLabel ( “” )

– objGroup1:removeSelf ()

– objGroup2:removeSelf ()

– objGroup3:removeSelf ()

– objGroup4:removeSelf ()

– objGroup5:removeSelf ()

– objGroup6:removeSelf ()

– objGroup7:removeSelf ()

– objGroup1 = nil

– objGroup2 = nil

– objGroup3 = nil

– objGroup4 = nil

– objGroup5 = nil

– objGroup6 = nil

– objGroup7 = nil

– objGroup1 = display.newGroup ()

– objGroup2 = display.newGroup ()

– objGroup3 = display.newGroup ()

– objGroup4 = display.newGroup ()

– objGroup5 = display.newGroup ()

– objGroup6 = display.newGroup ()

– objGroup7 = display.newGroup ()

else

        end

    end

end

– Create the widget

local button1Options = 

{

    label = "    ",

    labelAlign = center,

    fontSize = button1FontSize,

    labelColor = { default={ 1, 0, 0 }, over={ 0, 0, 0, 0.5 } },

  onEvent = handleButtonEvent,

    emboss = false,

    shape=“roundedRect”,

    width = button1Width,

    height = button1Height,

    cornerRadius = 2,

    fillColor = { default={ 1, 1, 1, 1 }, over={ 1, 0.1, 0.7, 0.4 } },

    strokeColor = { default={ 0, 0, 1, 1 }, over={ 0.8, 0.8, 1, 1 } },

    strokeWidth = 5

}

button1 = widget.newButton ( button1Options ) – must be Global

– Center the button

button1.x = button1Xpos

button1.y = button1Ypos

– ***************************************************************************************

– Si preparano i dati per visualizzare le tessere. Le coordinate x e y  dove

– posizionare le tessere sono memorizzate nella tavola “piecesCoordTable”.

function populatePiecesCoordTable ()

local tableRow = 1

local countX = 1

local shiftX = 0.5

local posX = -piecesInaRow/2 + shiftX

local countY = 1

local posY = -piecesInaRow/2 + shiftY

while tableRow  <= maxPieces do

local piecePosX = screenCenterX + ( posX + ( countX - 1)) * objWidth

local piecePosY = screenCenterY + ( posY + ( countY - 1)) * objHeight

piecesCoordTable[tableRow] = { x=piecePosX, y=piecePosY, n=tableRow }

–print( "TABLEPREPARE - tR= " … tableRow … ", cX= " … countX … ", pPX= " … piecesCoordTable[tableRow].x … ", cY= " … countY … ", pPY= " … piecesCoordTable[tableRow].y)

  tableRow=tableRow+1

  countX = countX + 1

  if countX > piecesInaRow then

  countX = 1

  countY = countY + 1

  end

  end

end

populatePiecesCoordTable ()

– ***************************************************************************************

– Scrive il titolo della pagina visualizzata

– This function must be global

function pageTitle ( currentFolder )

– Legge il titolo della pagina visualizzata

– path to the file that to be read from. 

local path = doc_path … “/” … currentFolder … “/” … titleFileName

local file = io.open( path, “r” ) – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

– extract TitleOfPage

local stringLenght = string.find( savedData, “,” )

local titleOfPage = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract fontName

local stringLenght = string.find( savedData, “,” )

local fontName = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract fontSize

local stringLenght = string.find( savedData, “,” )

local fontSize = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract red value

local stringLenght = string.find( savedData, “,” )

local red = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract green value

local stringLenght = string.find( savedData, “,” )

local green = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract blue value

local stringLenght = string.find( savedData, “,” )

local blue = string.sub( savedData, 1, stringLenght - 1 )

local savedData = string.sub( savedData, stringLenght + 1 )

– extract alpha value

local stringLenght = string.find( savedData, “,” )

local alpha = string.sub( savedData, 1, stringLenght - 1 )

titleTextAlpha = alpha – save to restore, must be global

local savedData = string.sub( savedData, stringLenght + 1 )

pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )

end

end

function pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )

display.remove( titleText )

local options = { – define options to display text

  text = titleOfPage,

    x = screenCenterX,

    – Per la posizione del testo si parte dalla coordinata del centro della prima

    – tessera meno la metà dell’altezza di una tessera - uno shift fisso

    y = piecesCoordTable[1].y - objHeight / 2 - fontSize / 2, 

    font = fontName,   

fontSize = fontSize,

  --width = _W,

    --height = 0,

    align = “center”

}

titleText = display.newText( options )

titleText:setTextColor( red, green, blue, alpha )

end

pageTitle( currentFolder )

– ***************************************************************************************

– Carica e visualizza le immagini della prima pagina

function firstPage( objGroup, folder )

for n = 1, maxPieces do

local screenObjPosX = piecesCoordTable[n].x

local screenObjPosY = piecesCoordTable[n].y

local imgWidth = objWidth

local imgHeight = objHeight

local fileName = myFolder … “/” … folder … “/” … objName … n … objExt1

piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

local fileName = myFolder … “/” … folder … “/” … objName … n … objExt2

piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

– Disegna una griglia

local objectGrid = display.newRect ( objGroup, screenObjPosX , screenObjPosY, objWidth, objWidth )

objectGrid.strokeWidth = 4

objectGrid:setFillColor( 1, 1, 1, 0.0 )

objectGrid:setStrokeColor( 1, 0, 0 )

end

end

firstPage ( pagesStack [1], currentFolder )

– ***************************************************************************************

– Scrive il testo contenuto nel file di descrizione

local function dtlTextWrite ( savedData)

dtlTextFrame = display.newRoundedRect( screenCenterX, screenCenterY + 50, screenWidth - 60, screenHeight - 400, 30)

dtlTextFrame.strokeWidth = 8

dtlTextFrame:setStrokeColor( 1, 0, 0 )

dtlTextFrame:setFillColor( 1, 1, 1 )

local options =

{ – define options to display Dtl text

  text = savedData,

    x = screenCenterX,

    y = screenCenterY +220,

    font = native.systemFontBold,   

fontSize = 50,

    align = “left”,

    width = screenWidth -100,

    height = screenHeight - 100

}

dtlText = display.newText( options )

dtlText:setTextColor( 0,0,0)

end

– ***************************************************************************************

– Visualizza i dettagli dell’oggetto in formato testo se esiste la relativa pagina

– In ingresso il tasto toccato

– La pagina può contenere il nome di una altra cartella

local function getPieceDtlText( tappedObj)

local path = doc_path … “/” … currentFolder … “/” … objName … tappedObj… objDtlTextExt

local file = io.open( path, “r” )   – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

– local isFolder 

if string.find( savedData, “/” ) then

savedData = string.sub( savedData, 2 )

stringLenght = string.find( savedData, “/” )

if stringLenght then – la stringa è corretta

savedData = string.sub( savedData, 1 , stringLenght - 1 )

– cancella il titolo della pagina

titleText:removeSelf ()

titleText = nil

– si tratta di una pagina di oggetti, legge il nuovo titolo e lo visualizza; il nome del nuovo folder era stato trovato in precedenza e si trova nella variabile savedData

local path = doc_path … “/” … savedData … “/” … titleFileName

local file = io.open( path, “r” )   – open in read mode

if file then

local savedData = file:read( “*a” ) – read file

io.close( file )

end

currentFolder = savedData

pageTitle ( currentFolder)

– 1 nasconde la griglia di oggetti

– 2 incrementa il puntatore di stackPointer

– 3 visualizza la nuova griglia di oggetti

– 4 cancella la label di button1

pagesStack[stackPointer].isVisible = false

–print(“fffffffff”,#pagesStack)

if stackPointer  < 5 then

stackPointer = stackPointer + 1

else

stackPoiner = 1

end

firstPage ( pagesStack [stackPointer], currentFolder )

pagesStack[stackPointer].isVisible = true

button1:setLabel ( “HOME” )

end

else

– si tratta di una pagine di descrizione in forma testo, il parametro dtlTextExist (dettaglio del pezzo in forma di testo) deve essere falso e viene posto a vero

print(“ddddddddd”,dtlTextExist)

if dtlTextExist == false then

dtlTextExist = true

print(“ddddddddd”,dtlTextExist)

– 1 memorizza i paramentri del titolo per rispristinarlo

– 2 nasconde il titolo ponendo a zero il parametro alpha

– 3 nasconde il testo il testo in basso

– 4 nasconde la griglia di tessere

– 5 disabilita lo schermo al touch

– 6 scrive il dettaglio in forma di testo

– 7 scrive la label su button1

titleTextAlpha = titleText.alpha 

titleText.alpha = 0

bottomText.alpha = 0

pagesStack[stackPointer].isVisible = false

touchEnabled = false

dtlTextWrite ( savedData )

button1:setLabel ( “CHIUDI” )

end

end

else

– si tratta di un oggetto senza descrizione, visualizza una scritta per 1 secondi, il parametro dtlTextExist deve essere falso e viene lasciato falso

print(“ddddddddd”,dtlTextExist, dtlAudioExist)

if  dtlTextExist == false and  dtlAudioExist == false then

local options = – define options to display text

  {

  text = “DESCRIZIONE”,

    x = screenCenterX,

    y = screenCenterY,

    font = native.systemFontBold,   

fontSize = objWidth / 3,

    align = “center”

}

text = display.newText( options )

text:setTextColor(1, 0, 0)

– viene usata la funzione transition.fadeOut per visualizzare il testo per 1 solo secondo, insieme al testo vengono visualizzate du e linee incrociate

  transition.fadeOut( text, {time = 1000})

 

  line1 = display.newLine ( screenCenterX - objWidth, screenCenterY - objHeight / 3, screenCenterX + objWidth, screenCenterY + objHeight / 3 )

line1:setStrokeColor( 1, 0, 0, 1 )

line1.strokeWidth = 10

transition.fadeOut( line1, {time = 1000})

  line2 = display.newLine ( screenCenterX - objWidth, screenCenterY + objHeight / 3, screenCenterX + objWidth, screenCenterY - objHeight / 3 )

line2:setStrokeColor( 1, 0, 0, 1 )

line2.strokeWidth = 10

transition.fadeOut( line2, {time = 1000})

end

end

end

– ***************************************************************************************

– Vede se esiste una descrizione dell’oggetto in forma di immagine e se esiste la carica – e la visualizza.nel caso esista lo carica e lo manda in esecuzione.

– Vede anche se esiste un file video o audio audio 

local function getPieceDtlImg( tappedObj)

– video

local fileName =  myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlVideoExt

if dtlVideoExist == false then

– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)

dtlVideo = media.playVideo( “movie.m4v”, true, onComplete )

if dtlVideo then

dtlVideoExist = true

end

end

– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)

– audio

local fileName =  myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlAudioExt

if dtlAudioExist == false then

dtlAudio = audio.loadStream(fileName, system.DocumentsDirectory )

if dtlAudio then

audio.play( dtlAudio, { channel=1, loops=0, fadein=100 } )

dtlAudioExist = true

end

end

– immagine

local screenObjPosX = screenCenterX

local screenObjPosY = screenCenterY * 1.05

local imgWidth = screenWidth

local imgHeight = screenHeight * 0.77

local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt1

fileExist = false

piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt2

if fileExist == false then

piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )

end

if fileExist == true then

if dtlImgExist == false then

dtlImgExist = true

– cancella titolo e testo in basso e scrive la label di button1

titleText.alpha = 0

bottomText.alpha = 0

button1:setLabel ( “CHIUDI” )

touchEnabled = false

– nasconde le tessere

pagesStack[stackPointer].isVisible = false

end

else

dtlImgExist = false

– controlla se esiste una descrizione testuale

getPieceDtlText( tappedObj)

end

end

– ***************************************************************************************

– Toccando lo schermo viene eseguita questa funzione

local function onScreenTouch( event )

if event.phase == “began” then

if dtlAudioExist == true then

audio.stop( ) – stop audio

dtlAudioExist = false

end

if touchEnabled == true then  

– viene individuato la tessera toccata in base alle sue coordinate

– tappedObj contiene il numero della tessera

        for n=1,#piecesCoordTable do

        if event.x > ( piecesCoordTable[n].x - objWidth /2 ) and event.x < ( piecesCoordTable[n].x + objWidth /2 ) then

        if event.y > ( piecesCoordTable[n].y - objWidth /2 ) and event.y < ( piecesCoordTable[n].y + objWidth /2 ) then

        getPieceDtlImg (piecesCoordTable[n].n)

        end

        end

        end

        end

    end

    return tappedPiece

end

– ***************************************************************************************

– funzione di sistema che gestisce il tocco dello schermo e chiama la funzione

– onScreenToutch

– Register to call methods an infinite number of times

screen:addEventListener( “touch”, onScreenTouch )

–timer1 = timer.performWithDelay( 100, t, 0 )–]]

So you want the user to upload an image or something onto the app? And image that is on the users phone?

–SonicX278

the App is on the user phone and files (not only images) must be stored in the SD card  by a cable connection to a PC or removing the SD from phone and insert it into the PC slot. This why user have to load a lot of files, as you seen the main page of the App has 20 image and tapping one  of these can open a new window with 20 images and so on. If it’s better to store anything in the SD card Documents or Download folders

Hope to be clear,

Thank Stefano