Spanish (SOLUCIONADO)saber la ruta de una app mia ya instalada?

TheFalcon

Active Member
Licensed User
Longtime User
Buenas, ante todo dar gracias, y pedir que estáis despiertos para leer, ya que me explico como el culo :p.

Tengo una APK gratuita que se llama por ejemplo com.miapk y evidentemente guarda la ruta en android/data/etc etc com.miapk

Quiero hacer ahora una versión mejorada de pago que se llamara com.miapk_pro , se como hacer que cuando instale la aplicación de pago compruebe si existe la versión anterior.

Lo que quiero es saber como sacar la ruta de la versión anterior , ya que mi idea es que cuando instales la pro, detecte que la gratuita esta instalada y te de la opción de hacer una copia de datos de la anterior a la nueva.

No se si es posible e mirado algunos hilos y no son muy esperanzadores, si no es posible , agradecería cualquier orientación de como hacerlo.
Muchas Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola TheFalcon:

Partiendo de que tu has creado la App anterior sabes el nombre del paquete .

Saber si está instalada
B4X:
Sub AplicacionInstalada(NombreDelPaquete As String) As Boolean

    Dim pm As PackageManager ' libreria Phone
    Try
        pm.GetVersionName(NombreDelPaquete)
        pm.GetInstalledPackages
        Return True
     Catch
        Return False
    End Try     
 
End Sub



Te devuelve la ruta de donde estan los datos.
B4X:
Sub LeerDir(package As String) As String
   Dim r As Reflector
   r.Target = r.GetContext
   r.Target = r.RunMethod("getPackageManager")
   r.Target = r.RunMethod3("getPackageInfo", package, "java.lang.String", 0x00000001, "java.lang.int")
   r.Target = r.GetField("applicationInfo")
   Return r.GetField("dataDir")
   
End Sub

"El problema" de esto es que te da la ruta: data/data/NombreDelPaqueteInstalado que no podrás acceder si no eres root, pero puedes coger la ruta final y sabras donde está instalado, normalmente es en la raiz del movil (File.DirRootExternal) /Android/Data/NombreDelPaquete

Y si con ese código no te va bien, es tan facil como en la aplicación No de pago, grabar en el raiz o en otro sitio que no sea el de la aplicacion, un fichero que contenga la ruta donde está instalada la App, luego desde la versión PRO miras si está instalada, y si lo está lees ese fichero y copias.

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Muchas Gracias como siempre , lo probare y ya te comento, si no pues intentare a ver como consigo de la aplicación gratuita poner una opción de backup y que copie y comprima los datos para importar en la otra.
Muchas Gracias :).
 

TheFalcon

Active Member
Licensed User
Longtime User
Buenos, después de pegarme un tiempo con quebradero de cabeza, reabro esto xDD.

NO consigo hacerlo, en la app beta creo un txt en el que escribo la ruta real de la aplicación beta

B4X:
/storage/emulated/0/Android/data/MIPAQUETE/files/

pero no consigo acceder desde la apricacion2.

con la funcion LEERDIR , obtengo la ruta del paquete en el que tengo el txt y me la devuelve así

B4X:
/data/user/0/MIPAQUETE

intento comprobarlo añadiéndole luego /files/archivo.txt , pero no hay manera, no se por que.

llevo todo el día intentándolo y ya me estoy volviendo loco xD
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Como te dije, esa ruta que te devuelve el dir solo podras acceder a ella si eres root.
Como sabes el nombre del paquete, lo mejor es que lo emplees directamente.
Haz una prueba de copiar el fichero y sabras si te va (te tiene que ir SI o SI :D).

B4X:
Dim dir As String
    
dir = File.DirRootExternal & "/Android/data/NOMBREDELPAQUETE/files"
        
File.Copy(dir,"NOMBREDELFICHERO" ,File.DirDefaultExternal,"NombreFichero.txt")

Acuerdate de poner el nombre del fichero que exista en esa version beta, para copiarlo.
Te aconsejo que crees un nuevo proyecto y en el create pongas esas lineas, y en dir = pongas un punto de ruptura y ejecutes paso a paso y veas que ruta estas poniendo, y si la pones bien te debe de funcionar.
Acuerdate tambien de los permisos de lectura/escritura


Saludos:
 

TheFalcon

Active Member
Licensed User
Longtime User
Lo pruebo y te digo esta misma tarde, la version beta ya me crea el fichero en el cual esta la ruta

/storage/emulated/0/Android/data/MIPAQUETE/files/

lo que no consigo es acceder desde la aplicación pro, ya que el fichero lo guardo en la carpeta files de la aplicación Beta ,voy a probar eso que me comentas "malditos permisos Root"

Gracias como siempre
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Esa ruta:
/storage/emulated/0/Android/data/MIPAQUETE/files/
Es la ruta File.DirDefaultExternal incluyendo "/files", en conclusión, cuando tu pones File.DirDefaultExternal es esa ruta completa, pero si desde otra aplicación quieres copiar algo de esa ruta, tienes que incluir /file como te he comentado arriba.

Para hacerlo mas simple, si quieres copiar desde la version PRO (a su carpeta raiz) el fichero que tienes en BETA seria algo asi:

B4X:
Dim dir As String
  
dir = File.DirRootExternal & "/Android/data/NOMBREDELPAQUETEBETA/files"
      
File.Copy(dir,"NOMBRE_DEL_FICHERO_EN_BETA" ,File.DirDefaultExternal,"Nombre_Fichero_En_Pro")

File.DirRootExternal = /storage/emulated/0 , el raiz del dispositivo

A tener en cuenta:
cuando tu haces referencia a File. y un directorio(File.DirRootExternal, File.DirDefaultExternal, etc), te lo devueve sin la barra (/) del final, y por eso si vas a otro por encima tienes que añadirla. Por eso te comenté que lo hicieras en debug y paso a paso, al ponerte encima de una variable te dará su valor. Si pones Log con las carpetas podrás ver donde te estas equivocando para que no te copie, que lo mas seguro es en el tema de barras.

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
hecho, del modo que me has dicho no me hace falta un archivo con la ruta de la aplicación , con la opción que me diste me funciona bien por lo menos en un proyecto nuevo .

B4X:
    ruta = LeerDir("com.Fjo.DiarioCetrero")'sacamos la ruta de la antigua aplicación
 
    Dim arc As Archiver
 
    Dim dir As String
 
    dir = File.DirRootExternal & "/Android/data/com.Fjo.DiarioCetrero/files"
     
    arc.TarGzFolder(dir &"/Multimedia",File.DirDefaultExternal,"Multimedia") ' comprimo carpeta y la copio a mi nueva aplicacion
     
     
    arc.UnTarGz(File.DirDefaultExternal,"Multimedia.tar.gz",File.DirDefaultExternal) ' descomprimo la carpeta
     
    File.Delete(File.DirDefaultExternal,"Multimedia.tar.gz") ' borro el archivo comprimido

Ya te dije e un momento que en málaga tienes barra libre de cañas xD, ya te debo una mariscada. Eres un crack

PD: Solo una duda
B4X:
 "/Android/data/com.Fjo.DiarioCetrero/files"
esa ruta sera igual en todos los dispositivos ¿NO?, o depende el dispositivo puede variar algo, por que si varia xD me va a fastidiar bien.
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

Me alegro que lo solucionaras. Aunque no entiendo para que haces la llamada ruta = LeerDir , por que veo que no la utilizas.

"/Android/data/com.Fjo.DiarioCetrero/files"
esa ruta sera igual en todos los dispositivos ¿NO?, o depende el dispositivo puede variar algo, por que si varia xD me va a fastidiar bien.
Yo hasta ahora en versiones de Android desde 5 para arriba no he visto que cambie. No recuerdo en que versiones te permitia instalar en la tarjeta externa (fisica) del dispositivo (si tenias). Pero desde hace mucho tiempo Android no te deja instalar en la tarjeta SDCard externa. Incluso a partir de Android 4.4 ya no es posible acceder directamente a almacenamientos externos (SDCard, USB...). La única forma de acceder a estos almacenes es a través del Storage Access Framework (SAF) empleando un código bastante complejo (montando y desmontando) y siendo root.

Y aunque la probabilidad que esa dirección cambie es muy dificil, para eso tienes varias opciones de saber donde instalas, te pongo dos:

- Como has instalado la PRO, ya sabes a que dirección apunta File.DirDefaultExternal, por lo tanto puedes sacar de ahí la dirección base y cambiar el nombre del paquete de PRO por el de BETA y ya tienes la carpeta.

- Crea un fichero de texto en el raiz del dispositivo (File.DirRootExternal) o donde quieras (puede ser encriptado o no, pero que no sea dentro de la carpeta de una App por que tendrias el mismo problema) y cuando arranques la versión BETA guardas el File.DirDefaultExternal, y asi sabrás exactamente donde se instaló leyendolo desde la versión PRO.

Ya te dije e un momento que en málaga tienes barra libre de cañas xD, ya te debo una mariscada.
Vamos bien :D

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Ok, hare lo del archivo igualmente para curarme en salud, y lo de leerdir ya lo había quitado, con el código que me diste no me hacia falta .Muchas Gracias.

A mi ahora si me da opción de instalar en la SD card, ¿eso se puede prohibir? es decir que por narices instales en la memoria interna del teléfono mi aplicación
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola:

A mi ahora si me da opción de instalar en la SD card, ¿eso se puede prohibir? es decir que por narices instales en la memoria interna del teléfono mi aplicación

En #Region Project Attributes , prueba a poner #CanInstallToExternalStorage: False , con eso tendria que funcionar y no dejarte instalar en la SD Card externa.

Saludos
 
Top