Unity Android から Twitter に投稿するために、Android プラグインを書いた。

概要

  • Android Plugin 開発環境を整える
  • Twitter に投稿するプラグインを書いて jar 化する
  • jar を Unity にインポートして、プラグインを呼び出す

環境

  • Android 6.0.1
  • Unity 5.3.1p3

手順

Android Plugin 開発環境を整える

調べたらいろいろ見つかるので、好きな方法で整える。

好みの問題で、以下のようにする。

  • aar よりも jar を使う
  • Android Application プロジェクトを Android Library プロジェクトに変換するよりも、Android Application プロジェクトの中に Android Library モジュールを作る

やることは、以下のとおり。詳細は、参考 1 & 2 に丁寧に書いてくれている。

  1. 空の Android Studio プロジェクトを作成する
  2. File > New > Module から、Android Library モジュールを作成する
  3. Gradle で Unity の jar を import する
  4. Gradle タスクで jar を export する

注意点

Unity 5.3.1 では classes.jar の場所が以下に変わっていた。

/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar

ので build.gradle の dependencies は以下のような感じにした。

build.gradle (抜粋)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Classes/classes.jar')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

Twitter に投稿するプラグインを書く

さくっと書く。

DDDTwitter.java

package com.kakeragames.dddtwitter;

import android.app.Activity;
import android.content.Intent;

import com.unity3d.player.UnityPlayer;

public class DDDTwitter {

    public void post(String message) {
        Activity currentActivity = UnityPlayer.currentActivity;

        Intent tweet = createTweetIntent(message);
        tweet.setPackage("com.twitter.android");

        if (tweet.resolveActivity(currentActivity.getPackageManager()) != null) {
            currentActivity.startActivity(tweet);
            return;
        }

        Intent share = createTweetIntent(message);
        currentActivity.startActivity(share);
    }

    private Intent createTweetIntent(String message) {
        Intent tweet = new Intent();
        tweet.setAction(Intent.ACTION_SEND);
        tweet.putExtra(Intent.EXTRA_TEXT, message);
        tweet.setType("text/plain");
        return tweet;
    }
}

Twitter 公式クライアントがあれば、それ目掛けて Intent を投げる。 無ければアプリ一覧を開く。という感じにした。

アプリ一覧に、Twitter クライアント以外は表示したくない

という場合は、自分で Intent.createChooser したら良い。

スクリーンショットを投稿したい

という場合は、Intent にファイルの URI を追加することになる。

ただし、ファイルが Intent を受け取る側のアプリから読み取りできる必要があるので、次のいずれかの方法をとることになる。

  • ファイルを ExternalStorage に保存する
  • FileProvider を使って読み取り可能な URI を渡す

プラグインを書き出す

Gradle タスクでさくっと書き出す。

build.gradle (抜粋)

task deleteJar(type: Delete) {
    delete 'release/dddtwitter.jar'
}

task exportJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', 'dddtwitter.jar')
}

exportJar.dependsOn(deleteJar, build)

プラグインを Unity にインポートする

Assets/<WHATEVER_YOU_LIKE>/Plugins/Android/dddtwitter.jar

に追加する。

プラグインを呼び出す

DDDTwitter.cs

using UnityEngine;

public class DDDTwitter
{
    public void Post(string message)
    {
        using (var dddTwitter = new AndroidJavaObject("com.kakeragames.dddtwitter.DDDTwitter"))
        {
            dddTwitter.Call("post", message);
        }
    }
}

using ブロックについては、Unity の API リファレンスのサンプル では使っていないので、使わなくても良いのかもしれない。 AndroidJavaObject は IDisposable を実装しているためか、using を使うサンプルが多いので、右に倣えしている。

まとめ・感想

Android プラグインを書けば、ネイティブの機能で Twitter に投稿することも簡単にできる。 とは言っても、まだテキストだけしか渡していないので、序の口である。