cocos2dx接入微信sdk,分享文本和截图

原创链接 http://blog.csdn.net/a704020443/article/details/78623219

首先,你得拥有一个微信开放平台,需要一个AppID。

然后在微信平台下,下载开发工具包,放在android下的libs文件里面。比如:libammsdk.jar

然后在AndroidManifest.xml中添加权限。

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

下面开始写java代码。
首先在android下的src创建文件夹,比如:src\com\share\game。
建立一个WXapi.java

引入一些要用的包。

import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXImageObject;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXTextObject;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

在一个WXapi的class里面,定义一些必要的属性,比如wx_api和app_id。还有sContext。
然后在这两行代码中开始注册。
这里的app_id就是你开放平台的id。

private static IWXAPI wx_api;
    private static Cocos2dxActivity sContext = (Cocos2dxActivity) Cocos2dxActivity.getContext();
    public static final String APP_ID = "wx3d4e39axxxxxxxx";

wx_api = WXAPIFactory.createWXAPI(sContext, APP_ID, true);
wx_api.registerApp(APP_ID);

下面则是写的微信分享文本,其中分享或收藏的目标场景,通过修改scene场景值实现。
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite

    public static void shareToWX(){

        String strText = "this is my WX share";

        WXTextObject textObj = new WXTextObject();
        textObj.text = strText;

        WXMediaMessage msg = new WXMediaMessage();
        msg.description = strText;
        msg.mediaObject = textObj;

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("text");
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneSession;

        wx_api.sendReq(req);
    }

然后这是微信分享图片到朋友圈。

public static void shareToImg(String path){

        Bitmap bmp = BitmapFactory.decodeFile(path);

        WXImageObject imgObj = new WXImageObject(bmp);
        WXMediaMessage msg = new WXMediaMessage();
        msg.mediaObject = imgObj;

        //设置缩略图

        Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, 150, bmp.getHeight() * 150 / bmp.getWidth(), true);
        bmp.recycle();
        msg.thumbData = Util.bmpToByteArray(thumbBmp, true);

        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = buildTransaction("img");
        req.message = msg;
        req.scene = SendMessageToWX.Req.WXSceneTimeline;

        wx_api.sendReq(req);

    }

这里面的buildTransaction()函数文档里面没有,需要自己重写。

private static String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }

还有在分享图片的Util.bmpToByteArray(),这个东西也没有,也需要自己在同目录下写一个util的类。

public class Util {

    public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        bmp.compress(CompressFormat.PNG, 100, output);
        if (needRecycle) {
            bmp.recycle();
        }

        byte[] result = output.toByteArray();
        try {
            output.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}

好了,以上就是分享到微信的java代码,然后我自己也写了一个主要测试在android中访问图片的一个函数。我从外面获取到路径path,然后我在android上去显示出来。由于是因为android渲染,所以要在UI线程里面跑。
当然,我这里是修改了Cocos2dxActivity.java的代码,把mFrameLayout的属性变成了public。以便于这里的访问。

或许有其他更好的方法,请指教。

    public static String _path = null;

    public static void showToImg(String path){
        _path = path;

        sContext.runOnUiThread(new Runnable(){
            @Override
            public void run(){

                Bitmap bmp = BitmapFactory.decodeFile(_path);

                ImageView image = new ImageView(sContext);
                image.setImageBitmap(bmp);

                ViewGroup.LayoutParams lypt=new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                image.setLayoutParams(lypt); 
                sContext.mFrameLayout.addView(image);


            }
        }); 
    }

还有一个被忽视的重要java代码。那就是微信的回调。
还是在src目录下新建一个文件,比如:src\wxapi 目录里面。
新建立一个WXEntryActivity.java。
然后引入WXapi。

import com.share.game.WXapi

具体代码如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        WXapi.getWx().handleIntent(getIntent(), this);
    }

    @Override
    public void onReq(BaseReq arg0) {
        Log.d("Mohjong onReq", "11111111111111111111111111msg from wx");

        this.finish();
    }

    @Override
    public void onResp(BaseResp resq) {
        Log.d("Mohjong onResp", "2222222222222222222222222msg from wx");
    }

}

在androidManifest.xml里面添加

<activity android:name="wxapi.WXEntryActivity1111"
                  android:label="@string/app_name"
                  android:exported="true" />

其中WXapi.getWX();是在WXapi.java中的一个静态函数,主要是为了返回wx_api。

好了,接下来就是jni交互时间。
首先,调用分享文本,无参数调用。

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

        //shareToWX

        JniMethodInfo t;
        bool ishave = JniHelper::getStaticMethodInfo(t, "com/share/game/WXapi", "shareToWX", "()V");
        if (ishave) {
            t.env->CallStaticVoidMethod(t.classID, t.methodID);
        }
#endif

可以写在按钮响应事件里面。
接下来是,截图,然后获取路径,传入到java里面。

Size winSize = Director::getInstance()->getWinSize();
        RenderTexture* render = RenderTexture::create(winSize.width, winSize.height);

        render->begin();
        this->getParent()->visit();
        render->end();

        render->saveToFile("share.png", Image::Format::PNG);
        std::string str = FileUtils::sharedFileUtils()->getWritablePath() + "share.png";

上面是截图代码,str是路径。其中传入java中string要变为char*,并且还要经过转换为jstring才能开始传入。

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

            std::string str = FileUtils::sharedFileUtils()->getWritablePath() + "share.png";

            JniMethodInfo t;
            bool ishave = JniHelper::getStaticMethodInfo(t, "com/share/game/WXapi", "shareToImg", "(Ljava/lang/String;)V");

            jstring _path = t.env->NewStringUTF(str.c_str());

            if (ishave) {
                t.env->CallStaticVoidMethod(t.classID, t.methodID, _path);
    }
#endif

还有一个jni的交互的问题,在getStaticMethodInfo()的参数里面后面那个v表示无返回,但是,你会传入一个string类型的参数,所以在前面的括号里面要填写string的类型。叫做签名好像。

有一个注意点,截图后,不要马上分享,或者读取,因为有可能没有保存完毕,你就访问了后,就会报错,所以,等一下再访问就没有问题了。

下面我会把我的这一份测试代码上传。

资源路径http://download.csdn.net/download/a704020443/10131205

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值