【问题标题】:How to Open a PDF in an Android-Unity3D App?如何在 Android-Unity3D 应用程序中打开 PDF?
【发布时间】:2019-04-30 15:45:33
【问题描述】:

我正在 Unity3D 中开发一个 Android 应用 用于教室,它有一些按钮可以显示与当前课程相关的一些网页和视频,但现在我想要有一个按钮来打开 Android 平板电脑中的 default-pdf-viewer 并加载我在项目资产文件夹中的 PDF 文件

问题是我一直在尝试来自 StackOverflow 帖子和 Unity 社区线程的不同人的大量代码,但对我没有任何帮助。

我已经试过了:

Unity Answers 1

Unity Answers 2

Unity Answers 3

我的最低 android API 级别设置为 22(相对于this reddit post

到目前为止,这是我的代码:

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 文件位于哪个文件夹?
  • 我不确定,但路径名中的! 可能会造成麻烦?尝试宁愿把你的文件,例如在Application.persistentDataPathApplication.streamingAssetsPathResources 文件夹中。
  • Open pdf files in Unity的可能重复
  • @0xBFE1A8 /Assets/test.pdf
  • Assets/ 不是将文件编译到构建中的位置。具体来说,除非被编译器可以知道的东西引用(指向文件位置的字符串不是一个)。您需要使用/Resources 或资产包。

标签: c# android unity3d pdf


【解决方案1】:

如果您的应用目标级别 API 24 或更高,则需要使用 FileProvide API,否则您将得到 FileUriExposedException,如 here 所述。

要从 С# 代码与 FileProvider 交互,您需要知道如何与 AndroidJavaClassAndroidJavaObject 交互以使用 Java 库(即 android.support.v4)。 您还需要知道如何通过将<provider> 属性添加到项目中的AndroidManifest.xml 以及here 列出的更多点来声明内容提供程序组件。

this帖子的回复中可以找到解决问题的办法,却偶然发现了以下烦恼:

1) 路径上不再提供 android.support.v4 库 “AndroidSDK/extras/android/support/v4/android-support-v4.jar”,因为现在它是另一个库的一部分。

2) 你可以在互联网上的一些档案中找到这个图书馆,但是 当你下载它们时,你会发现 res 文件夹在 Plugins/Android 不再受支持,您需要创建一个 .aar 二进制文件,您需要将 AndroidManifest.xml 和 android.support.v4 库。

3) 在AndroidManifest.xml中指定属性<provider>时, 您需要另外指定 <meta-data> 在其中指定 路径,在您的 .aar 存档中,provider_paths.xml 文件是 定位,否则您的应用程序将在启动时崩溃。

您可以尝试自己走这么长的路,或者下载我的资产,它已经包含通过AndroidJavaClassAndroidJavaObject 使用android.support.v4 库的所有必要代码,并且还能够当您将在项目设置中更改它时,重写 AndroidManifest.xml 和 providers_paths.xml 中的 包名称。那里还包括一个演示。

github 上的链接: https://github.com/Mihail5412/Unity-Android-Files-Opener

【讨论】:

    【解决方案2】:

    好的,我终于找到了解决方案! 如您所见,here Android 权限在 Nougat (v.7) 中已更改,这就是我无法打开 pdf 的原因,系统阻止了它。

    解决方案很简单,我只是将目标 API 级别降低到 23(Android 6.0 'Marshmallow')。

    如果有人感兴趣,这是我的代码:

    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"); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2016-04-05
      相关资源
      最近更新 更多