Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Auto-actualizar apk (https://www.clubdelphi.com/foros/showthread.php?t=96217)

er_lolo 03-05-2023 16:50:34

Auto-actualizar apk
 
Hola buenas tardes,

Estoy desarrollando una pequeña APK y me gustaría actualizar desde ella misma, para ello he conseguido descargar el APK, pero no consigo ejecutarlo.
He encontrado probado este código:

Código:

procedure TMainForm.EjecutaAPK(sRuta : String);
var
  Intent: JIntent;
  F: Jfile;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);

  Intent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);

  Intent.setDataAndType(TAndroidHelper.JFileToJURI(TJFile.JavaClass.init(StringToJString(sRuta))), StringToJString('application/vnd.android.package-archive'));

  TAndroidHelper.Activity.startActivity(Intent);

end;

Perdón por no citar el autor, pero no vi de quien era...

El caso es que no consigo que funcione, alguna forma mas sencilla de ejecutar un APK?.

Un saludo y gracias.

Casimiro Notevi 03-05-2023 18:43:47

No es tan simple, además tendrás que dar permiso REQUEST_INSTALL_PACKAGES, que recuerde, y MANAGE_UNKNOWN_APP_SOURCES.

er_lolo 04-05-2023 09:57:20

Si, lo de dar permisos de aplicaciones desconocidas los esperaba, pero de momento no he conseguido mucho. Seguiré investigando....

Casimiro Notevi 04-05-2023 12:21:25

No es Delphi, pero a ver si esto te sirve de referencia:
Código:

Private Sub SendInstallIntent
    Dim ApkName As String = kcTmpApk ''' "tmp.apk"
    Dim i As Intent
    If phone.SdkVersion >= 24 Then                                                    'Nougat 7.0
        i.Initialize("android.intent.action.INSTALL_PACKAGE", GetFileUri(ApkName))
        i.Flags = Bit.Or(i.Flags, 1) 'FLAG_GRANT_READ_URI_PERMISSION
    Else
        i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(SharedFolder, ApkName))
        i.SetType("application/vnd.android.package-archive")
    End If
    StartActivity(i)
End Sub

Private Sub GetFileUri (FileName As String) As Object
    If UseFileProvider = False Then
        Dim uri As JavaObject
        Return uri.InitializeStatic("android.net.Uri").RunMethod("parse", Array("file://" & File.Combine(SharedFolder, FileName)))
    Else
        Dim f As JavaObject
        f.InitializeNewInstance("java.io.File", Array(SharedFolder, FileName))
        Dim fp As JavaObject
        Dim context As JavaObject
        context.InitializeContext
        fp.InitializeStatic("android.support.v4.content.FileProvider")
        Return fp.RunMethod("getUriForFile", Array(context, Application.PackageName & ".provider", f))
    End If
End Sub


er_lolo 04-05-2023 18:55:06

Gracias, voy a estudiarlo!

er_lolo 21-06-2023 18:20:45

Seguimos intentándolo sin mucho éxito...

He intentando varios códigos, pero no consigo dar con la tecla, lo último que he probado es este código:

Código:

procedure TMainForm.OpenAPK(AFileName: string);
var
        LIntent: JIntent;
        LAuthority: JString;
        LUri: Jnet_Uri;
begin
        LAuthority := StringToJString(JStringToString(TAndroidHelper.Context.getApplicationContext.getPackageName)+'.fileprovider');
        LUri := TJFileProvider.JavaClass.getUriForFile(TAndroidHelper.Context, LAuthority, TJFile.JavaClass.init(StringToJString(AFileName)));
        LIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
        LIntent.setDataAndType(LUri, StringToJString('application/vnd.android.package-archive'));
        LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
        TAndroidHelper.Activity.startActivity(LIntent);
end;

He añadido la siguiente unit: "github.com/DelphiWorlds/KastriFree/blob/master/API/DW.Androidapi.JNI.FileProvider.pas"

Ahora el error que obtengo es: "Java type JFileProvider could not be found", y no se por donde seguir :confused:

Casimiro Notevi 21-06-2023 19:20:29

En teoría algo más o menos así:
Código Delphi [-]
procedure RestartApplication;
var
  Intent: JIntent;
begin
  Intent := TAndroidHelper.Context.getPackageManager.getLaunchIntentForPackage(TAndroidHelper.Context.getPackage  Name);
  Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP);
  TAndroidHelper.Activity.startActivity(Intent);
end;

No sé por qué sale "Contex.getPackageName" separado el "Name" del "getPackage" :D

er_lolo 21-06-2023 19:30:55

Gracias por la respuesta,

el Apk lo descargo desde un servidor FTP.
La idea era intentar "Ejecutarlo", como ShellExecute en Windows, para que el usuario pudiera seguir con la instalación.

Pd. Ya no me sale el error "Java type JFileProvider could not be found", era una ruta que tenia mal configurada, sin embargo, ahora simplemente no hace nada.

Casimiro Notevi 21-06-2023 19:42:48

Ya digo, cuando empecé con Android todavía Delphi no compilaba para Android, y utilizo otra cosa.
Pero más o menos es algo así:
Cita:

i : Intent
i.Initialize("android.intent.action.INSTALL_PACKAGE", GetFileUri(" nombre de tu apk ")) ' ejemplo: temp.apk
i.Flags = Bit.Or(i.Flags, 1)
StartActivity(i)

dani36652 04-08-2023 01:47:14

Tengo en este repositorio de GitHub un ejemplo para lo que buscas:
https://github.com/dani36652/Delphi-...o-Actualizable

Casimiro Notevi 04-08-2023 10:56:40

^\||/^\||/^\||/

er_lolo 14-08-2023 08:54:12

Mil gracias, ahora lo reviso!.

er_lolo 14-08-2023 18:10:38

Cita:

Empezado por dani36652 (Mensaje 552252)
Tengo en este repositorio de GitHub un ejemplo para lo que buscas:
https://github.com/dani36652/Delphi-...o-Actualizable


Funciono perfectamente, Gracias a todos por la ayuda!.

dani36652 14-08-2023 22:34:41

Cita:

Empezado por er_lolo (Mensaje 552327)
Funciono perfectamente, Gracias a todos por la ayuda!.

Un gusto audar a la comunidad Delphi

Parveen 11-04-2024 08:20:30

Cita:

Empezado por er_lolo (Mensaje 552327)
Funciono perfectamente, Gracias a todos por la ayuda!.

Hello,
Can you give a summary of what you did?


La franja horaria es GMT +2. Ahora son las 07:19:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi