【已解决】creator如何将截图分享到微信

安卓平台,一开始我尝试用JS去调用JAVA的Bitmap生成当前屏幕图片,但截取到的VIEW并不是creator运行的VIEW(也就是一个黑屏),所以我按照子龙大大的这篇文章 http://forum.cocos.com/t/creator/40750 将图片放置在应用内的可写路径下,但是分享图片必须要使用手机/sdcard目录下的图片,请问有什么办法将此图片移动到/sdcard目录下?或者其他的解决方案,求大神解答

2赞

没人知道吗:3: 人工置顶

1赞

之前有水友分享的

/**
 * 截屏
 * @param  {[function]} func 回调函数
 * @return
 */
var screenShoot = function(func) {
    if (!cc.sys.isNative) return;
    let dirpath = jsb.fileUtils.getWritablePath() + 'ScreenShoot/';
    if (!jsb.fileUtils.isDirectoryExist(dirpath)) {
        jsb.fileUtils.createDirectory(dirpath);
    }
    let name = 'ScreenShoot-' + (new Date()).valueOf() + '.png';
    let filepath = dirpath + name;
    let size = cc.winSize;
    let 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.IMAGE_FORMAT_PNG, true, function() {
        cc.log('save succ');
        rt.removeFromParent();
        if (func) {
            func(filepath);
        }
    });
};

先谢谢你,但是我截图是要用来在安卓平台做微信分享的,而分享的图片又必须是在手机的/sdcard目录下的图片,这种方式是在应用包内放置图片的,我现在想问的就是如何将此图片移动到手机的/sdcard目录下,或者其他的解决方案

再顶,顶上首页

需修改底层源码,将源码saveToFile里的getWritablePath()去掉,只留下fliename,然后别忘了加上读写sdcard的权限,结束!
renderTexture.saveToFile(’/sdcard/share.jpg’,cc.IMAGE_FORMAT_JPEG,true, function () {
cc.log(“capture screen successfully!”);
//分享
});

我就用上面代码返回的filePath,就能成功在微信分享

由于我引擎用的是FrameWork静态库,我的做法是不修改引擎源码,将截屏返回的图片路径传入到android,再调用java拷贝文件函数,将截屏复制到sdcard目录下,再调用微信分享即可

我一开始就用的这种方法 接入anysdk微信分享是不行的(不绕过审核) 不知道你是咋成功的 我的版本是 Mac下1.4beta7

嗯,我也试了,取得图片路径转bitmap然后放到sdcard目录下,但权衡再三还是选择修改源码,毕竟不用再走安卓那一套创建新图片的流程了,可以直接将图片放到sdcard目录下,如果用的静态库确实需要进行图片转换操作。

1赞

我是直接接入微信的sdk

:9:额。。。。。好吧

filepath 返回的这个路径是在手机上的路径? 我用JS传给java 只有左下角截了个小图 闪烁了一下就没了 也没拉起分享

楼主我和你一样的问题,能不能分享下源码看看

楼主,你的问题解决了吗?求份源码

我试了一下 不行呀

wechat_share_pic: function(imagePath,thumbImage){
    var info = {
        mediaType : "1",
        shareTo: "0",
    }
    if (cc.sys.os == cc.sys.OS_IOS){
        Common.log("IOS~~~~~~~~~~~~~~~~~ = "+imagePath)
    	info.imagePath = imagePath
    	info.thumbImage = thumbImage
    }else if(cc.sys.os == cc.sys.OS_ANDROID){
    	Common.log("ANDROID~~~~~~~~~~~~~~~~~ = "+imagePath)
    	info.imagePath = imagePath
    	info.thumbSize = "64"
    }
    this.wechat_share(info)
},

screenShoot: function() {
    if (!cc.sys.isNative)return;
    var dirpath = '/sdcard/'//jsb.fileUtils.getWritablePath() + 'ScreenShoot/';
    if (!jsb.fileUtils.isDirectoryExist(dirpath)) {
        jsb.fileUtils.createDirectory(dirpath);
    }
    var name = 'ScreenShootShare.png';
    var filepath = dirpath + name;
    var size = cc.winSize;
    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(filepath, cc.IMAGE_FORMAT_PNG, true, function() {
        rt.removeFromParent();
    });

    Common.log("screenShoot filepath===== "+filepath)
    return filepath
},

源码也已经修改了

报错日志:
http://forum.cocos.com/t/anysdk/46339

求解救啊 。。。。

请问下你怎么生成 thumbImage 的?

1赞

那你怎么生成分享的缩略图?

1赞

在android机器上测试过了。直接使用jsb.fileUtils.getWritablePath() 就可以分享成功。不存在一定要在sd卡路径下。把路径通过jsb反射传给android端。

没有使用anysdk。直接使用的微信原始SDK来接入。

android 微信sdk代码如下

 public static void androidWeiXinShareImage(String filename, String scene_id){
        Log.i(TAG, "=============androidWeiXinShareImage================"+filename);
        // filename 打印结果为jsb.fileUtils.getWritablePath() + name + ".png" ==> /data/user/0/com.xhkmj.www/files/screen.png

        if (new File(filename).exists())
        {
            Object localObject1 = BitmapFactory.decodeFile(filename);
            Object localObject2 = new WXImageObject((Bitmap) localObject1);

            WXMediaMessage localWXMediaMessage = new WXMediaMessage();
            localWXMediaMessage.mediaObject = ((WXMediaMessage.IMediaObject) localObject2);
            localObject2 = Bitmap.createScaledBitmap((Bitmap) localObject1, 128, 72, true);
            ((Bitmap) localObject1).recycle();
            localWXMediaMessage.thumbData = Util.bmpToByteArray((Bitmap) localObject2, true);
            localObject1 = new SendMessageToWX.Req();
            ((SendMessageToWX.Req) localObject1).transaction = String.valueOf(System.currentTimeMillis());
            ((SendMessageToWX.Req) localObject1).message = localWXMediaMessage;

            int sceneID = -1;
            if(scene_id.equals("WXSceneSession")){
                sceneID = SendMessageToWX.Req.WXSceneSession;
            }else if (scene_id.equals("WXSceneTimeline")){
                sceneID = SendMessageToWX.Req.WXSceneTimeline;
            }else  if(scene_id.equals("WXSceneFavorite")){
                sceneID = SendMessageToWX.Req.WXSceneFavorite;
            }

            ((SendMessageToWX.Req) localObject1).scene = sceneID;

            api.sendReq((BaseReq) localObject1);
        }
        else
        {
            Toast.makeText(instance.getApplicationContext(), "file not exists", Toast.LENGTH_SHORT).show();
        }

    }

6赞