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)
-   -   Problemas con SDK y NDK para pasar a API 26 (https://www.clubdelphi.com/foros/showthread.php?t=93370)

jhonalone 07-09-2018 14:07:00

Muchas gracias por tus explicaciones, Turbo... (por abreviar)

He seguido tus instrucciones y he creado una versión nueva del SDK (Api 28) Compilo con targetSdkVersion 28 y 26 y me da el mismo problema con los permisos en el SDK.

He bajado el archivo KatriFree de Dave Notave que dice Johnny y estoy buscando allí alguna solución que me valga. Ya que te estás interesando por ayudarme, te haré llegar el resultado si es positivo. A tí y a quien pueda interesar en el foro.

Un saludo cordial.

jhonalone 16-09-2018 00:18:31

Hola a todos y a Turbo...

No he abandonado (todavía) el asunto tengo algunas perspectivas esperanzadoras en DX Tokyo. Pronto tendréis noticias mías. Estoy usando KastriFree, como ya os comenté.

Saludos.

jhonalone 23-09-2018 20:12:49

Hola a todos.

Como dije he estado tratando de adaptar el código de KastriFree de Dave.

Creo que he conseguido una adaptación ("razonable") del control de los permisos de Android en la versión 10.2.3 de DX Tokyo. Esta versión la he bajado de prueba desde Embarcadero. Yo estoy usando la versión Seattle. Esperaré a que Embarcadero saque la versión 10.3 para actualizarme (Si viene actualizado a las nuevas exigencias de Google - Android)

Sé que turbopascual5.0 estaba interesado.

A ver soy capaz de contarlo sin que se me olvide nada y que se entienda bien.

Paso 1.- Te bajas y descomprimes el archivo KastriFree-master.zip desde AQUI.

Paso 2.- Para no andar cambiando directorios, he copiado en el directorio donde tengo los archivos de la aplicación, los siguientes archivos desde la carpeta C:\KastriFree\KastriFree-master\Core:

(La mayoría de estas no son necesarias para Android, pero ahí están por si quieres experimentar otros SO's)

DW.OSDevice.iOS.pas
DW.OSDevice.Linux.pas
DW.OSDevice.Mac.pas
DW.OSDevice.pas
DW.OSDevice.Win.pas
DW.OSLog.Linux.pas
DW.OSLog.Mac.pas
DW.OSLog.pas
DW.OSLog.Win.pas


(Estas creo que son necesarias casi todas o todas, no me he parado mucho a verlo)

DW.Androidapi.JNI.Log.pas
DW.GlobalDefines.inc
DW.OSDevice.Android.pas
DW.OSLog.Android.pas
DW.PermissionsRequester.Android.pas
DW.PermissionsRequester.Android_ORIGINAL.pas
DW.PermissionsRequester.Default.pas
DW.PermissionsRequester.pas
DW.PermissionsTypes.pas

(Desde C:\KastriFree\KastriFree-master\Demos\AndroidAPI26)

provider_paths.xml

(Desde C:\KastriFree\KastriFree-master\ThirdParty\Android )

support-compat-26.1.0.jar
support-core-utils-26.1.0.jar

Paso 3.- Añadir a la cláusula Uses del formulario principal.

DW.PermissionsRequester, DW.PermissionsTypes,

Paso 4.- En la clase principal del formulario principal añadimos


Código Delphi [-]
.........................................................................

  private
    FRequester: TPermissionsRequester;
    procedure PermissionsResultHandler(Sender: TObject; const ARequestCode: Integer; const AResults: TPermissionResults);

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

const   // Pueden añadirse las que se necesiten
  Read_SD = 'android.permission.READ_EXTERNAL_STORAGE';
  Write_SD = 'android.permission.WRITE_EXTERNAL_STORAGE';
  Calendario =  'android.permission.READ_CALENDAR';
  Internet = 'android.permission.INTERNET';
  BlueTooth = 'android.permission.BLUETOOTH';
  BlueAdmin ='android.permission.BLUETOOTH_ADMIN';

  Permis_Code = 1;

..........................................................................


Y en la cláusula implementation


Código Delphi [-]

.................................................

implementation

{$R *.fmx}

var
  Mostrar_Permisos : Boolean = True;

.............................. ................

constructor TIni.Create(AOwner: TComponent);
begin
  inherited;
  FRequester := TPermissionsRequester.Create;
  FRequester.RequestPermissions([Read_SD, Write_SD, Calendario, Internet, BlueTooth, BlueAdmin], Permis_Code);
  FRequester.OnPermissionsResult := PermissionsResultHandler;
end;

destructor TIni.Destroy;
begin
  FRequester.Free;
  inherited;
end;

procedure permitido;
begin
  Ini.ComprobarExport(nil);
end;

procedure rechazado;
begin
  ShowMessage('Debe conceder todos los permisos antes usar esta aplicación.'+#13+
                'El programa se CERRARÁ ahora. Si concedió los permisos, funcionará correctamente al ejecutarlo de nuevo.');
end;

procedure TIni.PermissionsResultHandler(Sender: TObject; const ARequestCode: Integer; const AResults: TPermissionResults);
begin
  case ARequestCode of
    Permis_Code:
    begin
      if AResults.AreAllGranted
      then  permitido
      else  rechazado;
    end;
  end; // case
end;

procedure TIni.FormShow(Sender: TObject);
begin
    if Mostrar_Permisos
    then begin
           FRequester.RequestPermissions([Read_SD, Write_SD, Calendario, Internet, BlueTooth, BlueAdmin], Permis_Code);
           Mostrar_Permisos := False;
         end;
end;


Seguimos las recomendaciones de Dave

Passo 5.- En la columna de la derecha del IDE que pone Project Manager inabilitamos la libreria de Anddroid llamada android-support-v4.dex.jar
y añadimos las librerías que hemos copiado en el punto 2 llamadas
support-compat-26.1.0.jar
support-core-utils-26.1.0.jar


Paso 6.- Añadimos a la lista de Deploy
del Proyecto el archivo provider_paths.xml que hemos copiado en el paso 2

Paso 7.- RECUERDA QUE PARA GENERAR EL ARCHIVO AndroidManifest.template.xml TIENES QUE HABER COMPILADO AL MENOS UNA VEZ TU PROGRAMA

Paso 8.- Cambiamos en el el AndroidManifest.template.xml, sólo android:targetSdkVersion="26"

Paso 9.- Añadimos en el manifiesto el provider siguiente en el sitio que está.

Código:

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.Embarcadero.nombre-de-tu-programa.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
        </provider>


Código Delphi [-]
................................................................................
    
    <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="26" />
<%uses-permission%>
    <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
    label="%label%" 
        android:debuggable="%debuggable%" 
        android:largeHeap="%largeHeap%"
        android:icon="%icon%"
        android:theme="%theme%"
        android:hardwareAccelerated="%hardwareAccelerated%">
       AQUI VA EL PROVIDER QUE COPIAMOS MAS ARRIBA (no olvides PONER EL NOMBRE DE TU PROGRAMA)
<%application-meta-data%>
    <%services%>
....................................................................................


Paso 10.- Como la barra de estado se descompone, debes seguir las instrucciones de Dave (Te las copio)

"Taking care of the status bar
In the previous article, it had slipped past me that when changing the API target, the status bar was no longer visible!

In this demo, the workaround was to change the Fill property of the form, setting the Color to Null, and the Kind to Solid. In addition, a Rectangle is added to the form, the Align property set to Contents, and the Color property of Fill set to Whitesmoke. Now the status bar is visible again, however remember that this is just a workaround; hopefully an official solution will present itself in the next update".

Creo que no se me olvida nada.

Un saludo.

DamianG 30-10-2018 21:17:45

Api 19 minSdkVersion y Api 26 targetSdkVersion
 
Hola, con la version 10.3 Beta pude compilar la aplicación con los nuevos requerimientos, lo único que me genera como mínima version de API la 19, perdiendo así la posibilidad de que funcione en varios dispositivos.
¿Alguien sabe con cambiar esa version mínima?
Traté modificando manualmente AndroidManifest.template.xml pero al subirla a la google play me da un error de que el apk no es firmado de forma válida.. si dejo por defecto la versión 19, si funciona.
Saludos y gracias.

noshy 31-10-2018 17:25:30

Hola delphiteros, como están?, he probado la solución de jhonalone, pero me genera error en el provider:


Código:

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.Embarcadero.nombre-de-tu-programa.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
 ERROR AQUI -> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> 
        </provider>


El error es el siguiente:

Código Delphi [-]
[PAClient Error] Error: E2312 Z:\03-App Transmitaxi Movil\Android\Release\TransmitaxiMovil\AndroidManifest.xml:42: error: Error: No resource found that matches the given name (at 'resource' with value '@xml/provider_paths').

el archivo provider_paths.xml esta en el deployment, lo único es que puse como carpeta destino .\assets\internal\ ya que no especifica donde apuntarlo.

A alguien le funcionó??

Saludos

noshy 31-10-2018 17:47:33

SOLUCION al error anterior:

En el deployment, "remote path" debe ir a "res\xml\".

Pero, aunque no me da mas ese error, la compilación se realiza perfecto, instala perfecto, pero al iniciarla me indica "La aplicación ha dejado de funcionar".

Siendo que con el targetSDKVersion = "14" funciona todo perfecto.

Estas actualizaciones de San Goole me están volviendo crazy :confused:

noshy 01-11-2018 13:46:44

San Google*

jhonalone 18-04-2019 17:40:31

Hola a todos.

Hago algunas precisiones por si interesan a alguien. Teniendo en cuenta que debe haber mucha gente que todavía usa la versión Tokyo.

1.- A mí me funciona perfectamente en Delphi 10.2.3

2.- Tiene razón noshy: en el deployment, "remote path" debe ir a "res\xml\". Se me olvidó puntualizarlo.

3.- Es innecesario decir que TODOS los permisos habilitados en "Uses Permissions" son los que hay que autorizar y adaptar a tus necesidades. (Ver el paso 4 del tutorial)

4.- Los procedures "Permitido" y "Rechazado" debes adaptarlos a tus necesidades. Pero según mi experiencia, "AResults.AreAllGranted" casi siempre devuelve false (aunque se autoricen los permisos), de ahí el mensaje y la necesidad de abortar el programa en este punto. Cuando se vuelve a reiniciar el programa funciona correcto si se autorizaron los permisos.

5.- También he comprobado que la versión mínima debe ser la 19 (KitKat) Por tanto habrá que modificarla en el "AndroidManifest.template.xml"

6.- En el evento OnShow no debemos poner más que lo que se indica en paso 4:
Código Delphi [-]
procedure TIni.FormShow(Sender: TObject);
begin
    if Mostrar_Permisos
    then begin
           FRequester.RequestPermissions([Read_SD, Write_SD, Calendario, Internet, BlueTooth, BlueAdmin], Permis_Code);
           Mostrar_Permisos := False;
         end;

7.- Las rutinas propias de arranque de tu programa las debes poner en el procedure "Permitido" de este modo:
Código Delphi [-]
procedure Permitido;
begin
  Ini.MiRutinaDeArranque(nil);
end;

8.- Compilo los programas con NDK64bits\android-ndk-r16b y con \build-tools\28.0.2\aapt.exe y con android/jdk1.8.0_144\bin

9.- Aunque parezca complicado, si sigues los pasos del tutorial, no lo es tanto.

Si se me ocurre algo más ya lo publico.

Saludos a todos.


La franja horaria es GMT +2. Ahora son las 01:22:26.

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