關於用 Unity Android Facebook SDK 遇到的坑

張又壬
7 min readOct 3, 2023

--

記錄一下用 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

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 這個方法,換了就正常了,這邊也卡了很久,因為他根本不會提示你什麼,就是按下去沒反應而已…

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

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

張又壬
張又壬

Written by 張又壬

目前正在努力學習 swift

No responses yet

Write a response