Я разрабатываю Android-приложение в Unity3D для использования в классах, у него есть кнопки для отображения некоторых веб-сайтов и видео, связанных с текущим уроком, но теперь я хотел бы иметь кнопку, которая открывает средство просмотра PDF по умолчанию на планшете Android. и загружает PDF-файл, который у меня есть в папке в моих ресурсах проекта.
Дело в том, что я пробовал много кода от разных людей из сообщений StackOverflow и потоков сообщества Unity, но у меня ничего не работает.
Я уже пробовал:
Мой минимальный уровень 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
Я не уверен, но ! в имени пути может вызвать проблемы? Попробуйте скорее поместить свой файл, например. в папке Application.persistentDataPath или Application.streamingAssetsPath или в папке Resources.
Возможный дубликат Открывать pdf-файлы в Unity
@0xBFE1A8 /Активы/test.pdf
@Draco18s мои вопросы относятся к компиляции Android.
Assets/ — это не место, где файлы компилируются в сборку. В частности, если на него не ссылается что-то, о чем может знать компилятор (строка, указывающая на расположение файла, не является таковой). Вам нужно использовать /Resources или набор ресурсов.
Это было частью решения :)





Хорошо, наконец я получил решение! Как вы можете прочитать, разрешения 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-Открыватель
В какой папке находится ваш PDF-файл?