加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2.2.3在线下载——sd卡容量判定

发布时间:2020-12-14 16:55:27 所属栏目:百科 来源:网络整理
导读:文介绍的是在线下载时如何判断sd卡的容量是否足够,分为三步:1.getPackageSize()——获取URL包的大小 2.getSdcardSize()——获取sd的剩余容量3.isSizeEnough()——判断sd的容量是否足够#include curl/curl.h#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
文介绍的是在线下载时如何判断sd卡的容量是否足够,分为三步:
1.getPackageSize()——获取URL包的大小  
2.getSdcardSize()——获取sd的剩余容量
3.isSizeEnough()——判断sd的容量是否足够

#include <curl/curl.h>

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "JniHelper.h"
#endif

//在线下载时,获取要下载的包的大小
//引用自http://www.cnblogs.com/JD85/p/3914949.html
float DLManager::getPackageSize()
{
	//获取资源包大小——单位为MB
	float packageSize = 0;
	double zipsize = 0;
	CURL *handle = curl_easy_init();
	curl_easy_setopt(handle,CURLOPT_URL,_packageUrl.c_str());
	curl_easy_setopt(handle,CURLOPT_HEADER,1);   //只需要header头
	curl_easy_setopt(handle,CURLOPT_NOBODY,1);   //不需要body

	if (curl_easy_perform(handle) == CURLE_OK)
	{
		curl_easy_getinfo(handle,CURLINFO_CONTENT_LENGTH_DOWNLOAD,&zipsize);
		float packageBytesTotal = (zipsize / 1024.f / 1024.f);
		CCLog("Package Size: %.2f MB",packageBytesTotal);
		packageSize = packageBytesTotal;
	}
	curl_easy_cleanup(handle);

	return packageSize;
}

//获取sd卡容量————C++
//通过jni来获取sd卡剩余容量
float DLManager::getSdcardSize()
{
	std::string m_mainActivityName = XtcUtils::xtcGetMainActivityName();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	JniMethodInfo methodInfo;
	jfloat ret = 0.f;
	if (JniHelper::getStaticMethodInfo(methodInfo,m_mainActivityName.c_str(),"readSDCard","()F"))
	{
		ret = methodInfo.env->CallStaticFloatMethod(methodInfo.classID,methodInfo.methodID);
		return ret;
	}	

	return 0;
#endif

	//win32下直接返回一个大容量
	return 5096;
}

//获取sd卡容量————Android
//将下列代码贴入proj.androidsrccomxtcxxxx.java
//引用自http://blog.csdn.net/zhaoweixing1989/article/details/7364362
public static float readSDCard() { 
	float ret = 0.f;
    String state = Environment.getExternalStorageState(); 
    if(Environment.MEDIA_MOUNTED.equals(state)) { 
        File sdcardDir = Environment.getExternalStorageDirectory(); 
        StatFs sf = new StatFs(sdcardDir.getPath()); 
        long blockSize = sf.getBlockSize(); 
        long blockCount = sf.getBlockCount(); 
        long availCount = sf.getAvailableBlocks(); 
        Log.d("","block大小:"+ blockSize+",block数目:"+ blockCount+",总大小:"+blockSize*blockCount/1024+"KB"); 
        Log.d("","可用的block数目::"+ availCount+",剩余空间:"+ availCount*blockSize/1024+"KB");
        
		//单位为MB
        ret = availCount*blockSize/1024/1024;
    }
    
    return ret;
}

//判断sd卡是否有足够容量存储在线下载的包
bool DLManager::isSizeEnough()
{
	bool bRet = false;
	float sdcardSize = getSdcardSize();
	float packageSize = getPackageSize();

	//判断文件类型
	string suffix;
	int pos = getPackageUrl().find_last_of(".");	//getPackageUrl()为服务器上包的路径,ex.http://192.168.100.11/AssociativeVideo/A.zip
	suffix = getPackageUrl().substr(pos,getPackageUrl().length() - 1);
	if(suffix.compare(".zip") == 0)
	{//若为zip文件,需将包大小设置为解压时的最大大小
		packageSize = packageSize * 2 + 0.5f;
	}

	if(sdcardSize > packageSize)
	{
		bRet = true;
	}
	else
	{
		CCLog("sdcardSize : %f MB < packageSize : %f MB",sdcardSize/1024.f,packageSize/1024.f);
	}

	return bRet;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读