本文主要是针对cocos creator项目接入shareSDK后的截图分享问题
遇到的问题
- Android只能分享sdcard下的图片
- IOS图片必须要在Xcode左边目录里面,也就是必须在包里面
- 我现在想要分享一个截图,截图是在游戏里面通过一些方法自己生成的,Android中生成的图片文件是在游戏的可写路径,不是sdcard,通常游戏引擎也不会支持直接截图存储到sdcard。IOS也是游戏的可写路径
解决方法
Tools.screenShoot = function (func) {
if (!cc.sys.isNative) return;
if (CC_JSB) {
var dirpath = jsb.fileUtils.getWritablePath() + 'ScreenShoot/';
if (!jsb.fileUtils.isDirectoryExist(dirpath)) {
jsb.fileUtils.createDirectory(dirpath);
}
var name = 'ScreenShoot-' + (new Date()).valueOf() + '.png';
var filepath = dirpath + name;
var size = cc.visibleRect;
var rt = cc.RenderTexture.create(size.width,size.height);
cc.director.getScene()._sgNode.addChild(rt);
rt.setVisible(false);
rt.begin();
cc.director.getScene()._sgNode.visit();
rt.end();
rt.saveToFile('ScreenShoot/' + name,cc.ImageFormat.PNG,true,function () {
cc.log('save succ');
rt.removeFromParent(true);
if (func) {
func(filepath);
}
});
}
};
这样得到一个屏幕截图,存储目录在可写路径里。最后返回的filepath这个值就是生成的截图的路径,我们使用js调用java的方法,将filepath传到java层,java拿到图片路径后,直接进行拷贝,代码如下:
public static void copyFile(String oldPath,String newPath) {
try {
int bytesum = 0;
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //文件存在时
InputStream inStream = new FileInputStream(oldPath); //读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字节数 文件大小
fs.write(buffer,0,byteread);
}
inStream.close();
}
}
catch (Exception e) {
System.out.println("复制单个文件操作出错");
e.printStackTrace();
}
}
这个是静态方法,在js层调用java或者直接在java层调用,把图片复制到sdcard目录下,也可以放到别的目录
copyFile(filepath,"/sdcard/shareImg.png");
这样图片就在sdcard目录下了,可以使用shareSDK的相关方法进行分享。
- IOS
虽然shareSDK自带截图分享功能,但是shareSDK的截图分享功能是针对一般的手机应用,游戏的渲染和原生应用的渲染原理不一样,渲染层也不一样,所以shareSDK截图总是截出黑图或者透明图。
ios和android图片分享api不同,android使用setImagePath(imgPath),传入的是图片的路径,ios传入的图片的数据,所以我们只要在ios层把图片的数据读出来再传入就可以了,代码如下:
UIImage * image = [[UIImage alloc] initWithContentsOfFile:imgUrl];
[shareParams SSDKSetupShareParamsByText:content
images:@[image]
url:[NSURL URLWithString:webUrl]
title:title
type:SSDKContentTypeImage];
imgUrl还是在js层获取到的图片路径filepath,这样就可以分享ios截图了。
shareSDK只分享图片的功能,有以上这两个引导应该可以满足很多需求了。