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 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; 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.