Italian creare una sound board

LucaMs

Expert
Licensed User
Longtime User
Avevo anche pensato di creare un percorso da far caricare i file audio li direttamente e chiamarli da quella cartella ma è troppo laboriosa per l'utente, mentre quella di cercali su tutto il telefono il file da suonare e meglio.
Il punto è che con ContentChooser l'utente potrebbe perfino selezionare file che si trovino in Rete (WEB).
Questo è anche il motivo per il quale poi il semplice salvare il percorso e rileggerlo da file non è sufficiente, non funziona.

Per ora Erel non ha risposto, il che significa che la cosa sia parecchio meno semplice di quanto si possa immaginare.

Se vuoi, sostituisco quella parte usando GetPathFromContentResult, ma col rischio di cui ti ho già detto.
 

LucaMs

Expert
Licensed User
Longtime User
... ed ho appena visto che, il progettino di esempio che mostra il problema, non è stato scaricato da nessuno alcuno, quindi nemmeno da Erel (cui, principalmente, è rivolta la mia domanda).
Beh, ho anche appena notato che Erel oggi ancora non ha scritto un solo post, quindi non è affatto detto che non abbia risposto in quanto la cosa sia difficile o, peggio, impossibile.

Credo che alla fine mi suggerirà di far copiare (automaticamente, anche perché l'utente non potrebbe) il file audio nella DirInternal (ma anche scrivere "come", spero; suppongo con un Intent)
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Beh, ho anche appena notato che Erel oggi ancora non ha scritto un solo post, quindi non è affatto detto che non abbia risposto in quanto la cosa sia difficile o, peggio, impossibile.

Credo che alla fine mi suggerirà di far copiare (automaticamente, anche perché l'utente non potrebbe) il file audio nella DirInternal (ma anche scrivere "come", spero; suppongo con un Intent)
LucaMs Quindi mi consigli di far inserire all'utente in una cartella specifica il file e al momento farlo eseguire oppure il codice postato da me che sul mio oppo a74 funziona e può dare problemi in altri smartphone?
 

LucaMs

Expert
Licensed User
Longtime User
LucaMs Quindi mi consigli di far inserire all'utente in una cartella specifica il file e al momento farlo eseguire oppure il codice postato da me che sul mio oppo a74 funziona e può dare problemi in altri smartphone?
No, oltre ad essere scomodo/fastidioso per l'utente, come hai scritto, sarebbe difficile creare una tale cartella accessibile all'utente e all'app.

Quello che intendevo io è che probabilmente Erel mi risponderà che usando ContentChooser, come nella sua classe, l'app dovrebbe copiare (o scaricare da Internet) i file audio e metterli nella DirInternal (accessibile solo all'app stessa), forse usando un Intent.

E' un po' come dici, solo che la cartella sarebbe appunto la DirInternal e non sarebbe l'utente a doverla riempiere con i 10 file (e non potrebbe farlo).
 

XorAndOr

Active Member
Licensed User
Longtime User
... ed ho appena visto che, il progettino di esempio che mostra il problema, non è stato scaricato da nessuno alcuno
Ho visto l'esempio e il problema che da' su android. Perchè su BlueStacks emulatore funziona benissimo.
Un problema di permessi perchè dopo aver inserito rp.runtimepermission funziona bene.
B4X:
For Each permission As String In Array(rp.PERMISSION_READ_EXTERNAL_STORAGE,rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        rp.CheckAndRequest(permission)
        Wait For Activity_PermissionResult (permission As String, Result As Boolean)
        If Result = False Then
            ToastMessageShow("Non hai i permessi!", True)           
            Return
        End If
    Next
 

LucaMs

Expert
Licensed User
Longtime User
Un problema di permessi perchè dopo aver inserito rp.runtimepermission funziona bene.
No, è "roba vecchia".

A causa dei soliti cambiamenti di Google-Android, il modo per accedere ai file, anche a fonti esterne, è quello descritto da Erel nel suo esempio:
https://www.b4x.com/android/forum/threads/b4x-texteditor-save-and-load-external-files.132731/
perché altri modi non ti assicurano che tutto vada come dovrebbe (e che non ci saranno crash).

Il punto è che quell'esempio riguarda solo file di testo e principalmente la fase Save (non ho provato ll progetto, quindi non so se il successivo Load andrebbe a buon fine) mentre in questo caso riguarda file audio e in altri eventuali tipi ancora diversi.
 

LucaMs

Expert
Licensed User
Longtime User
ho provato questi 2 formati Mp3 e Wawe e funziona, anche chiudendo l'app e riaprendo mantiene il file Dir.txt e FileName.txt e avvia canzone con Play
Il problema non è il tipo di file audio (intendevo una cosa diversa... lunga da spiegare - anzi, rispiegare), ma il percorso che porta al file.
L'utente potrebbe selezionare un file e l'app non essere in grado di accedervi (quindi, in questo caso, suonarlo).
 

XorAndOr

Active Member
Licensed User
Longtime User
Il problema non è il tipo di file audio (intendevo una cosa diversa... lunga da spiegare - anzi, rispiegare), ma il percorso che porta al file.
L'utente potrebbe selezionare un file e l'app non essere in grado di accedervi (quindi, in questo caso, suonarlo).
Tempo fa ho fatto un Mp3Player, ma visto la complessità nel trovare il percorso giusto (Uri)
e Erel sconsigliava di usare quello nei vari post che non era affidabile,
ho usato un server esterno con i file audio e exoplayer, funziona benissimo.
Grazie al tuo esempio con la funzione di salvare e caricare il file di testo come percorso Uri,
secondo me è l'unico metodo per sapere qual è il percorso reale che il MediaPlayer vuole come (Dir,FileName).
Poi se l'utente invece di cliccare su un Mp3 clicca su un PDF e spera che suoni, quella è un'altra storia.
 

LucaMs

Expert
Licensed User
Longtime User
Poi se l'utente invece di cliccare su un Mp3 clicca su un PDF e spera che suoni, quella è un'altra storia.
😄

No, mi spiego un po' meglio, spero.

Per quel che riguarda l'esempio di Erel, lui lo indica spesso nelle sue risposte circa l'argomento "memoria esterna". E' un esempio utile solo per file di testo, ma l'importante è appunto la faccenda "URI".

Volendo si può modificare la sua classe, per consentire all'utente di selezionare vari ed altri tipi di file, cosa che appunto ho fatto per i file audio.
Originale di Erel:
B4X:
Public Sub Load As ResumableSub
    Dim cc As ContentChooser
    cc.Initialize("cc")
    cc.Show("text/*", "Choose text file") ' <-----
    Wait For CC_Result (Success As Boolean, Dir As String, FileName As String)
    Dim res As LoadResult = CreateLoadResult(Success, Dir, FileName)
    If res.Success Then ExtractInformationFromURI(res.FileName, res)
    Return res
End Sub
Per i file audio:
B4X:
cc.Show("audio/*", "Choose audio file")
Insomma, bisogna cambiare quel "text/*", "audio/*", ovvero il tipo MIME.

Il problema è poi il poter riutilizzare l'uri restituito per poter accedere di nuovo a quel file e, in questo caso, farlo suonare al MediaPlayer.

L'esempio che ho allegato al mio thread in cui ho posto la domanda, dovrebbe essere abbastanza chiaro.
 
Top