CCSocialShareのAndroidでつまづいた。

   

Cocos2d-xでTwitterにシェアする簡単な方法ないかなーと探していたら、
このようなサイトを見つけました。

http://giginet.hateblo.jp/entry/2015/12/01/234438
このサイト、たまたま僕がcocos2d-xを勉強し始めた時に買った本の作者でした。
ってことで使ってみようと思ったところ、iOSは本当に簡単に実装できました。
それこそ、READMEに書いてる通りなので割愛します。

 

しかし、僕の行方を阻むのはいつもAndroidです。
ってことで、試したことをメモしていきます。

 

cocos2d-x:version:3.10
android-studio:version:2.0

Androidとの戦い

とりあえず、READMEを"ちゃんと"読んで進めたら、
ビルド→実行までは行けました。
しかし、シェアボタンをタップしたら「問題が発生したため、libcocos2dxを終了します」というエラー。

Androidはエラーログが出ないため、やりにくいですねぇ・・・。

 

・AndroidManifestをいじってみる。
DLしたCCSocialShareの中に、AndroidManifestがあります。
そこに以下のような記述があるので、AppのManifestに追記してみます。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

→変化なし

 

・postMessageの引数を変えてみる。
postMessageの引数が、「TwitterかFBか,テキスト,画像パス,コールバック」って感じなんですが、
画像パスが無くてもいけるみたいなので、消してみた。

→エラー出る

 

・今度はコールバックを消してみる
コールバックも使ってないっぽいので、ラムダの中身を消してみた。

→消したらダメだったみたい。

 

・ImagePathの引数のところを、消すんじゃ無くて「""」にしてみた。

→変わりなし。

 

・CCSocialManager.cppをClassesに移動させてみる。

→エラー出る。

 

・ラムダの中にラムダがあるのが悪いのかな?とか思い、
別メソッドを作成してそこに実装してみる。

→当然のようにエラー

 

・一度、原点に戻ってマニュアルのコードをそのまま入れてみる。

→エラー

 

ってことは、そもそも導入から間違えているんだろうか・・・。

導入やり直し

2016/04/20追記

まずはこれ

$ cocos new YourFantasticGame -l cpp
$ cd YourFantasticGame
$ git clone https://github.com/giginet/CCSocialShare.git Classes/external/CCSocialShare

問題無く終了。
む、でも、さっき「LICENSE」とかなかったなぁ・・・。

 

次は「setting.gradle」に以下を追加→Sync now

// Add this setting
include ':socialshare'
project(':socialshare').projectDir = new File(settingsDir, '../Classes/external/CCSocialShare/CCSocialShare/android')

問題なし。

 

次はこれを、App/build.gradleの「dependencies」に追加。

    // Add this line
    compile project(':socialshare')

問題なし。

 

Android.mkに以下を追加。それぞれ下のsocialshare関係のやつだけね。

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../../Classes/AppDelegate.cpp \
                   ../../../Classes/HelloWorldScene.cpp \
                   ../../../Classes/external/CCSocialShare/CCSocialShare/android/CCSocialManager.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes \
                    $(LOCAL_PATH)/../../../Classes/external/CCSocialShare/CCSocialShare

 

これで終了。
まだソースコードはいじってないけど、ビルドしてみましょう。

→エラー無し!!

 

ソースコード書いて再挑戦してみると・・・。

→エラー・・・。

 

原因を考えてみる

2016/04/20追記

プログラムをずっとしてる人だったら、ソースコードとか見たら
原因がすぐわかるのかもしれないけど、僕にはさっぱりなので、
コードを色々書いたり消したりして原因を探ってみます。

ちなみに、コードはこんな感じ。

if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) {
        CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER,
                                                  "つぶやくコメント",
                                                  [](CCSocialShare::PostResult result) {
                                                      if (result == CCSocialShare::PostResult::SUCCEED) {
                                                          // When to post is succeed
                                                          log("Done");
                                                      } else if (result == CCSocialShare::PostResult::CANCELED) {
                                                          // When to post is canceled
                                                          log("Canceled");
                                                      }
                                                  });
    }

"つぶやくコメント"を変えているのと、imagePathを消してること以外はマニュアル通りです。
isAvailableというメソッドの中身が「return true」だけなんでよくわかりません。

とりあえず、このif文の中身を全部消して、下みたいにして動けば、
少なくともCCSocialShare自体はAndroidでも動いていると考えていいのかな・・・。
とりあえず、タップで音がなるようにしてみた。

if (CCSocialShare::SocialManager::isAvailable(CCSocialShare::Service::TWITTER)) {
        audio.itemGet();
    }

→ちゃんと音が鳴る。

ってことは、CCSocialShare自体はちゃんと動いているけど、
その中身のpostMessageが何かしているっていうことでしょうか?

 

CCSocialManager.hを見てみると、postManagerはこうあります。

static void postMessage(Service service, const char* message, SocialManagerCompletionCallback callback);

引数が
service・・・これはTwitterかFacebookかでしょうか。
message・・・投稿する文章
SocialManagerCompletionCallback・・・多分、投稿に成功した時どうするかとか・・・?

 

「CCSocialShare::SocialManager::」これは、
名前空間「CCSocialShare」の「SocialManager」クラスの
「postManager」ってことだと思うので、関係ないと思う。
isAvailableにも使ってるし。

 

じゃあどこに問題が?と考えると、
「SocialManagerCompletionCallback」こいつが怪しそう。
っていうのも、READMEに「Callback function (Currently in iOS only)」ってあるので。

 

でも、引数としてcallbackを入れないとダメだから、どうすればいいんでしょうか・・・。
CCSocialManager.cppをいじるのは怖いし。
弄ろうにも、postManager内でcallback使ってないっぽいし・・・。

 

・ラムダ式を全部消してみる。

CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER,
                                                  "つぶやくコメント",
                                                  );

こんな感じに[](){}を消してみると・・・。

→普通に怒られた。
そりゃ、怒られるか。

・では、こうしてみよう。
中身のないラムダ式。

CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER,
                                                  "無料脱出ゲーム-Tortoiseshell15- iOS:http://ur0.pw/tmYF  Android:http://ur0.pw/tmYX",
                                                  [](){});

→普通に怒られた。
ビルドすら通りません。

 

・これではどうでしょうか。
ラムダ式の{}の中身が悪さをしていると仮定。

CCSocialShare::SocialManager::postMessage(CCSocialShare::Service::TWITTER,
                                                  "無料脱出ゲーム-Tortoiseshell15- iOS:http://ur0.pw/tmYF  Android:http://ur0.pw/tmYX",
                                                  [](CCSocialShare::PostResult result) {
                                                      
                                                  });

→ビルドは通る・・・。
でもアプリは落ちる・・・。

そもそも、CCSosialShare::PostResultって何。
ヘッダーファイルを見たら、「SUCCEED,FAILURE,CANCELED」ってあるので、
おそらく投稿が成功したかどうかでしょう。

 

だから何なんでしょうか・・・。
理解の範疇を超えてます。

進展あったら追記します。

PC用

スポンサーリンク

 - cocos2dx, programming