我正在 Unity3D 中开发一个 Android应用,用于教室,它具有用于显示一些与当前课程有关的网络和视频的按钮,但是现在我希望有一个按钮可以在Android Tablet中打开default-pdf-viewer并加载我在项目资产的文件夹中拥有的 PDF文件。
问题是我一直在尝试来自StackOverflow帖子和Unity社区线程的不同人员的许多代码,但对我而言没有任何作用。
我已经尝试过:
我的最低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
答案 0 :(得分:1)
如果您的应用目标级别API为24或更高,则需要使用FileProvide API,否则,您将获得 FileUriExposedException ,如here所述。
要通过С#代码与FileProvider进行交互,您需要知道如何与AndroidJavaClass
和AndroidJavaObject
进行交互才能使用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文件位于 找到,否则您的应用程序将在启动时崩溃。
您可以尝试自己走很长一段路,或者下载我的资产,该资产已经具有通过AndroidJavaClass
和AndroidJavaObject
使用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");
}