本文主要是针对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只分享图片的功能,有以上这两个引导应该可以满足很多需求了。