安卓平台,一开始我尝试用JS去调用JAVA的Bitmap生成当前屏幕图片,但截取到的VIEW并不是creator运行的VIEW(也就是一个黑屏),所以我按照子龙大大的这篇文章 http://forum.cocos.com/t/creator/40750 将图片放置在应用内的可写路径下,但是分享图片必须要使用手机/sdcard目录下的图片,请问有什么办法将此图片移动到/sdcard目录下?或者其他的解决方案,求大神解答
没人知道吗
人工置顶
之前有水友分享的
/**
* 截屏
* @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目录下,如果用的静态库确实需要进行图片转换操作。
我是直接接入微信的sdk
额。。。。。好吧
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 的?
那你怎么生成分享的缩略图?
在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();
}
}
