zheka1980 Опубликовано 17 июня, 2017 Поделиться Опубликовано 17 июня, 2017 Господа, пишу в Embarcadero DELPHI Вот проект, который открывает PDF по нажатию кнопки, по определенному адресу. А я хочу чтобы этот PDF поставлялся с программой. Я добавил в проект файл 222.pdf. Залил программу. Рылся в памяти телефона - нет такого файла. Что делать? OpenPDF.rar Цитата Ссылка на комментарий
0 sinuke Опубликовано 17 июня, 2017 Поделиться Опубликовано 17 июня, 2017 (изменено) Как я понимаю, вы пытаетесь открыть внешним приложением файл, который находится в "закрытой" области, которая доступна только вашему приложению или приложениям с рутом. Как вариант, для того, чтобы иметь возможность открыть этот PDF его нужно сохранить в какую-нибудь Shared-папку. Без сохранения можно попробовать бросить на форму TWebBrowser и указать в качестве ссылки "file://ссылка на pdf" (но это не точно, не проверял) Изменено 17 июня, 2017 пользователем sinuke Цитата Ссылка на комментарий
0 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 Я просто думал, что могу не только программой получить доступ, но и проводником посмотреть. К слову - интересная штука, я просканировал папку пользователькую - в мемо имена загруженных файлов выводятся, то есть они скопировались и обнаруживаются. Но вот не открывается 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 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 Цитата file://ссылка на pdf" А вы не могли бы поточнее? Вот добыл я имя файла PDFFileName :=TPath.Combine(TPath.GetDocumentsPath, '222.pdf'); Присобачиваю это к 'file://' - не пашет. Цитата Ссылка на комментарий
0 sinuke Опубликовано 17 июня, 2017 Поделиться Опубликовано 17 июня, 2017 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 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 Спасибо, я уже в принципе разобрался. Почти разобрался. ВОт такой код 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 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 С Веббраузером - не получается. Цитата Ссылка на комментарий
0 sinuke Опубликовано 17 июня, 2017 Поделиться Опубликовано 17 июня, 2017 (изменено) не (Shared)DocumentsPath, a PublicPath если заливаете файлы в assets\internal, то ищем файлы с помощью GetDocumentsPath, при этом они никому не видны если заливаем файлы в assets\, то ищем с помощью GetPublicPath и файлы видны всем мной вышеуказаный код работает Изменено 17 июня, 2017 пользователем sinuke Rusland 1 Цитата Ссылка на комментарий
0 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 Цитата не (Shared)DocumentsPath, a PublicPath Шайтанама!!! Вон че крест животворящий делаит!!! Спасибо! Цитата Ссылка на комментарий
0 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 С утра пойду в другие разделы, гундеть по поводу того, что GIF-ка анимированная не крутится))) Цитата Ссылка на комментарий
0 zheka1980 Опубликовано 17 июня, 2017 Автор Поделиться Опубликовано 17 июня, 2017 Еще проблемка - если PDF содержит русские буквы - компилируется, но не заливается. Как побороть? Цитата Ссылка на комментарий
0 Rusland Опубликовано 20 июня, 2017 Поделиться Опубликовано 20 июня, 2017 @zheka1980 есть замечательная функция FileExists, которая работает и в Android. Проверяйте ею, прежде чем открывать файл. Могут быть банально ошибки в регистре букв Цитата Ссылка на комментарий
Вопрос
zheka1980
Господа, пишу в Embarcadero DELPHI
Вот проект, который открывает PDF по нажатию кнопки, по определенному адресу.
А я хочу чтобы этот PDF поставлялся с программой.
Я добавил в проект файл 222.pdf. Залил программу. Рылся в памяти телефона - нет такого файла.
Что делать?
OpenPDF.rar
Ссылка на комментарий
11 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.