記錄一下用 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");
在 Unity
拿 Activity
的方法
遇到的問題:
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
設定

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
這個方法,換了就正常了,這邊也卡了很久,因為他根本不會提示你什麼,就是按下去沒反應而已…
以上就是我遇到的坑,希望以後遇到可以馬上找到答案