Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как запаковать PDF в проект и как потом получить к нему доступ?


zheka1980

Вопрос

Господа, пишу в Embarcadero DELPHI

 

Вот проект, который открывает PDF по нажатию кнопки, по определенному адресу.

А я хочу чтобы этот PDF поставлялся с программой.

Я добавил в проект файл 222.pdf. Залил программу. Рылся в памяти телефона - нет такого файла.

 

Что делать?

OpenPDF.rar

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Как я понимаю, вы пытаетесь открыть внешним приложением файл, который находится в "закрытой" области, которая доступна только вашему приложению или приложениям с рутом. Как вариант, для того, чтобы иметь возможность открыть этот PDF его нужно сохранить в какую-нибудь Shared-папку. Без сохранения можно попробовать бросить на форму TWebBrowser и указать в качестве ссылки "file://ссылка на pdf" (но это не точно, не проверял)

Изменено пользователем sinuke
Ссылка на комментарий
  • 0

Я просто думал, что могу не только программой получить доступ, но и проводником посмотреть.

К слову - интересная штука, я просканировал папку пользователькую - в мемо имена загруженных файлов выводятся, то есть они скопировались и обнаруживаются.

Но вот не открывается PDF

 

Цитата

procedure TForm7.btnOpenPDFClick(Sender: TObject);
const
  SAMPLE_PDF_FILENAME = 'example.pdf';
var
  Uri: Jnet_Uri;
  OpenLinkIntent: JIntent;
  PDFFileName: string;
  sr:TSearchRec;
  bchars, Tws:TSysCharSet;
  Intent: JIntent;
begin
  PDFFileName :=TPath.Combine(TPath.GetDocumentsPath, SAMPLE_PDF_FILENAME);  { Внутренний доступ}
  Label1.Text:=PDFFileName;

	if (FindFirst(TPath.GetDocumentsPath+'/*.pdf', faAnyFile, sr) = 0) then
	begin
		Memo1.Lines.Add(sr.Name);

	  while (FindNext(sr) = 0) do
		 begin
			Memo1.Lines.Add(sr.Name);
		 end;
	end;
	FindClose(sr);

  ///
  ///
  ///
  ///
        Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setDataAndType(StrToJURI(PDFFileName), StringToJString('application/pdf'));
  SharedActivity.startActivity(Intent);
                                       ///

//  Uri := StrToJURI(PDFFileName);
  // Формируем намерение об открытии файла в стандартном приложении
//  OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);
  // Устанавливаем тип данных
//  OpenLinkIntent.setType(StringToJString('application/pdf'));
//  OpenLinkIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP);
  // Запускаем приложение и передаем ему наше намерение
//  try
//    SharedActivity.startActivity(OpenLinkIntent);
//  except on E: Exception do
//    ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf');
  //end;
end;

 

 

Ссылка на комментарий
  • 0
4 минуты назад, zheka1980 сказал:

А вы не могли бы поточнее? Вот добыл я имя файла

 PDFFileName :=TPath.Combine(TPath.GetDocumentsPath, '222.pdf');

Присобачиваю это к 'file://' - не пашет.

Есть несколько способов:

1) Можно сохранить ваш PDF в shared-папку. Он будет общедоступным и его можно будет открыть через интент вашим кодом из первого сообщения (только там уже будет не TPath.GetDocumentsParh, а TPath. GetPublicPath). Для этого в Deployment Manager нужное изменить Remote Path с assets\internal на assets\

 

procedure TForm7.btnOpenPDFClick(Sender: TObject);
const
  SAMPLE_PDF_FILENAME = 'example.pdf';
var
  Uri: Jnet_Uri;
  OpenLinkIntent: JIntent;
  PDFFileName: string;
begin
  PDFFileName := TPath.Combine(TPath.GetPublicPath, SAMPLE_PDF_FILENAME);  { Внутренний доступ}
  if not TFile.Exists(PDFFileName) then
    ShowMessage(PDFFileName + ' not exist!')
  else
    begin
      Uri := StrToJURI('file:' + PDFFileName);
      OpenLinkIntent := TJIntent.Create;
      OpenLinkIntent.setDataAndType(Uri, StringToJString('application/pdf'));
      OpenLinkIntent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP);
      try
        SharedActivity.startActivity(OpenLinkIntent);
      except on E: Exception do
        ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf');
      end;
    end;
end;

 

2) Способ с веббраузером TWebBrowser. Бросаете на форму TWebBrowser и передаете ему URL в виде 'file://путь к PDF'. В этом случае файл откроется вашим же приложением, PDF никто больше не увидит (если расположение оставить assets\internal). Но возможно будут проблемы с самим браузером, т.к. этот компонент иногда непредсказуем

Ссылка на комментарий
  • 0

Спасибо, я уже в принципе разобрался. Почти разобрался.

ВОт такой код

procedure TForm7.btnOpenPDFClick(Sender: TObject);
const
  SAMPLE_PDF_FILENAME = 'example.pdf';
var
  Uri: Jnet_Uri;
  OpenLinkIntent: JIntent;
  PDFFileName: string;
  sr:TSearchRec;
  bchars, Tws:TSysCharSet;
  Intent: JIntent;
begin
  PDFFileName :=TPath.Combine(TPath.GetSharedDocumentsPath, SAMPLE_PDF_FILENAME);  { Внутренний доступ}
  Label1.Text:=PDFFileName;

	if (FindFirst(TPath.GetDocumentsPath+'/*.pdf', faAnyFile, sr) = 0) then
	begin
		Memo1.Lines.Add(sr.Name);

	  while (FindNext(sr) = 0) do
		 begin
			Memo1.Lines.Add(sr.Name);
		 end;
	end;
	FindClose(sr);
       Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setDataAndType(StrToJURI('file:'+PDFFileName), StringToJString('application/pdf'));
  try
    SharedActivity.startActivity(Intent);
  except on E: Exception do
    ShowMessage('Не удалось открыть PDF. В системе нет доступных приложения для просмотра pdf');
 end;
end;

Вот такой код открывает файлы, но только если они в SharedDocumentsPath.

Если пытаюсь открывать в DocumentsPath - не получается.

 

Пытаюсь идти обратным путем - добавляю файлы в проект, запускаю Deployment, меняю assets\internal на assets - ни хрена.... При заливе проекта файлы в DocumentsPath не копируются.

 

Мне нужно, чтобы человек скачал программу, содержащуюв себе PDFки, установил ее, и мог из программы эти PDF открыть.  Возможно ли вообще в принципе сделать так, чтобы не скачивать PDF отдельно и не записыват в специаьную папку?

 

Ссылка на комментарий
  • 0

не (Shared)DocumentsPath, a PublicPath

если заливаете файлы в assets\internal, то ищем файлы с помощью GetDocumentsPath, при этом они никому не видны

если заливаем файлы в assets\, то ищем с помощью GetPublicPath и файлы видны всем

мной вышеуказаный код работает

Изменено пользователем sinuke
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...