如何在Android-Unity3D应用中打开PDF?

时间:2019-04-30 15:45:33

标签: c# android unity3d pdf

我正在 Unity3D 中开发一个 Android应用,用于教室,它具有用于显示一些与当前课程有关的网络和视频的按钮,但是现在我希望有一个按钮可以在Android Tablet中打开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

2 个答案:

答案 0 :(得分:1)

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

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

this帖子的答案中,您可以找到问题的解决方案,但偶然发现以下麻烦:

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

2)您可以在Internet上的一些档案中找到此库,但是 下载它们时,您会发现其中的 res 文件夹 插件/ Android 不再受支持,您需要创建一个.aar二进制文件,您需要在其中放入AndroidManifest.xml和 android.support.v4库。

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

您可以尝试自己走很长一段路,或者下载我的资产,该资产已经具有通过AndroidJavaClassAndroidJavaObject使用android.support.v4库的所有必要代码,并且当您在项目设置中进行更改时,还可以在AndroidManifest.xml和provider_paths.xml中重写 包名称 。那里也有一个演示。

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

答案 1 :(得分:0)

好,终于我找到了解决方案! 您可以阅读here在Nougat(v.7)中更改的Android权限,这就是为什么我无法打开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"); }