[Unity] Threads (SNS)にAndroidアプリからシェアする方法

Unity解説

Meta社(Instagram)のThreadsにUnityから投稿したい!

Unityで作ったAndroidアプリからThreadsに連携する方法を解説するよ!

Unity2022以降でも対応できるようにしたよ!

Twitterのごたごたにまぎれて颯爽と登場したMeta社のThredsサービス、これを機にUnityアプリからシェアする機能を作りたくなりますね。

本記事では、UnityでAndroidアプリからThreadsへシェア連携する方法を解説します。
この方法でTwitterや他のSNSも同時に対応できます。

早速結論ですが、

Social Connectorを使うと楽

Twitter連携などでもおなじみのSocial Connectorですね。
Social Connectorは文字や画像などをAndroidの連携機能に渡すための仕組みです。
※もしTwitter対応できているならばそのまま使えると思います

早速導入していきましょう。

※今回の開発環境(2023/07試行)
Unity: 2022.3.2f1
Android: 9~12(API 28~32)

Social Connector を使ったテキストのThreads連携

冒頭でも触れましたが、Social Connectorは文字や画像などをAndroidの連携機能に渡すための仕組みです。

直接アプリを開くのではなく、どのアプリでシェアするかをユーザに選ばせるタイプです。
画像シェアボタンを押したときに、いろんなアプリが並んでる選択画面を見たことがあると思います。そう、アレです。ちなみに、アレは「チューザ」と言います。

アセットのインポート

Social Connectorはanchan828氏のGitHubにありますのでDLしてインポートましょう。
このへん慣れてる方は飛ばしていただいて構わないです。

GitHub - anchan828/social-connector: Social Connector
Social Connector. Contribute to anchan828/social-connector development by creating an account on GitHub.

意外と戸惑う他人のGitHubですね。私は最初どこでDLするのか分かりませんでした。
CodeのとこをクリックしたらDownload ZIPが出てくるので、まとめてダウンロードできます。

ダウンロードしたら、どこかに解凍しておきましょう。

解凍できたら、中に入っているunitypackageをUnityエディタのAssetsのとこに放り込みます。

インポート画面が出てくるのでImportボタンを押します。

iOS用スクリプトのコンパイルエラーの対処

Androidだけを対象にしているとき、おそらくiOSって書いてあるエラーが出ると思います。

Assets\SocialConnector\Editor\SocialConnectorPostProcess.cs(5,19): error CS0234: The type or namespace name 'iOS' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)

今回はAndroid対象なのでソース丸ごと消して解消しましょう。
→ Assets/SocialConnector/Editor/SocialConnectorPostProcess.cs

iOSも対象ならばビルド設定からプラットフォームを変更すればよいと思います(Mac持っていないので未確認です、ごめんなさい)

Threadsシェアするボタンを作る

今回は単純にボタンを押したら固定文字をシェアする例です。ボタンのスクリプトを作って、Buttonコンポーネントに取り付けましょう。

ButtonThreads .cs

using UnityEngine;

public class ButtonThreads : MonoBehaviour
{
    public void Post()
    {
        SocialConnector.SocialConnector.Share("TEST POST BY Unity");
    }
}

SocialConnectorを2つ並べているのは、単純にクラス名だけだと下記エラーが出るからです。

Assets\ButtonThreads.cs(7,9): error CS0234: The type or namespace name 'Share' does not exist in the namespace 'SocialConnector' (are you missing an assembly reference?)

名前空間とクラスの名前が同じなので特定できないのが良くないみたいですね。using しても同じくエラーがでます。

作ったスクリプトはシェアボタンにAttachします。

なお、この素敵なUIはGUI PRO Kitという有名なアセットです。
ダダサバ●イバーなど、ちらほら市場のアプリでも見かけるくらいの高クオリティなUI画像セットで私も愛用しています。

Androidビルド

テキストのシェアだけであれば、実はこの段階でもできます。ビルドして確かめてみましょう。

AndroidビルドにSwtch PlatformしてからBuildし、実機をつないでBuild And Runです。
実機のほうの開発者設定は公式マニュアルをご覧くださいませ。

実機でボタンを押すと、アプリを選択する欄が出てきますのでThreadsを選択します。
(Instagramのアカウントでログインを済ませておいてください)

なお、Twitterなどの他アプリにもこのままでシェアできます。

Package Nameビルドエラーの対処

もしPackage Nameを未設定でしたらAndroid実機に入れようとすると下記エラーが出ます。

UnityException: Package Name has not been set up correctly
Please set the Package Name in the Player Settings. The value must follow the convention 'com.YourCompanyName.YourProductName' and must contain only alphanumeric and underscore characters.
Each segment must start with an alphabetical character.
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

Project Settings を開いてAndroidのタブを押します。
そこのPlayerにある会社名とアプリ名を入力し、同画面の下の方にあるIdentificationのところでOverride Default Package Nameを付け外しするとデフォルトの値が入ります。
※下記例では本ブログのURL+アプリ名を入れました

※もしPlay ストアに公開するのであれば、適切に設定しておいてください。ストアに登録したら変更できません。

画像のシェア

スクリーンショットや用意したロゴなどをシェアしたいときもSocial Connectorは利用できます。
少し設定が必要なのですが、解説を交えて手順を紹介します。

※今回の環境の紹介(2023/07試行)
Unity: 2022.3.2f1
Android: 9~12(API 28~32)

最新のFileProvider対応

Android機で画像をシェアするにはFileProvider対応をする必要があります。
FileProviderとはAndroidのセキュリティ機能を介して他アプリにコンテンツを共有するためのAndroid側コンポーネントです。
ファイルの共有  |  Android デベロッパー  |  Android Developers

Social ConnectorではFileProviderを利用したシェアをしているので、そのためのセッティングをする必要があります。ただ、Social Connectorの最終更新は5年前なので作者anchan282氏の解説では現代のAndroid SDKとUnityバージョンに対応できない部分が2つあります。

  • Resフォルダの廃止(Unity2022)
  • Android Support Libraryの廃止(Android API 28, Android 7.0)

これらを踏まえてFileProviderを導入していきましょう。

なお、最終的には下記のような構成になります。

Assets
├─Plugins
│ └─Android
│ ├─core-1.8.0.aar (動くバージョンを探す)
│ ├─gradleTemplate.properties
│ └─res.androidlib
│ ├─AndroidManifest.xml
│ └─res
│ └─xml
│ └─filepaths.xml
└─SocialConnector
├─SocialConnector.cs
├─Editor
├─Plugins (ここにファイルが残っていてはいけない)
└─Sample

Social Connectorからマニフェストファイルをコピー

まずは、必要なファイルをSocial ConnectorのPluginsからコピーしてきましょう。
Assetsの下にPluginsフォルダを作ります。そこへSocial ConnectorフォルダにあるAndroidフォルダをまるごと”移動”しましょう。

次に、この中にresフォルダがありまして昔はこれで動いていたのですが、Unity2022からResフォルダが廃止になったので代わりにhoge.androidlibフォルダを作ります(hogeはなんでもいい)。

res.androidlibの中には、さっき移動したばかりのPlugins/AndroidにあるresフォルダまるごととAndroidManifest.xmlを入れます。

AndroidXライブラリの配置

前述したようにAndroid Support Library は廃止されました。最新のSDKではAndroidXライブラリを使います。

Social Connectorに同梱されている謎ファイル「support-core-utils-25.3.1.aar」は古いAndroid Support Libraryです。AndroidX利用の場合は削除しておきます。

代わりに、AndroidXをMVNからDLしてきましょう。バージョンは試行錯誤でしたがAndroid12対象でAndroidX core 1.8.0が動きました(古いのは動かなかったですが、新しすぎてもSDK側が対応してないときがあります)。

これを、Assets/Plugins/Androidに配置します。

ちなみに、今回のようにAndroidX利用する場合は同梱の謎ファイル「support-core-utils-25.3.1.aar」を削除していないとビルドエラーが出ます。

Execution failed for task ':launcher:checkReleaseDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class androidx.core.app.AppLaunchChecker found in modules jetified-core-1.8.0-runtime (:core-1.8.0:) and jetified-support-core-utils-25.3.1-runtime (:support-core-utils-25.3.1:)

AndroidXを使う設定(gradle)

置いただけでは使えないことがあるみたいなので、明示的に設定しておきます。

まずはGradleです。Project Settings/PlayerのAndroidタブにあるPublishing Settingsに、Custom Gradle Properties Templateがあります。これにチェックを入れます。

すると、Assets/Plugins/Android/gradleTemplate.properties が自動作成されます。
そこに、AndroidXを使う設定を入れます(下記コードの赤字の部分)。

org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
unityStreamingAssets=**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**
android.useAndroidX=true
android.enableJetifier=true

AndroidXを使えるように改修(Manifest, スクリプト)

使うFileProviderをAndroid Support LibraryからAndroidXに変更します。

Assets/Plugins/Android/res.androidlib/AndroidManifest.xml のうち2行を変更します(赤文字のところ)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
		  package="custom.android.res">
    <application
        android:theme="@style/UnityThemeSelector"
        android:label="@string/app_name">
        <activity
            android:label="@string/app_name"
            android:name="com.unity3d.player.UnityPlayerActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
        </activity>
        <provider

            android:name="android.support.v4.content.FileProvider"
            android:name="androidx.core.content.FileProvider"

            android:authorities="com.kyusyukeigo.socialconnector.fileprovider"
            android:authorities="net.coacoasoft.PostToThreads.fileprovider"

            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths"></meta-data>
        </provider>
    </application>
</manifest>

authoritiesの”net.coacoasoft.PostToThreads”部分は、Player Settingsで設定したパッケージ名を入れます。

次に、Social Connectorのスクリプトを1行変更します。

Assets/SocialConnector/SocialConnector.cs

//var fileProvider = new AndroidJavaClass("android.support.v4.content.FileProvider");
var fileProvider = new AndroidJavaClass("androidx.core.content.FileProvider");

画像シェアのスクリプトを実装

ここまでで準備はできましたので、シェアするスクリプトを書いていきます。
今回はスクリーンショットをそのまま貼り付けるようにしました(よくあるサンプルですね)。

using UnityEngine;

public class ButtonThreads : MonoBehaviour
{

    string imagePath
    {
        get
        {
            return Application.persistentDataPath + "/image.png";
        }
    }

    public void Post()
    {
        ScreenCapture.CaptureScreenshot("image.png");
        SocialConnector.SocialConnector.Share("TEST", "https://coacoa.net", imagePath);
    }
}

Shareの引数は、文章、Webサイトのリンク、画像の場所です。

実装すると下記動画のようにスクショをシェアできます。
(めっちゃ個人情報が見えてるので一部隠しています)

※現在、Threadsでは画像かテキストかどちらかのみ受け付けているようです(たぶん)
 今後、Threadsが両方同時を受け付けてくれるよう期待しています(Twitterは両方同時できることを確認済)

(参考)Write Permission

解説ブログによっては外部ストレージの権限をOnにするような指示があります。
古いAndroidでは権限が必要だったためだと思いますが、現代ではほぼ不要だと思います。
これがついているとアプリ初回起動時に権限確認が出てしまうので、どうしても無理だったときのみ試してみてください。

Androidの開発公式でも「If your app is on a device that runs API level 19 or higher, you don’t need to declare this permission」と言われていますね。API 19はAndroid 4.4です。

まとめ

UnityでAndroidアプリからThreadsへシェア連携する方法を解説しました。

Threadsへの連携にはSocial Connectorを使います。
インポートしてシェアのメソッドを呼び出すだけでThreadsやTwitterに連携できるのは便利ですね。

Android特有の設定がけっこう面倒ですが、シェアの効果は絶大(らしい)のでぜひ試してみてください。

2023/7
手持ちのXperia1ではThreadsに画像シェアできませんでした。
Galaxy S21ではできたので、Threads側の問題と思います。
解消されることを祈っております。
(とはいうもののAndroid 9はもう誰も使っていないのでは・・・?)

かわいい我が子にオリジナルアプリを!

コメント

タイトルとURLをコピーしました