你获取的uri没有问题。但assets目录下的不能使用这种方法读取。你得把它先复制到sdcard中,然后从sdcard中传递这个至于原因嘛:assets目录里面的资源文件还在应用程序的apk文件中,一个压缩文件中。所以不能这样读
inputReader = new InputStreamReader(AppcontextgetAssets()open(fileName));
或者
InputStream inputStream = getClass()getResourceAsStream("/assets/nametxt");
读取文件的时候填写文件名别忘了后缀
我们需要在template,script,style下引用,如下。
比如
这里能用 @assets 是因为在 vueconfigjs 里面设置了如下参数。
本地开发的时候,因为域名是 >
因为系统在编译的时候不会编译assets下的资源文件,所以我们不能通过RXXXID的方式访问它们。那我么能不能通过该资源的绝对路径去访问它们呢?因为apk安装之后会放在/data/app/apk目录下,以apk形式存在,asset/res和被绑定在apk里,并不会解压到/data/data/YourApp目录下去,所以我们无法直接获取到assets的绝对路径,因为它们根本就没有。
方法倒是有很多种,不过直接利用资源管理器无疑是最快捷的。
我说的并不是解决方案的资源体系,而是SystemResourceResourceReader和Writer,虽然不像ResourceManager一样有丰富的支持,但是仅靠枚举接口也足够你使用了。
我抽了点空直接给你写了个辅助静态类(ResPacker),注释齐全已调试,拿走用吧^_^using System;using SystemCollections;using SystemCollectionsGeneric;using SystemResources;using SystemIO;using SystemDrawing;namespace ConsoleApplication3{ class Program { //写在前面: //1这个辅助类可以帮你把任意多的任意对象都塞到一个文件里去,也能一次性的提出来 //2赶时间,一句trycatch都没写,自己补上 //3不建议将不同类型的对象打包到一个文件里。用Image就都Image,用string就都string,免得取出来后还要判断类型 //4增加和删除我没有写,原因是打包的资源文件本质是连续的字节流,从中间删一个文件太麻烦 //5增加 *** 作可以使用非覆盖模式的打包方法强制追加(后面有说明) //6删除 *** 作建议读取所有的资源,删掉不要的然后一次性覆盖写入 //7再次提醒,NET是决不允许资源名重名或者是数字首字资源名的。数字首字问题我已处理,重名问题自己看着办,最好穿进去前就丢到字典当主键 //8我未做文件占用检测,所以请避免一边打包一边解包。 //9此为静态类,给客户用的增删改小工具程序请把此类复制走 //999感谢您的围观!代码随便用!有麻烦还找我! static void Main(string[] args) { //打包 Dictionary<string, object> dicToPack = new Dictionary<string, object>(); dicToPackAdd("key1", ImageFromFile(@"c:\Users\Mako\Pictures\1jpg")); dicToPackAdd("key2", "hello world"); ResPackerPack(dicToPack); //解包 Dictionary<string,object> dicRcv= ResPackerGetAllResources(); ConsoleWriteLine((string)dicRcv["key2"]); ConsoleWriteLine(dicRcv["key1"]GetType()FullName); ConsoleReadKey(); } } public static class ResPacker { /// <summary> /// 批量打包任意对象到资源文件 /// </summary> /// <param name="objCollection">被打包对象的列表。键值对中键为其在资源文件中的唯一标示名。</param> /// <param name="targetFilePath">目标资源文件。默认参数为当前目录下的"MyRespck"文件。</param> /// <param name="overwrite">是否覆盖已存在的目标文件。默认=True</param> public static void Pack(IDictionary<string,object> objCollection, string targetFilePath = "MyRespck", bool overwrite = true) { if (overwrite) FileDelete(targetFilePath); using (ResourceWriter rw = new ResourceWriter(targetFilePath)) { foreach (KeyValuePair<string, object> pair in objCollection) //为了防传进来的资源名有数字开头,资源名都加了前缀_ rwAddResource("_" + pairKey, pairValue); rwGenerate(); rwClose(); } } /// <summary> /// 解包资源文件,返回所有资源及其资源名 /// </summary> /// <param name="targetFilePath">要解包的资源文件。默认为当前目录下的"MyRespck"</param> /// <returns>资源字典,键值为资源唯一标示名。若无资源返回空集合。</returns> public static Dictionary<string,object> GetAllResources(string targetFilePath = "MyRespck") { Dictionary<string, object> rtn = new Dictionary<string, object>(); using (ResourceReader rr = new ResourceReader(targetFilePath)) { foreach (DictionaryEntry entry in rr) rtnAdd(((string)entryKey)Substring(1), entryValue); } return rtn; } /// <summary> /// 根据资源名在指定的资源文件中检索资源 /// </summary> /// <param name="resName">资源名</param> /// <param name="targetFilePath">要在其中检索的资源文件名,默认为"MyRespck"</param> /// <returns>资源名对应的资源</returns> public static object SearchResource(string resName,string targetFilePath="MyRespck") { object rtn=null; using (ResourceReader rr = new ResourceReader(targetFilePath)) { foreach(DictionaryEntry entry in rr) if ((string)entryKey == '_' + resName) { rtn = entryValue; break; } } return rtn; } }}
vs加载的路径怎么写
要加载路径,需要使用Unity的AssetDatabase类的LoadAssetAtPath方法。该方法的语法如下:
AssetDatabaseLoadAssetAtPath(string path, Type type);
其中,path参数是指的路径,type参数指定加载的资源类型,如Texture2D、Sprite等。例如,要加载一张png格式的,需要指定路径和类型:
string path =尠Assets/MyTextures/MyTexturepng
Texture2D texture = AssetDatabaseLoadAssetAtPath(path, typeof(Texture2D)) as Texture2D;
这里的path指向一个png格式的,加载后返回一个Texture2D对象,该对象就是加载的。在指定path参数时,可以使用Unity相对路径,也可以使用绝对路径,但建议使用相对路径,这样可以避免在不同的电脑上加载不到的问题。
以上就是关于如何获得assets目录下文件的uri全部的内容,包括:如何获得assets目录下文件的uri、android studio引用assets文件夹里的东西路径怎么写、vue的图片路径引用问题解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)