Ver Mensaje Individual
  #23  
Antiguo 23-09-2018
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 545
Reputación: 17
jhonalone Va por buen camino
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"/>
    ersistent="%persistent%" 
        android:restoreAnyVersion="%restoreAnyVersion%" 
        android: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.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)
Responder Con Cita