Как открыть PDF в приложении Android-Unity3D?

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

Дело в том, что я пробовал много кода от разных людей из сообщений StackOverflow и потоков сообщества Unity, но у меня ничего не работает.

Я уже пробовал:

Юнити Ответы 1

Юнити Ответы 2

Юнити Ответы 3

Мой минимальный уровень Android API установлен 22 (по отношению к этот пост на реддите)

Вот мой код:

IEnumerator openPDF() {
     var path = "jar:file://" + Application.dataPath + "!/assets/test.pdf";
     var savePath = Application.persistentDataPath;

     WWW www = new WWW(path);
     yield return www;
     var error = www.error;

     byte[] bytes = www.bytes;
     var result = "File size : "+bytes.Length;

     try{
         System.IO.File.WriteAllBytes(savePath+"/test.pdf", bytes);
         error = "No Errors so far";
     }catch(Exception ex){
         error = ex.Message;
     }

     Application.OpenURL(savePath+"/test.pdf");
}

Когда я печатаю строку www.error, я получаю "404 not Found".

Вот что я получаю, когда делаю напечатать переменную пути: jar:file:///data/[MY APP PACKAGE NAME]/base.apk!/assets/test.pdf

В какой папке находится ваш PDF-файл?

Hamid Yusifli 30.04.2019 17:58

Я не уверен, но ! в имени пути может вызвать проблемы? Попробуйте скорее поместить свой файл, например. в папке Application.persistentDataPath или Application.streamingAssetsPath или в папке Resources.

derHugo 30.04.2019 18:24

Возможный дубликат Открывать pdf-файлы в Unity

Draco18s no longer trusts SE 30.04.2019 18:52

@0xBFE1A8 /Активы/test.pdf

SoleR 30.04.2019 19:44

@Draco18s мои вопросы относятся к компиляции Android.

SoleR 30.04.2019 19:44
Assets/ — это не место, где файлы компилируются в сборку. В частности, если на него не ссылается что-то, о чем может знать компилятор (строка, указывающая на расположение файла, не является таковой). Вам нужно использовать /Resources или набор ресурсов.
Draco18s no longer trusts SE 30.04.2019 21:34

Это было частью решения :)

SoleR 02.05.2019 12:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
4 186
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хорошо, наконец я получил решение! Как вы можете прочитать, разрешения Android здесь изменились в Nougat (v.7), поэтому я не смог открыть pdf, система блокировала его.

Решение был простым, я просто понизил целевой уровень API до 23 (Android 6.0 «Зефир»).

Вот мой код, если кому интересно:

void openPDF(){ string namePDF = "test"; TextAsset pdfTem = Resources.Load("PDFs/"+namePDF, typeof(TextAsset)) as TextAsset; System.IO.File.WriteAllBytes(Application.persistentDataPath + "/"+namePDF+".pdf", pdfTem.bytes); Application.OpenURL(Application.persistentDataPath+"/"+namePDF+".pdf"); }

Если API целевого уровня вашего приложения 24 или выше, вам необходимо использовать API ФайлПредоставить, иначе вы получите FileUriExposedException, как описано здесь.

Для взаимодействия с FileProvider из кода С# необходимо уметь взаимодействовать с AndroidJavaClass и AndroidJavaObject для работы с библиотеками Java (а именно android.support.v4). Также вам нужно знать, как объявить компонент поставщика контента, добавив атрибут <provider> в ваш AndroidManifest.xml в вашем проекте и еще несколько пунктов, перечисленных здесь.

В ответе поста это можно найти решение проблемы, но наткнуться на следующие неприятности:

1) The android.support.v4 library is no longer available on the path "AndroidSDK/extras/android/support/v4/android-support-v4.jar", since now it is part of another library.

2) You can find this library in some archives on the Internet, but when you download them you will find that the res folder in Plugins/Android is no longer supported and you need to create a .aar binary file in which you need to put AndroidManifest.xml and android.support.v4 library.

3) When specifying the attribute <provider> in AndroidManifest.xml, you need to additionally specify <meta-data> in which to specify the path, where in your .aar archive the provider_paths.xml file is located, otherwise your application will crash at startup.

Вы можете попробовать пройти этот длинный путь самостоятельно, либо скачать мой ассет, в котором уже есть весь необходимый код для работы с библиотекой android.support.v4 через AndroidJavaClass и AndroidJavaObject, а также который умеет переписывать имя пакета в AndroidManifest.xml и provider_paths.xml, когда вы измените его в настройках проекта. Демо также включено туда.

Ссылка на гитхабе: https://github.com/Mihail5412/Unity-Android-Files-Открыватель

Другие вопросы по теме