前言

  Google Play应用商店在上传限制100MB大小,超过该大小的应用必须将超过部分以扩展文件的形式进行上传处理。 总共可上传2个扩展文件,每个最大文件可为2GB,同时obb文件格式可自选。

官网地址:http://developer.android.com/google/play/expansion-files.html

准备

  1、在sdk Manager中下载对应的支持库,play_licensing及play_apk_expansion如下:

    

  2、生成需要的obb文件,并在上传apk包的同时选择上传扩展文件。

    obb文件生成可参考jobb工具生成(官网推荐),http://developer.android.com/tools/help/jobb.html

    也可以直接用参考stackoverflow上Sanket Kachhela的回答(个人推荐):http://stackoverflow.com/questions/14495483/read-content-from-apk-expansion-file-from-obb-file#answer-18953778,直接利用zip压缩工具选择存储模式。

  3、如果上述采用zip压缩的话,这里就还需要unzip准备,利用zipHelper直接解压下载包并正常使用。

    参考stackoverflow上Bhavesh Hirpara的回答:http://stackoverflow.com/questions/14495483/read-content-from-apk-expansion-file-from-obb-file#answer-15150977

  

链接库配置

  1、在eclipse打开需要的库工程,如下:

    

  2、如果downloader_library出现错误 AESObfuscator cannot be resolved 则说明Eclipse没有选择自动编辑,勾选下project->build automatically即可。

  3、添加游戏项目,并添加对应的依赖项目如下图:

    

项目配置

  1、添加对应的权限。

<manifest ...>
<!-- Required to access Google Play Licensing -->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" /> <!-- Required to download files from Google Play -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- Required to keep CPU alive while downloading files
(NOT to keep screen awake) -->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Required to poll the state of the network connection
and respond to changes -->
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Required to check whether Wi-Fi is enabled -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- Required to read and write the expansion files on shared storage -->
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>

  2、从~sdk\play_apk_expansion\downloader_sample项目复制src\com\example\expansion\downloader下的sample文件到游戏目录下,并对应修改包名的引用等。

    a、将onCreate下的判断obb文件存在的注释处理添加如下:

                // otherwise, download not needed so we fall through to
// starting the movie
validateXAPKZipFiles();

    b、修改  validateXAPKZipFiles 方法,去除验证,直接添加解压方法到对应的游戏下载目录。

    // 解压到游戏下载目录
private void upzipApkExFile(){
try { ZipResourceFile expansionFile = APKExpansionSupport
.getAPKExpansionZipFile(this, VERSION_CODE, 0); ZipEntryRO[] zip = expansionFile.getAllEntries();
Log.i("upzipApkExFile", "mZipFileName : " + zip[0].mZipFileName);
String path = getApplicationContext().getFilesDir().getAbsolutePath();
File file = new File(path + "");
ZipHelper.unzip(zip[0].mZipFileName, file); if (file.exists()) {
Log.e("", "unzipped : " + file.getAbsolutePath());
} } catch (Exception e) {
e.printStackTrace();
} }
/**
* Go through each of the Expansion APK files and open each as a zip file.
* Calculate the CRC for each file and return false if any fail to match.
*
* @return true if XAPKZipFile is successful
*/
void validateXAPKZipFiles() {
upzipApkExFile();
Intent myIntent = new Intent(this, AppActivity.class); //跳转到游戏Activity
startActivity(myIntent);
this.finish();
}

    c、修改SampleDownloaderService文件下的BASE64_PUBLIC_KEY。将其改成对应的Google Play上申请的应用的Key。

 3、添加对应下载接受服务监听。

<application ...>
<service android:name="com.test123.expansion.downloader.SampleDownloaderService" />
<receiver android:name="com.test123.expansion.downloader.SampleAlarmReceiver" />
...
</application>

  4、主游戏AppActivity处理。在启动的Activity中进行判断,如果已经下载并解压了文件则进入游戏,否则跳转到下载的Activity。

    protected void onCreate(final Bundle savedInstanceState){
super.onCreate(savedInstanceState);
String path = getApplicationContext().getFilesDir().getAbsolutePath();
File boolfile = new File(path + "/downloaded");
if(!boolfile.exists())
{
Intent myIntent = new Intent(this, SampleDownloaderActivity.class);
startActivity(myIntent);
this.finish();
return;
} Log.i("upzipApkExFile", "already unziped!!");
  }

  

Cocos2dx处理

  为了让下载的扩展文件直接应用到游戏中,我们要稍微修改下cocos2dx引擎的读取文件处理。

首先,找到引擎目录下cocos2d\cocos\platform\CCFileUtils.cpp文件。

其次,对方法进行如下修改,使其先在getWritablePath目录下需找文件。

std::string FileUtils::fullPathForFilename(const std::string &filename) const
{
if (filename.empty())
{
return "";
} if (isAbsolutePath(filename))
{
return filename;
} // Already Cached ?
auto cacheIter = _fullPathCache.find(filename);
if(cacheIter != _fullPathCache.end())
{
return cacheIter->second;
} // Get the new file name.
const std::string newFilename( getNewFilename(filename) ); std::string fullpathWritablePath = getWritablePath() + newFilename;
if (isFileExistInternal(fullpathWritablePath))
{
if (fullpathWritablePath.length() > )
{
// Using the filename passed in as key.
//_fullPathCache.insert(std::make_pair(filename, fullpathWritablePath));
_fullPathCache[filename] = fullpathWritablePath;
return fullpathWritablePath;
}
} std::string fullpath;
for (const auto& searchIt : _searchPathArray)
{
for (const auto& resolutionIt : _searchResolutionsOrderArray)
{
fullpath = this->getPathForFilename(newFilename, resolutionIt, searchIt); if (fullpath.length() > )
{
// Using the filename passed in as key.
_fullPathCache.insert(std::make_pair(filename, fullpath));
return fullpath;
} }
} if(isPopupNotify()){
CCLOG("cocos2d: fullPathForFilename: No file found at %s. Possible missing file.", filename.c_str());
} // The file wasn't found, return empty string.
return "";
}

而这里getWritablePath获取的目录正是我们之前解压obb文件的目录getApplicationContext().getFilesDir().getAbsolutePath()。

因此,到这里就可以在游戏中跟使用在assert中文件一样使用obb解压出来的文件了。

GooglePlay - 文件上传限制的扩展的更多相关文章

  1. PHP图片文件上传类型限制扩展名限制大小限制与自动检测目录创建。

    程序测试网址:http://blog.z88j.com/fileuploadexample/index.html 代码分为两部分: 一部分form表单: <!doctype html> & ...

  2. laravel 文件上传

    laravel 文件上传 先开扩展 表单中能够选择图片 数据处理C层, 接图片并保存 保存图片: 设置目录 store()的第一个参数说明: 存放图片的子目录. 如何获取文件的类型 大小: $uplo ...

  3. php文件上传与下载(附封装好的函数文件)

    单文件上传前端页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. Android OkHttp文件上传与下载的进度监听扩展

    http://www.loongwind.com/archives/290.html 上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时 ...

  5. PHP 文件上传之如何识别文件伪装?——PHP的fileinfo扩展可!

    问题:文件上传时候需要验证上传的文件是否合法,文件伪装如何识别? 一个简单测试:把txt文件后缀直接改成jpg;上传 <!DOCTYPE html> <html> <ti ...

  6. 一款基于uploadify扩展的多文件上传插件,完全适用于Html5

    http://www.uploadify.com/documentation/  官网里面有两个插件,一个是要使用flash插件才能文件上传的插件,另外一个是不需要使用要flash插件的文件上传插件完 ...

  7. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  8. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  9. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

随机推荐

  1. 201521123066 《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.多态性: (1)概念:相同的方法名,不同的实现方法 (2)instanceof运算符:判 ...

  2. 201521123029《Java程序设计》第四周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 答:1. 多态性,多态性是相同的形态,不同的行为(定义),其中父类类型变量可以引用子类对象. ...

  3. 201521123037 《Java程序设计》第3周学习总结

    1. 本周学习总结 链接:http://naotu.baidu.com/file/026a646bb4031d4238accc69cdf53272 2. 书面作业 1. 代码阅读 public cla ...

  4. 让你的python程序同时兼容python2和python3

    python邮件列表里有人发表言论说「python3在10内都无法普及」.在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己 ...

  5. OJ周末题

    字符串分割 字符统计 记票统计

  6. 鸟哥Linux学习笔记06

    Linux 系统常用的压缩命令 1,*.Z compress程序压缩的文件,这个已经很老了,几乎不再使用,因此不再介绍. 2,gzip应用最广泛的压缩命令.目前gzip可以解开compress.zip ...

  7. 简单CSS 布局

    CSS Layout CSS Layout 是对上下左右布局的一个简单封装,主要针对自己项目里面方便使用. 坚持组合大于继承的原则,复杂的布局也是由简单布局组成的. 所以不习惯margin/paddi ...

  8. 文件的inode号操作

    linux给每个文件生成了一个唯一的inode编号,命令行下操作文件需要输入文件名,如果遇到文件名特别难输入(或者包含特殊符号)的情况,可以用inode号操作文件. 可以用这个命令查看inode号: ...

  9. JavaScript基礎知識

    JavaScript基礎知識 1.標籤組使用 <script charset='utf-8' //設置字元集 defet //使腳本延遲到文檔解析完成,Browser已忽略 language=' ...

  10. [转]IOS开发中的CGFloat、CGPoint、CGSize和CGRect

    http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGGeometry/Reference ...