Spanish [Solucionado] Problemas al instalar BD en android 6

Carlos marin

Active Member
Licensed User
Longtime User
hola amigos:

mi problema es que al instalar mi app en un android 6 este no esta pasando la base de datos, pensé que tenia que ver con la configuración de memoria externa o interna pero ya descarte esto y aun sigue el problema. alguien ya le a pasado? auxilio
 

Attachments

  • IMG-20170313-WA0089.jpg
    IMG-20170313-WA0089.jpg
    60.4 KB · Views: 303

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Esto lo mas seguro es los permisos de usuario que no los tienes para Android 6, puedes hacer una prueba rapida, vete a Ajustes/Administrador de aplicaciones/Permisos y ahí dale permiso de lectura y escritura, y vuelve a entrar en la app, si te funciona tendrás que hacer la secuencia de pedir permisos, en este foro ya se ha hablado de eso, por ejemplo aqui:

https://www.b4x.com/android/forum/threads/permisos-de-tiempo-de-ejecución-android-6-0.76228/


Saludos
 

JCO

Active Member
Licensed User
Longtime User
Hola Carlos,

Al instalar la aplicación (la primera vez que se abre) copias el archivo de la base de datos a la carpeta correspondiente?
Algo así como:
B4X:
File.Copy(File.DirAssets, "DbName.db", File.DirInternal, "DbName.db")
 

Carlos marin

Active Member
Licensed User
Longtime User
hola a todos.

mi estimado bgsoft precisamente me estaba devorando tu interesante debate con Desof y tienes toda la razón, ese era el problema. estoy trabajando en la solución por eso no lo habia publicado aun, pero aun me salen muchos errores pondré mi código de inicio aquí y ps me gustaría que me brindaran su opinión. y otra duda que tengo. el evento Activity_PermissionResult pensé que no era tan necesario pero el programa me muestra error al no encontrarlo y una vez dentro de este que hago aquí es solo lectura o debo activar eventos de este?
B4X:
Sub Activity_Create(FirstTime As Boolean)
    Dim p As Phone
    Dim va As Int
    va = p.SdkVersion
    If va >= 23 Then
        FlagAndroid6oSuperior = True
    Else
        FlagAndroid6oSuperior = False
    End If
   
    If FlagAndroid6oSuperior And rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) = False Then
        Msgbox("Hola, Para poder iniciar la app debe autorizar permisos en el siguiente diálogo. con el fin de escribir en la memoria del equipo. Gracias", "Solicitud de Permisos")
        rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    End If
    'SI EXISTE MEMORIA EXTERNA
    If File.ExternalWritable Then
        ruta = File.DirDefaultExternal
    Else
        ruta = File.DirInternal
    End If
   
    If FirstTime Then
        server.Initialize(0, "")
        timer1.Initialize("Timer1", 3000)
        'SI EXISTE LA BASE DE DATOS EN EL MOVIL
        If File.Exists(ruta,"mascota.db") = False Then
            File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")
        End If
        s.Initialize(ruta, "mascota.db",True)
    End If
   
    validar_inicio  ' VALIDAR QUE EL USUARIO EXISTE
    timer1.Enabled = False
    If p.SdkVersion >= 9 Then
           Dim r As Reflector
           r.Target = r.CreateObject("android.os.StrictMode$ThreadPolicy$Builder")
           r.Target = r.RunMethod("permitAll")
           r.Target = r.RunMethod("build")
           r.RunStaticMethod("android.os.StrictMode", "setThreadPolicy", _
           Array As Object(r.Target), Array As String("android.os.StrictMode$ThreadPolicy"))
    End If
   
End Sub

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
   
    ' aqui no tengo nada
   
End Sub

tengo lo mismo para la cámara pero esta no se activa, vi por ejemplo en un foro que erel utiliza el Activity_PermissionResult para activar el gmap.MyLocationEnabled sera que esto mismo hay que hacer con los permisos de camara??... muchas gracias a todos por su ayuda.
 

Carlos marin

Active Member
Licensed User
Longtime User
El único problema que estoy teniendo es que cuando me pide permisos para poder agregar la base de datos (al inicio del programa), el programa no para, sino que sigue toda la rutina, entonces muestra un montón de errores habidos y por haber. hay forma de que el programa pare para que el usuario responda si otorga permisos y después reanude???
 

cas6678

Active Member
Licensed User
Longtime User
No se si te sera de ayuda esto pero con que version de B4A estas trabajando?. Yo cuando empece a tener problemas en los android 6.0 tambien me volvi loco y al final todo se soluciono actualizando mi version de B4A a la version 6.0.
 

dar2o3

Active Member
Licensed User
Longtime User
Cuando el usuario responde si concede o no los permisos necesarios salta el siguiente evento:

B4X:
Sub Activity_PermissionResult (Permission As String, Result As Boolean)

    ' aqui pones lo que quieres hacer en caso de que result sea true.

End Sub

En realidad Android comprueba internamente si tiene o no concedidos los permisos necesarios por parte del usuario, si por ejemplo es la primera vez que va a acceder a la memoria interna, pregunta al usuario, si no es la primera vez, comprueba si tiene permiso o no.

Así que tendrás que preguntar el valor de result en un if y en caso de que sea verdadero, compruebas lo que tengas que comprobar y copias la bd o lo que quieras hacer.
 
Last edited:

Carlos marin

Active Member
Licensed User
Longtime User
Hola dar2o3 hice lo que me indicaste pero mira el problema que tengo:

este es el código:

B4X:
Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) = True Then
        'SI EXISTE LA BASE DE DATOS EN EL MOVIL
        Try
            If File.Exists(ruta,"mascota.db") = False Then
                File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")
            End If
        Catch
            Log(LastException)
        End Try
        s.Initialize(ruta, "mascota.db",True)
        validar_inicio  ' VALIDAR QUE EL USUARIO EXISTE
    Else
        Activity.Finish   
    End If
End Sub

Cuando procede a copiar la base de datos (File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")) me muestra este error:
(Exception) java.lang.Exception: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.mascotas.ps/files/mascota.db: open failed: ENOENT (No such file or directory)

y ps es obvio por que cuando voy a mirar esa ruta mi carpeta no se a creado. entonces cuando vuelvo a ejecutar mi app. hay si se crea y funciona con serenidad, como hago para controlar esto ayudemen!!!, en cuanto a la respuesta del compañero cas6678 utilizo la version 6.50
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Carlos:

Como decia Jack el destripador; vayamos por partes :D

'SI EXISTE MEMORIA EXTERNA
If File.ExternalWritable Then
ruta = File.DirDefaultExternal
Else
ruta = File.DirInternal
EndIf

El File.DirDefaultExternal no es la memoria externa, si por memoria externa te refieres a una tarjeta externa SD. Esa carpeta está en la memoria del dispositivo móvil en: / storage/sdcard0/Android/data / "Nombre del Paquete"/ files

File.DirInternal no lo puedes poner como ruta para copiar la base de datos, esa carpeta es de solo lectura, y está ubicada en: / data / data / "Nombre del Paquete" / files

If File.Exists(ruta,"mascota.db") = False Then
File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")
End If
Has cambiado esto y lo has puesto como bien te dijo Dar2o3 en Activity_PermissionResult, pero no haces correctamente la consulta, tendrias que hacer algo asi:


B4X:
Sub Activity_PermissionResult (Permission AsString, Result As Boolean)
  Dim Texto As String
  Texto = "Esta aplicación necesita permiso para trabajar con la base de datos" & CRLF & CRLF
  Texto = Texto & "La aplicación se cerrará al no haber concedido este permiso"

  If Permission = rp.PERMISSION_WRITE_EXTERNAL_STORAGE then
     if Result Then
       ' Hay permiso de escritura
       If File.Exists(ruta,"mascota.db") = False Then File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")
     else
       ' NO hay permiso de escritura
       Msgbox(Texto,"Nombre aplicación")
       ExitApplication
    End If
  End If

Tambien tienes que poner en el Manifets los permisos de lectura y escritura:
B4X:
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE

Saludos
 

Carlos marin

Active Member
Licensed User
Longtime User
Muchas gracias a todos. por fin pude solucionar este problema. tengo unas ultimas cositas asi que abrire un nuevo foro para esto. mil gracias de verdad.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Seguro que si le das al Like a bgsoft, se sentirá más animado a ayudarnos a todos la próxima vez ;)

Exmo. Sr. Don Pedro ;), si los like fueran euros a mi cuenta corriente estaria animadísmo :D , no es que un like se desprecie, pero sabes y vives tambien como yo que muchas veces pierdes mucho tiempo ayudando y al final ni ponen el [SOLUCIONADO] (no es este el caso) ,me conformaria que Carlos dijera cual fué la solución, ya que entre todos hemos dado varias ideas de donde podria estar el problema, de esa forma el resto del foro se beneficia ya que verá un problema y como se solucionó.

Te debo un txakolin por lo del like :) , a ver si este año lo hacemos.

Saludos
 

Carlos marin

Active Member
Licensed User
Longtime User
Hola claro que si, la solución me la proporcionaron uds compañeros deje el codigo asi. aun no e implementado el de bgsoft pero si lo haré

B4X:
If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) = True Then
        'SI EXISTE MEMORIA EXTERNA
        'If File.ExternalWritable Then
            ruta = File.DirDefaultExternal
        'Else
        '    ruta = File.DirInternal
        'End If
        'SI EXISTE LA BASE DE DATOS EN EL MOVIL
        Try
            If File.Exists(ruta,"mascota.db") = False Then
                File.Copy(File.DirAssets,"mascota.db",ruta,"mascota.db")
            End If
        Catch
            ToastMessageShow(LastException,True)
        End Try
        s.Initialize(ruta, "mascota.db",True)
        validar_inicio  ' VALIDAR QUE EL USUARIO EXISTE
    Else
        ExitApplication
    End If

tal como me indcarion y deje la base de datos ps en File.DirDefaultExternal. muchas gracias enserio
 

dar2o3

Active Member
Licensed User
Longtime User
Muchas gracias por exponer la solución Carlos, así este post podrá ayudar a mas personas.

Jesús, Tu pones el txakolí y yo el Bacalao :)
 
Top