shareSDK如何只分享图片

本文主要是针对cocos creator项目接入shareSDK后的截图分享问题

遇到的问题

  • Android只能分享sdcard下的图片
  • IOS图片必须要在Xcode左边目录里面,也就是必须在包里面
  • 我现在想要分享一个截图,截图是在游戏里面通过一些方法自己生成的,Android中生成的图片文件是在游戏的可写路径,不是sdcard,通常游戏引擎也不会支持直接截图存储到sdcard。IOS也是游戏的可写路径

解决方法

  • Android
    把图片拷贝到sdcard。要如何拷贝呢?从js层可以调到java层,我们用java把刚刚生成的图片拷贝出来。
    图片生成方法如下代码
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只分享图片的功能,有以上这两个引导应该可以满足很多需求了。

如果有什么不懂的或者其他需求,可以在下方留言。

你可能感兴趣的:(cocos,creator)