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

Discussion in 'Spanish Forum' started by TheFalcon, Sep 30, 2018.

  1. TheFalcon

    TheFalcon Active Member Licensed 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
     
  2. bgsoft

    bgsoft Well-Known Member Licensed User

    Hola TheFalcon:

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

    Saber si está instalada
    Code:
    Sub AplicacionInstalada(NombreDelPaquete As StringAs 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.
    Code:
    Sub LeerDir(package As StringAs 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
     
  3. TheFalcon

    TheFalcon Active Member Licensed 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 :).
     
  4. TheFalcon

    TheFalcon Active Member Licensed 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

    Code:
    /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í

    Code:
    /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
     
  5. bgsoft

    bgsoft Well-Known Member Licensed 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).

    Code:
    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 and José J. Aguilar like this.
  6. TheFalcon

    TheFalcon Active Member Licensed 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
     
  7. bgsoft

    bgsoft Well-Known Member Licensed User

    Hola:

    Esa ruta:
    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:

    Code:
    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
     
  8. TheFalcon

    TheFalcon Active Member Licensed 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 .

    Code:
    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
    Code:
    "/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: Jan 21, 2019
  9. bgsoft

    bgsoft Well-Known Member Licensed User

    Hola:

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

    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.

    Vamos bien :D

    Saludos
     
    TheFalcon and José J. Aguilar like this.
  10. TheFalcon

    TheFalcon Active Member Licensed 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
     
  11. bgsoft

    bgsoft Well-Known Member Licensed User

    Hola:

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

    Saludos
     
    TheFalcon likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice