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)
-   -   Abrir Pdf En Api 26 (https://www.clubdelphi.com/foros/showthread.php?t=93722)

turbopascual5.0 30-01-2019 23:13:27

Abrir Pdf En Api 26
 
Hola.

Al compilar para api 26 en Rio, al abrir un pdf obtengo este error que antes no aparecía

android.os.FileUriExposedException: file:///Storage/emulated/0/Download/AppDataDetails/trabajo.pdf exposed beyond app through Intent.getData()

El código es

Código Delphi [-]
     URI := TJnet_Uri.JavaClass.parse(StringToJString('file:///' + ficheropuente));
      intent := TJIntent.Create;
      intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
      intent.setDataAndType(URI,StringToJString('application/pdf'));
      Tandroidhelper.Activity.startActivity(intent);[/font][/color]

Buscando he encontrado una solución


You'll need this unit:
https://github.com/DelphiWorlds/Kast...leProvider.pas
for this code:

uses Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers;procedure OpenPDF(const 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/pdf')); LIntent.setFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); TAndroidHelper.Activity.startActivity(LIntent);end;




Pero ahora me da error

java.lang.illegalArgumentsException Failed to find configured root that contains /file: /data/user/0/com.embarcadero.PRODUCCION/files/trabajo.pdf

El pdf lo leo de una base de datos y lo grabo así:

Código Delphi [-]
ficheropuente:=TPath.Combine(TPath.GetPublicPath, 'trabajo.pdf');
TBlobField(uniquery2documento).SaveToFile(ficheropuente);

Alguna idea?, gracias de antemano





Casimiro Notevi 30-01-2019 23:23:28

Para que el lector de pdf pueda abrir el fichero tienes que ponerlo en un directorio compartido, no vale tenerlo en el directorio de tu programa.
Y lo mismo es para cualquier otra cosa similar, como ver fotos con otro programa que no sea el tuyo, etc.

turbopascual5.0 30-01-2019 23:49:50

Cita:

Empezado por Casimiro Notevi (Mensaje 530502)
Para que el lector de pdf pueda abrir el fichero tienes que ponerlo en un directorio compartido, no vale tenerlo en el directorio de tu programa.
Y lo mismo es para cualquier otra cosa similar, como ver fotos con otro programa que no sea el tuyo, etc.

Gracias,

y cual seria un path adecuado?, es que he probado con

Código Delphi [-]
     ficheropdf:=TPath.GetDocumentsPath + PathDelim + 'trabajo.pdf';
     ficheropdf:=TPath.GetSharedDownloadsPath + PathDelim + 'trabajo.pdf';



Y sigo teniendo el error

Neftali [Germán.Estévez] 31-01-2019 08:26:41

Cita:

Empezado por turbopascual5.0 (Mensaje 530503)
y cual seria un path adecuado?, es que he probado conCódigo Delphi [-] ficheropdf:=TPath.GetDocumentsPath + PathDelim + 'trabajo.pdf'; ficheropdf:=TPath.GetSharedDownloadsPath + PathDelim + 'trabajo.pdf';


Por favor, recuerda añadir TAG's al mensaje cuando utilices código Delphi.

No se si tiene que ver con el error que te da en este último código, pero es reciomentable que utilices TPath.Combine cuando accedas al fichero,igualque lo has utilizado para grabarlo.
Revisa este llink de Javier Pareja sobre este tema, a ver si te aporta algo de información.

turbopascual5.0 31-01-2019 08:52:55

Solucionado!
 
Gracias Germán.
Accediendo como comentas funciona perfectamente, y en base a eso me he dado cuenta que tenía un error
Código Delphi [-]
OpenPDF('file:///' + ficheropuente);

y debia ser:
Código Delphi [-]
OpenPDF(ficheropuente);

Así no encontraba el path.... Al menos ahí queda el aporte, el código que encontré en stackoverflow funciona a la perfección.
Sorry por los tags

Gracias por vuestro tiempo.

xtenia22 07-07-2020 17:51:57

Consulta
 
Disculpa, podrias compartir el proyecto?. Estoy tratando de hacer lo mismo y no logro tener exito. Saludos


La franja horaria es GMT +2. Ahora son las 14:43:18.

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