← Back to list

關於用 Unity Android Facebook SDK 遇到的坑

記錄一下用 Unity 接 Android Facebook SDK 時遇到的各種困難

張又壬 · 2023-10-03 09:45 · 6 claps · 6.8 min read
#unity #android #facebook-sdk #kotlin
Open on Medium ↗
Wiki topics: 📱 · Mobile Development 🎮 · Gaming

關於用 Unity Android Facebook SDK 遇到的坑

記錄一下用 Unity 接 Android Facebook SDK 時遇到的各種困難

2023 年 10 月 3 Unity: 2020.3.28f1 MacOS:13.5.2 測試手機:Samsung Galaxy S7 手機 Android 版本: 8.0.0

package com.roger

import android.app.Activity
import android.graphics.BitmapFactory
import android.net.Uri
import com.facebook.share.model.SharePhoto
import com.facebook.share.model.SharePhotoContent
import com.facebook.share.widget.ShareDialog
import java.io.File

class FBPlugin {
    fun shareImage(activity: Activity, imagePath: String) {
        val file = File(Uri.parse(imagePath).path)
        if (!file.exists()) {
            return
        }

        val photo = SharePhoto.Builder().setBitmap(BitmapFactory.decodeFile(imagePath)).build()
        if (photo.bitmap == null) {
            return
        }
        val content = SharePhotoContent.Builder().addPhoto(photo).build()
        val shareDialog = ShareDialog(activity)
        shareDialog.show(content, ShareDialog.Mode.AUTOMATIC)
    }
}

接續上一篇的方法一樣是用 Kotlin,所以在 Unity 怎麼使用的方法這邊就不講了

講解一下參數 activity ,因為我不知道要怎麼直接拿到 activity ,所以只好先從 Unity 拿到後再傳出來,imagePath 就是截圖後儲存的路徑。

var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var unityActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");

UnityActivity 的方法

遇到的問題:

  • strings.xml 的問題:因為 facebook 初始化會需要一些參數如:facebook app id 之類的,需要先把這些參數都先填在 strings.xml,但是 Unity 現在已經不會幫使用者把 strings.xml 複製到 Android 專案了,所以需要靠自己把他複製過去。

我的解決方法是在 PostProcess 直接複製一份過去

using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

public class PostProcessor
{
    [PostProcessBuild(10000)]
    public static void PostProcessAndroid(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget != BuildTarget.Android)
            return;

        copyTextFile("Assets/Data", pathToBuiltProject + "/unityLibrary/src/main/res/values", "strings.xml");
    }

    static void copyTextFile(string orgFilePath, string destFilePaht, string fileName)
    {
        TextAsset file = (TextAsset)AssetDatabase.LoadAssetAtPath(string.Format("{0}/{1}", orgFilePath, fileName), typeof(TextAsset));
        if (file == null)
        {
            return;
        }

        try
        {
            if (!System.IO.Directory.Exists(destFilePaht))
                System.IO.Directory.CreateDirectory(destFilePaht);

            System.IO.File.WriteAllText(destFilePaht + "/" + fileName, file.text);
        }
        catch (System.Exception e)
        {
            Debug.Log(e);
        }
    }
}

複製的路徑我是參考 Export 出來的 Android 專案的路徑

  • gradle 設定

Publish Settings

Publish Settings

AndroidManifest.xml 就是加一些 facebook 需要的資訊,他的官網都有寫,就不多說了

mainTemplate.gradle 只把 facebook-share 加入,其他都沒動

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "com.facebook.android:facebook-share:[16.0.1,17)"
**DEPS**}

baseProjectTemplate.gradle 加入 mavenCentral(),其他沒動

allprojects {
    buildscript {
        repositories {**ARTIFACTORYREPOSITORY**
            google()
            jcenter()
            mavenCentral()
        }
....

gradleTemplate.properties 要加入 android.useAndroidX=true

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

不加的話也 build 不過,他提示會叫你加

  • facebook 後台設定這個一定要上線狀態,不然就算跑 facebook 官方的 sample 都不會有反應!

因為我在這邊卡了好久都沒注意到,所以在這邊提一下。

一定要是上線狀態

一定要是上線狀態

  • 上面貼的 Kotlin Code 裡面有一行,是取得 SharePhoto
//        val photo = SharePhoto.Builder().setImageUrl(Uri.parse(imagePath)).build()
        val photo = SharePhoto.Builder().setBitmap(BitmapFactory.decodeFile(imagePath)).build()

我本來是用註解的那行 setImageUrl,因為我的參數就有一個圖的路徑可以直接拿來用,所以很直覺得就用這個方法,想不到他會拿不到,看了官方的 Sample 發現他是用 setBitmap 這個方法,換了就正常了,這邊也卡了很久,因為他根本不會提示你什麼,就是按下去沒反應而已…

以上就是我遇到的坑,希望以後遇到可以馬上找到答案


메타데이터
post_id
613d26b93c71
slug
關於用-unity-android-facebook-sdk-遇到的坑-613d26b93c71
url
https://medium.com/@yoorogerchang/%E9%97%9C%E6%96%BC%E7%94%A8-unity-android-facebook-sdk-%E9%81%87%E5%88%B0%E7%9A%84%E5%9D%91-613d26b93c71
canonical_url
https://medium.com/@yoorogerchang/%E9%97%9C%E6%96%BC%E7%94%A8-unity-android-facebook-sdk-%E9%81%87%E5%88%B0%E7%9A%84%E5%9D%91-613d26b93c71
author_url
https://medium.com/@yoorogerchang
status
ok
fetched_at
2026-07-20 18:33:08