Spanish Grabar foto tomada con camara.

Gustavo Schiffo

Member
Licensed User
Longtime User
Buenas, tengo un incomeniente que no logro resolver en cuanto a que me grabe en un archivo una foto tomada desde la cámara. Estoy sacando desde el ejemplo CameraIntent.

Dejo a continuacion la parte del codigo para ver si me pueden ayudar.

B4X:
Private Sub imgImagen_Click
    TakePicture
End Sub

Sub TakePicture
    Dim i As Intent
    i.Initialize("android.media.action.IMAGE_CAPTURE", "")
    'File.Delete(Starter.provider.SharedFolder, tempImageFile)
    Dim u As Object = Starter.provider.GetFileUri(tempImageFile)
    i.PutExtra("output", u) 'the image will be saved to this path
    Try
        StartActivityForResult(i)
    Catch
        ToastMessageShow("Camera is not available.", True)
        Log(LastException)
    End Try
End Sub

'result arrives here
Sub ion_Event (MethodName As String, Args() As Object) As Object
    If Args(0) = -1 Then
        Try
            Dim in As Intent = Args(1)
            If File.Exists(Starter.provider.SharedFolder, tempImageFile) Then
                lastPicture = LoadBitmapSample(Starter.provider.SharedFolder, tempImageFile, imgImagen.Width, imgImagen.Height).Rotate(-90)
                imgImagen.Bitmap = lastPicture
                
                'File.Copy(Starter.provider.SharedFolder, tempImageFile, File.DirDefaultExternal & "/", "eeee.jpg")
                
                SaveBitmapToFile(imgImagen.Bitmap, File.DirDefaultExternal & "/" ,"eee.PNG")
                
            Else If in.HasExtra("data") Then 'try to get thumbnail instead
                Dim jo As JavaObject = in
                lastPicture = jo.RunMethodJO("getExtras", Null).RunMethod("get", Array("data"))
            End If
        Catch
            Log(LastException)
        End Try
    End If
    If lastPicture.IsInitialized Then imgImagen.Bitmap = lastPicture
    Return Null
End Sub


Sub StartActivityForResult(i As Intent)
    Dim jo As JavaObject = GetBA
    ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
    jo.RunMethod("startActivityForResult", Array As Object(ion, i))
End Sub

Sub GetBA As Object
    Dim jo As JavaObject
    Dim cls As String = Me
    cls = cls.SubString("class ".Length)
    jo.InitializeStatic(cls)
    Return jo.GetField("processBA")
End Sub


Public Sub SaveBitmapToFile(Bitmap1 As Bitmap, Dir As String, FileName As String )
    Dim Out As OutputStream = File.OpenOutput(Dir, FileName, False)
    Bitmap1.WriteToStream(Out, 100, "PNG")  'or JPEG
    Out.Close
End Sub
 

josejad

Expert
Licensed User
Longtime User
File.DirDefaultExternal
Hola:

Probablemente no tienes permiso para escribir en esa carpeta. Prueba a cambiarla por xui.defaultFolder.

Lee sobre los permisos. Y busca en el foro sobre File.DirDefaultExternal para ver los inconvenientes en las nuevas versiones de Android.

Si no, sube un pequeño ejemplo de lo que estás haciendo.

Saludos,
 

Gustavo Schiffo

Member
Licensed User
Longtime User
B4X:
AddManifestText(
<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="31"/>
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetApplicationAttribute(android:usesCleartextTraffic, "true")
CreateResourceFromFile(Macro, Themes.DarkTheme)
AddPermission(android.permission.RECORD_AUDIO)
AddPermission(android.permission.MANAGE_EXTERNAL_STORAGE)
AddManifestText(<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="31" />
)

AddApplicationText(
  <provider
  android:name="android.support.v4.content.FileProvider"
  android:authorities="$PACKAGE$.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
  android:name="android.support.FILE_PROVIDER_PATHS"
  android:resource="@xml/provider_paths"/>
  </provider>
)
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)

Eso es la parte de Manifest, lo probe con 3 telefonos de diferentes versiones y no me guarda nada.

Lo baje e instale, anexe la parte de SaveBitmapToFile y tampoco me lo guarda en galeria
 

josejad

Expert
Licensed User
Longtime User
No vale con poner los permisos en el manifest, hay que pedir permiso al usuario con runtime.permisions, y aun así, en las últimas versiones de android, tampoco tienes acceso a esa carperta.
Prueba xui.defaultfolder para ver si es ese el problema.

tampoco me lo guarda en galeria
Para que aparezca en la galeria, no basta solo con guardar la foto.
 

Gustavo Schiffo

Member
Licensed User
Longtime User
No vale con poner los permisos en el manifest, hay que pedir permiso al usuario con runtime.permisions, y aun así, en las últimas versiones de android, tampoco tienes acceso a esa carperta.
Prueba xui.defaultfolder para ver si es ese el problema.


Para que aparezca en la galeria, no basta solo con guardar la foto.

probe asi como me mencionaste y tampoco funciona. Adjunto ejemplo del cambio.

B4X:
File.Copy(Starter.provider.SharedFolder, tempImageFile, xui.DefaultFolder & "/", "eeee.png")

SaveBitmapToFile(imgImagen.Bitmap, xui.DefaultFolder & "/" ,"eee.PNG")

Ni el SaveBitmapToFile, como el File.Copy me guardan/copia la imagen que se carga en el imgImagen de forma correcta.

Tambien en el Main agregue

B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    If FirstTime Then
        rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    End If

    
End Sub

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    If Permission = rp.PERMISSION_WRITE_EXTERNAL_STORAGE Then
        If Result = True Then
            Activity.LoadLayout("principal")
        Else
            ToastMessageShow("terminating program", True)
            Activity.finish
        End If
    End If

End Sub
 

josejad

Expert
Licensed User
Longtime User
probe asi como me mencionaste y tampoco funciona
como te decía: "y aun así, en las últimas versiones de android, tampoco tienes acceso a esa carpeta"

¿has leído el siguiente enlace que te puse en el post #6?

Si no, sube un pequeño ejemplo de lo que estás haciendo.

Ni el SaveBitmapToFile, como el File.Copy me guardan/copia la imagen que se carga en el imgImagen de forma correcta
¿Cómo lo estás comprobando?

Otro post que deberías leer para entender lo que te está pasando


especialmente:
Avoid using File.DirRootExternal. Either use File.DirInternal or RuntimePermissions.GetSafeDirDefaultExternal. It will not work with targetSdkVersion=30

...
 
Last edited:
Top