首页 文章 精选 留言 我的

精选列表

搜索[动态节点],共10000篇文章
优秀的个人博客,低调大师

Android 动态加载 (三) PAK 详解

pak文件经常出现于游戏的安装目录中,其实pak文件是一种特殊的游戏压缩文件,用于压缩声音、图片等资料。由于pak文件专门针对游戏设计文件结构,pak文件就是将多个文件(图片、音乐、文本)打包为一个单独文件,在pak文件中保存着多个文件的数据。 pak是什么文件? 现 在大部分游戏的客户端都采用pak压缩格式,以便于游戏的开发。由于是一种压缩格式,pak文件可以用一些专业压缩软件(如WinRAR、 WinZip)打开,但由于其特殊性与一般的压缩文件格式打开方式有所不同。pak文件一般是游戏的文件,里面存了很多游戏所需的重要文件,并且是加密了 的,现在虽说有能打开pak文件的软件,但也仅限于未加密的。不过有一些专门的浏览工具可以提取其中的声音进行修改后保存为其他格式音乐。 pak文件如何打开? 那么pak文件怎么打开呢?下面小编就收集了一些支持pak文件的软件供大家使用。 特点: 1.声音,地图,3D模型,材质贴图等文件是按着保留 目录路径结构的方式压缩入PAK文件的。 2.压缩的时候可以令压缩也可以按照一定的 压缩率压缩。 使用pak这种文件格式对于游戏的开发者和玩家都有著无以伦比的方便性和可塑性(或者说自定义性)。具体如何实现的,等一下我将举例说明。使用pak包这种形式有几点好处: 1.对于程开发人员来说资源调用方便,易于管理; 2.由于结构特殊,对初学者有屏蔽作用避免被乱改,对高手却很容易修改,比较方便; 3.所有模式都是利用这个特点做的; 4.pak包被游戏的引擎视为一个目录,能利用外置pak文件的形式进行升级而无需删除原有文件。利於增加效果包,新地图,改进界面,增加model等扩展内容; 5.修改还原便利,文件之间互不影响。 如果想要打开pak结尾的文件,使用PAk浏览器 RPGViewer 3.0 下载了以后一定要看说明书(readme.txt) 可以直接查看PAK格式的内容 PAK解压: 工具里面有“解压包”的按钮,可以解压PAK 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/5253787.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android 7.0动态权限大总结

应公司项目需求,做了下Android 7.0适配。对于我们程序员,适配7.0主要就是对手机本地文件的Uri做转换处理。注意红色字体,意思也就是说对于http开头的等等,非手机存储中的文件就不用管了。Uri.parse(“package”) 这样的也不用管!!!!! 7.0的适配,就是对手机存储中的私有文件路径的保护,当系统发现你通过intent带走了一个uri,地址是本地的文件,就会限制的。其他的原理普及请搜索其他文章吧,此处略。 下面贴一下使用步骤和我的工具类。 一、需要修改当前module的AndroidManifest.xml文件,添加provider标签,映射路径。 <android:supportsRtl="true"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.myFileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/path_file"/> 文中红色部分是固定写法,官网就是这么说的,别乱试了。android:resource标签的值是main/res/xml/path_file.xml文件,即在 res下新建xml文件夹,再新建一个xml文件。 二、在res/xml下新建一个path_file.xml文件,文件名随便去,但是与上步骤一致即可。 <?xmlversion="1.0"encoding="utf-8"?> <resources> <paths> <!-- <files-path/>代表的根目录:Context.getFilesDir() <cache-path/>代表的根目录:getCacheDir() <external-path/>代表的根目录:Environment.getExternalStorageDirectory() <external-files-path/>代表的根目录:Context.getExternalFilesDir(String)Context.getExternalFilesDir(null). <external-cache-path/>代表的根目录:Context.getExternalCacheDir(). <root-path/>代表设备的根目录newFile("/"); --> <!--path=""代表根目录,也可以指定特定目录,name="camera_picture"是虚拟目录camera_picture--> <root-pathname="root"path=""/> <files-pathname="files"path=""/> <cache-pathname="cache"path=""/> <external-pathname="external"path=""/> <external-files-pathname="external_files"path=""/> <external-cache-pathname="external_cache"path=""/> </paths> </resources> 里面共有6个path标签,含义都写了,根据你的需要些对应的标签即可。比喻<external-path/>标签,里面的path=”"时,这个标签映射的就是外挂sd卡根目录了,name属性没什么用,来迷惑第三方应用的虚拟目录,来掩盖文件的真实路径。 三、工具类来了。 FileUriPermissionCompat.Java /** *@Author:duke *@DateTime:2017-06-0614:43 *@Description:android7.0uri权限适配, *(通过intent暴漏uri或file给第三方app时的)私有目录被禁止访问 *已对localpath和netpath做了适配 */ publicclassFileUriPermissionCompat{ privatestaticfinalStringTAG=FileUriPermissionCompat.class.getSimpleName(); //TODO:此处需要更改为对应值 //此处需要改成AndroidManifest.xml中申请的对应的provider的authorities值 privatestaticfinalStringAUTHORITIES="com.duke.personalkeeper.myFileProvider"; /** *是否需要适配7.0权限 * *@return */ publicstaticbooleanisNeedAdapt(){ //24以上版本 returnBuild.VERSION.SDK_INT>=Build.VERSION_CODES.N; } publicstaticUriadaptUriAndGrantPermission(Contextcontext,Intentintent,Filefile){ Uriuri=adaptUri(context,file); if(uri==null){ returnnull; } grantUriPermission(context,intent,uri); returnuri; } publicstaticUriadaptUri(Contextcontext,Filefile){ if(context==null||file==null){ returnnull; } //网络路径的特殊处理,不需要7.0适配,但必须用parse()方法 if(file.getPath().startsWith("http")){ returnUri.parse(file.getPath()); } Uriuri=null; try{ if(isNeedAdapt()){ //需要7.0特殊适配 //通过系统提供的FileProvider类创建一个content类型的Uri对象 uri=FileProvider.getUriForFile(context,AUTHORITIES,file); }else{ //不需要适配 uri=Uri.fromFile(file); } }catch(Exceptione){ Log.e(TAG,"authoritiesvalueerror,socan'tconverturi!"); e.printStackTrace(); } returnuri; } /** *对第三方应用赋予对uri读写的权限 * *@paramcontext *@paramintent *@paramsaveUri适配后的uri */ publicstaticvoidgrantUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } //1、授权(系统相册、相机、裁剪时需要)--这种写法待分析 ListresInfoList=context.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); for(ResolveInforesolveInfo:resInfoList){ StringpackageName=resolveInfo.activityInfo.packageName; if(TextUtils.isEmpty(packageName)){ continue; } context.grantUriPermission(packageName,saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } //2、授权(安装apk时需要) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } publicstaticvoidrevokeUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } try{ context.revokeUriPermission(saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); }catch(Exceptione){ e.printStackTrace(); } } } 核心代码: uri=FileProvider.getUriForFile(context,AUTHORITIES,file); file就是你想要暴露给其他应用的文件地址,比喻你要拍照,把结果保存到file文件中。 AUTHORITIES就是上面第一步中,android:authorities=”${applicationId}.myFileProvider”的实际值, ${applicationId}取得是app/build.gradle中defaultConfig标签的applicationid值。通过系统提供的FileProvider类的静态方法转换file地址为一个以content://开头的特殊的uri。如果不转换的话,直接用Uri.fromFile(file),你得到的是一个file:///xxxxx这样的uri。就这差别。 转换了uri之后,还需要授权: /** *对第三方应用赋予对uri读写的权限 * *@paramcontext *@paramintent *@paramsaveUri适配后的uri */ publicstaticvoidgrantUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } //1、授权(系统相册、相机、裁剪时需要)--这种写法待分析 List<ResolveInfo>resInfoList=context.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); for(ResolveInforesolveInfo:resInfoList){ StringpackageName=resolveInfo.activityInfo.packageName; if(TextUtils.isEmpty(packageName)){ continue; } context.grantUriPermission(packageName,saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } //2、授权(安装apk时需要) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } 里面有两部分授权方式,经过多轮测试,发现需要同时使用比较好。 第一种方式,for循环,是因为有时候你并不确定需要分享的应用的包名是哪一个,所以找到所有有可能的第三方应用,全部授权了。 后来测试发现,安装apk的时候,只有上面的授权是不行的,还得加上intent.addFlag的方式再次授权才行。 最后,需要注意的是: 1、注意7.0的版本判断。 2、切记,7.0的权限有可能需要对sd卡读写,需要6.0的读写sd卡权限。当你测试7.0权限不成功时,考虑下6.0的权限是否到位了。 其他的没的说了。就这些。 本文作者:佚名 来源:51CTO

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册