快速添加简单的Android截屏分享

         基于cocos2d-x开发(我的是V2.2.3),分享的方法有很多,例如用SharedSDK,或者直接用各个开发平台的SDK,但对于android平台,如果要求不是很高的话,有一种简单的方式(Intent组件+jni)。

       1.假如工程名是LCX,那首先修改LCX.java


    public static void nativeShare()
    {
        //需要开线程执行
        new Thread(new Runnable()
        {
            @Override
            public void run() {
                Intent shareIt = new Intent("android.intent.action.SEND");
                shareIt.setType("image/*");
                shareIt.putExtra(Intent.EXTRA_SUBJECT, "Share");      
                shareIt.putExtra(Intent.EXTRA_TEXT, "Content");
                //分享sd卡的图片

               shareIt.putExtra(Intent.EXTRA_STREAM,Uri.parse("file:////data/data/" + getContext().getApplicationInfo().packageName+ "/files/myShare.png"));
                shareIt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getContext().startActivity(Intent.createChooser(shareIt, "Share"));
            }
        }).start();
    }

  

2.然后是cocos2d-x截屏分享部分

    包含头文件:

      #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
      #include "platform/android/jni/JniHelper.h"
      #endif

  然后在分享回调中加入代码:

 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture* pTexture = CCRenderTexture::create((int)winSize.width, (int)winSize.height,kCCTexture2DPixelFormat_RGBA8888);
    pTexture->getSprite()->setAnchorPoint( ccp(0.5f,0.5f) );
    pTexture->setPosition( ccp(winSize.width/2, winSize.height/2) );
    pTexture->setAnchorPoint( ccp(0.5f,0.5f) );

    pTexture->begin();
    this->visit();
    pTexture->end();

   //保存文件,路径在data/data/包名/files/中

    pTexture->saveToFile("myShare.png",kCCImageFormatPNG);


  //分享

   JniMethodInfo jni_method_info;
    if (JniHelper::getStaticMethodInfo(jni_method_info, "com/test/LCX", "nativeShare", "()V")) {
        jni_method_info.env->CallStaticVoidMethod(jni_method_info.classID, jni_method_info.methodID);
    }

  #endif   //CC_PLATFORM_ANDROID

   这样基本就ok了,系统会搜索所有可以分享的应用(新浪微博,腾讯微博,人人等),然后列出一个菜单供用户选择。

3.另外,CCRenderTexture的saveToFile方法保存的文件不是所有应用都可以访问的,例如新浪微博,所以建议把文件保存在sdcard中,这样就方便很多应用访问了。

      android的sdcard路径是不定的,各个手机不一定相同,不能写死。但是貌似cocos2dx没有接口返回sd的路径,所以我们自己通过jni获取。

    首先添加sd写权限,修改AndroidManifest.xml,如下:

     

    然后修改LCX.java

     public static String nativeGetSDPath()
    {
         //判断sd卡是否存在
        if  (Environment.getExternalStorageState()  
                .equals(android.os.Environment.MEDIA_MOUNTED))  
         {                                 
            return Environment.getExternalStorageDirectory().toString();//获取跟目录
         }  
        return null;  
    }


然后替换saveToFile的代码(红色部分)

    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture* pTexture = CCRenderTexture::create((int)winSize.width, (int)winSize.height,kCCTexture2DPixelFormat_RGBA8888);
    pTexture->getSprite()->setAnchorPoint( ccp(0.5f,0.5f) );
    pTexture->setPosition( ccp(winSize.width/2, winSize.height/2) );
    pTexture->setAnchorPoint( ccp(0.5f,0.5f) );

    pTexture->begin();
    this->visit();
    pTexture->end();
    pTexture->saveToFile("myShare.png",kCCImageFormatPNG);

    JniMethodInfo t;
    std::string ret("");
    if (JniHelper::getStaticMethodInfo(t, "com/test/LCX", "nativeGetSDPath", "()Ljava/lang/String;")) {
        jstring str = (jstring)t.env->CallStaticObjectMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
        ret = JniHelper::jstring2string(str);
        t.env->DeleteLocalRef(str);


        CCImage *pImage = pTexture->newCCImage(true);
        if (pImage)
        {
            std::string fullpath = ret + "/myShare.png";
            pImage->saveToFile(fullpath.c_str(), true);
        }
        CC_SAFE_DELETE(pImage);
    }

    JniMethodInfo jni_method_info;
    if (JniHelper::getStaticMethodInfo(jni_method_info, "com/test/LCX", "nativeShare", "()V")) {
        jni_method_info.env->CallStaticVoidMethod(jni_method_info.classID, jni_method_info.methodID);
    }


最后修改nativeShare函数   shareIt.putExtra(Intent.EXTRA_STREAM,Uri.parse(nativeGetSDPath()+"/myShare.png"));
shareIt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getContext().startActivity(Intent.createChooser(shareIt, "Share"));



好了大功告成!!!


后续:

       cocos2d-x 3.2后有新的接口,utils::captureScreen,具体参考http://cn.cocos2d-x.org/tutorial/show?id=1737

                  


你可能感兴趣的:(Cocos2d-x)