Italian Rielaborare le foto scattare con la camera dello smartphone

AlpVir

Well-Known Member
Licensed User
Longtime User
Sono in grado di conoscere dove la fotocamera registra le fotografie ed anche qual'è il nome dell'ultima foto scattata, ma non so né come copiare (da qualche parte) il file relativo nè come creare un suo bitmap. Tampoco (!) riesco ad utilizzare l'istruzione FileCopy2() specifica per gli stream.
Insomma, non so rielaborare i files relativi alle foto scattate con la fotocamera dello smartphone.
B4X:
Dim b as BitMap
Dim DCIM as string
Dim UltimaFoto as string
Dim NomeFile as string
DCIM=GetExternalStoragePublicDirectory("DCIM") & "/camera"   '  DCIM=/storage/7AA1-6DD1/DCIM
UltimaFoto=MostRecentFile(DCIM)    '   UltimaFoto=IMG_20191211_142357.jpg
NomeFile=DCIM & "/" & UltimaFoto   '  Nomefile=/storage/7AA1-6DD1/DCIM/camera/IMG_20191211_142357.jpg
' --- non so eseguire nessuna di queste 2 istruzioni
' b = LoadBitmapResize(DCIM, UltimaFoto, 1024, 1920 ,True) ' ridimensiona la foto
' File.Copy (DCIM, UltimaFoto,File.DirRootExternal,"temp.jpg") ' copia la foto in temp.jpg
Preciso che i permessi dovrebbero essere corretti, utilizzando la libreria Runtime Permissions.
B4X:
AddPermission("android.permission.WRITE_EXTERNAL_STORAGE")
AddPermission("android.permission.READ_EXTERNAL_STORAGE")
Qualcuno mi può dare una dritta ?
Grazie per l'attenzione !
 

Sagenut

Expert
Licensed User
Longtime User
Prova così
B4X:
b = LoadBitmapResize(DCIM & "/", UltimaFoto, 1024, 1920 ,True)

AddPermission("android.permission.WRITE_EXTERNAL_STORAGE")
AddPermission("android.permission.READ_EXTERNAL_STORAGE")
Questo è il codice da mettere nel Manifest, poi hai richiesto i permessi da codice con Runtime Permissions?
Immagino di sì ma lo chiedo per sicurezza.
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
Niente !

B4X:
    If File.Exists(DCIM & "/", UltimaFoto) Then
                    Log ("C'è. Posso procedere")
                Else
                    Log ("NON c'è")   
                End If
                
                 B.Initialize(DCIM & "/", UltimaFoto)
                 b = LoadBitmap(DCIM & "/", UltimaFoto)
Errore alla linea B.Initialize(DCIM & "/", UltimaFoto)
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize2(CanvasWrapper.java:539)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Eliminata la riga. Stesso errore
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize2(CanvasWrapper.java:539)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho il sospetto che il primo parametro di File.Copy possa essere solo File.Assets, File.DirInternal, ecc.
Essendo File.DirRootExternal=/storage/7AA1-6DD1
e
Nomefile=/storage/7AA1-6DD1/DCIM/camera/IMG_20191211_142357.jpg
ho modificato UltimaFoto in
UltimaFoto="DCIM/Camera/" & UltimaFoto
scrivendo poi
b = LoadBitmap(File.DirRootExternal, UltimaFoto)
In tal modo il primo parametro è un qualcosa di "canonico" e non "strano" come la variabile DCIM.
Nessun risultato positivo però !!!
 

Sagenut

Expert
Licensed User
Longtime User
Il primo parametro di LoadBitmap richiede un valore STRING quindi non dovrebbe essere un problema la tua variabile con il percorso.
 

Sagenut

Expert
Licensed User
Longtime User
Posta il Log Errori completo, almeno la prima parte per verificare che non ci siano altre informazioni utili a capire il problema.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Ancora una prova
B4X:
Log("File.DirRootExternal=" & File.DirRootExternal)
               Log("UltimaFoto=" & UltimaFoto)
               Log("NomeFile=" & NomeFile)
               b = LoadBitmap(File.DirRootExternal, UltimaFoto)
  ' prova   b = LoadBitmapSample(File.DirRootExternal, UltimaFoto,1024,1920)
I 3 log qui sopra stampano i seguenti dati :
File.DirRootExternal=/storage/7AA1-6DD1
UltimaFoto=DCIM/Camera/IMG_20191211_142357.jpg
NomeFile=/storage/7AA1-6DD1/DCIM/camera/IMG_20191211_142357.jpg

Ed ecco il log completo (la linea 253 è appunto b = LoadBitmap(File.DirRootExternal, UltimaFoto)) :

File.DirRootExternal=/storage/7AA1-6DD1
UltimaFoto=DCIM/Camera/IMG_20191211_142357.jpg
NomeFile=/storage/7AA1-6DD1/DCIM/camera/IMG_20191211_142357.jpg
Error occurred on line: 253 (Manutenzione)
java.lang.RuntimeException: Error loading bitmap.
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize2(CanvasWrapper.java:539)
at anywheresoftware.b4a.objects.drawable.CanvasWrapper$BitmapWrapper.Initialize(CanvasWrapper.java:517)
at anywheresoftware.b4a.keywords.Common.LoadBitmap(Common.java:1343)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:348)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:180)
at anywheresoftware.b4a.debug.Debug.delegate(Debug.java:262)
at alpvir.webcamalpvir.manutenzione._catturaultimaimmagine(manutenzione.java:649)
at alpvir.webcamalpvir.manutenzione._botricaricaarchivio_click(manutenzione.java:641)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
at java.lang.reflect.Method.invoke(Native Method)
at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:144)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:180)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:176)
at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:80)
at android.view.View.performClick(View.java:6367)
at android.view.View$PerformClick.run(View.java:25040)
at android.os.Handler.handleCallback(Handler.java:795)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:6861)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:450)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
 

LucaMs

Expert
Licensed User
Longtime User
Prova questo codice:
B4X:
Dim DCIMFolder As String
DCIMFolder = GetExternalStoragePublicDirectory("DCIM")
For Each PhotoFileName As String In File.ListFiles(DCIMFolder)
    Logcolor(PhotoFileName, Colors.Blue)
Next

Sul mio smartphone è necessario aggiungere "Camera", perché questa directory è ciò riporta la lista, non i file immagine.
 

Sagenut

Expert
Licensed User
Longtime User
Ammesso che possa essere il problema, manca di nuovo lo slash
B4X:
b = LoadBitmap(File.DirRootExternal, "/" & UltimaFoto)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Non è quello il problema denunciato da LucaMs. Quel codice è già presente nella mia app nelle 2 seguenti sub.

B4X:
Sub GetExternalStoragePublicDirectory (name As String) As String
   Dim jo As JavaObject
   jo.InitializeStatic("android.os.Environment")
   Dim path As Object = jo.RunMethod("getExternalStoragePublicDirectory", Array(name))
   If path = Null Or File.Exists(path, "") = False Then
     Log("No such folder.")
     Return ""
   End If
   Return path
End Sub

Sub MostRecentFile(dir As String) As String
    Dim latest As String
    Dim t As Long = 0
    For Each f As String In File.ListFiles(dir)
        If Not(File.IsDirectory(dir,f)) Then
            If File.LastModified(dir,f)>t Then
                latest = f
                Log("MostRecentFile Latest=" & latest)
                t = File.LastModified(dir,f)
            End If
        End If
    Next
    Return latest
End Sub

richiamate così :
DCIM=GetExternalStoragePublicDirectory("DCIM") & "/camera"
per ricavare la cartella in cui sono memorizzate le immagini (che può essere anche una SD esterna)
e così :
UltimaFoto=MostRecentFile(DCIM)
che ricava qual'è la foto più recente.
 

Sagenut

Expert
Licensed User
Longtime User
prova a lanciare questo
L'ho provato io per curiosità e funziona.
L'unica nota è che rileva la SD EMULATA e non quella FISICA.
Se uno salva le foto su quella FISICA quindi è ancora tagliato fuori.
 
Last edited:

udg

Expert
Licensed User
Longtime User
Dai log vedo che una volta hai "Camera" ed un'altra "camera"; non so quale sia quello corretto che ti ritorna la routine di sistema, ma è possibile che se è il primo e poi tu crei manualmente il secondo come nome file, allora il risultato è che non si riesca a trovare il file a causa della maiuscola/minuscola nel nome della dir.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@udg: Camera e camera sono ininfluenti.
@LucaMs: grazie del progettino che hai allegato al tuo post. Funziona perfettamente.
Purtroppo mi sono accorto solo poco fa che l'immagine (l'ultima immagine, come desiderato) era bacata. Questo il motivo di tutti quegli errori: era di 0 byte.
Ed io mi intestardivo a tentare di visualizzare una file con estensione JPG credendo che fosse una immagine valida !
Chiedo scusa a tutti per il tempo perso per rimediare ad un mio errore !
Grazie ancora !
 
Top