簡體   English   中英

將我的 android 活動與主要的 unity3D 活動分開運行

[英]Run my android activity separate to the main unity3D activity

我正在為客戶開發一個應用程序並擴展統一播放器活動以幫助我完成一些 android 特定任務。

我這樣做是為了捕獲startActivityForResult調用的結果,這樣我就可以從我的活動返回到 Unity。

我想要一些建議的是我如何改變它,這樣它就不會與我的擴展 Unity 播放器活動混合,但它是它自己的活動仍然捕獲結果並在完成后將用戶返回到主 Unity 活動。

我希望不必隱藏統一性,而是在活動堆棧上有一個新活動。 我只是不確定我應該怎么做 go 或者我的思考過程是否正確(如果我錯了請糾正我)

這是我目前可以運行的代碼,但在執行我的任務時將 Unity 最小化:

public class MyActivity extends UnityPlayerActivity
{
    private static final String MyTag = "######";
    private static final int INSTALL_CODE = 100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(MyTag, "onCreate() -------------------------");
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.i(MyTag, "onActivityResult() -------------------------"  + requestCode + " --- " + resultCode);
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == INSTALL_CODE)
        {
            // installed!
            if (resultCode == -1)
                UnityPlayer.UnitySendMessage("Canvas_CloudDeploy", "AndroidAPKInstallCallback", "true");
            else
                UnityPlayer.UnitySendMessage("Canvas_CloudDeploy", "AndroidAPKInstallCallback", "false");
        }
    }
 
    @Override protected void onStop()
    {
        Log.i(MyTag, "onStop() -------------------------");
        super.onStop();
    }
 
    // Quit Unity
    @Override protected void onDestroy ()
    {
        Log.i(MyTag, "onDestroy() -------------------------");
        super.onDestroy();
    }
 
    // Pause Unity
    @Override protected void onPause()
    {
        Log.i(MyTag, "onPause() -------------------------");
        super.onPause();
    }
 
    // Resume Unity
    @Override protected void onResume()
    {
        Log.i(MyTag, "onResume() -------------------------");
        super.onResume();
    }
}

統一調用代碼:

using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
using AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
using AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");

string packageName = unityContext.Call<string>("getPackageName");
string authority = packageName + ".provider";

AndroidJavaClass intentClass = new AndroidJavaClass ("android.content.Intent");
string ACTION_VIEW = intentClass.GetStatic<string>("ACTION_VIEW");
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);

int FLAG_GRANT_READ_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");
int FLAG_GRANT_WRITE_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_WRITE_URI_PERMISSION");
string EXTRA_RETURN_RESULT = intentClass.GetStatic<string>("EXTRA_RETURN_RESULT");
int FLAG_ACTIVITY_CLEAR_TASK = intentClass.GetStatic<int>("FLAG_ACTIVITY_CLEAR_TASK");

using AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
using AndroidJavaClass fileProvider = new AndroidJavaClass("androidx.core.content.FileProvider");

object[] providerParams = new object[3];
providerParams[0] = unityContext;
providerParams[1] = authority;
providerParams[2] = fileObj;

using AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", providerParams);

intentObject.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
intentObject.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_CLEAR_TASK );
intentObject.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
intentObject.Call<AndroidJavaObject>("putExtra", EXTRA_RETURN_RESULT, true);
currentActivity.Call("startActivityForResult", intentObject, 100);

我的 android 清單:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools">
  <application android:requestLegacyExternalStorage="true">
    <activity android:name="net.****.****.MyActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="landscape" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
  </application>
  <uses-feature android:glEsVersion="0x00030000" />
  <uses-feature android:name="android.hardware.vulkan.version" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
  <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
  <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
</manifest>

總結一下我的問題是:

  • 當我的活動運行時,由於我在 Unity 中調用它們的方式,Unity 總是停止,然后恢復。 它可以只是一個新的 android 活動在 Unity 活動之上運行嗎?
  • 如果是這樣,那么正確的方法是什么。 我相信我需要從上面的擴展統一 class 調用我的活動,並將統一上下文傳遞給它,所以它知道如何在完成后返回。 但是-我不確定。 很多半個例子可以嘗試拼湊起來。
  • 我需要我的活動在完成后回調到主要的統一活動中。 它將需要發回活動結果,然后恢復統一活動。 我在上面這樣做,但希望在單獨的活動 class 中這樣做。
  • 如果我使用FLAG_ACTIVITY_NEW_TASK我幾乎得到我喜歡的行為(在我的頂部顯示 android 活動), 但是在請求活動結果時你不能使用該標志並且它不會按預期工作。

根據以上信息,嘗試使用FLAG_ACTIVITY_NEW_DOCUMENT啟動一個活動作為現有任務的新根,允許用戶在完成時導航回上一個任務。 FLAG_ACTIVITY_NEW_TASK不同,它不會清除現有任務。

請務必注意,僅當活動是任務的主要入口點(在您的情況下)並且任務堆棧中沒有任何入口點祖先時,才應使用此標志。

using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
using AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
using AndroidJavaObject unityContext = currentActivity.Call<AndroidJavaObject>("getApplicationContext");

string packageName = unityContext.Call<string>("getPackageName");
string authority = packageName + ".provider";

AndroidJavaClass intentClass = new AndroidJavaClass ("android.content.Intent");
string ACTION_VIEW = intentClass.GetStatic<string>("ACTION_VIEW");
AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent", ACTION_VIEW);

int FLAG_GRANT_READ_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_READ_URI_PERMISSION");
int FLAG_GRANT_WRITE_URI_PERMISSION = intentClass.GetStatic<int>("FLAG_GRANT_WRITE_URI_PERMISSION");
int FLAG_ACTIVITY_NEW_DOCUMENT = intentClass.GetStatic<int>("FLAG_ACTIVITY_NEW_DOCUMENT");

using AndroidJavaObject fileObj = new AndroidJavaObject("java.io.File", apkPath);
using AndroidJavaClass fileProvider = new AndroidJavaClass("androidx.core.content.FileProvider");

object[] providerParams = new object[3];
providerParams[0] = unityContext;
providerParams[1] = authority;
providerParams[2] = fileObj;

using AndroidJavaObject uri = fileProvider.CallStatic<AndroidJavaObject>("getUriForFile", providerParams);

intentObject.Call<AndroidJavaObject>("setDataAndType", uri, "application/vnd.android.package-archive");
intentObject.Call<AndroidJavaObject>("addFlags", FLAG_ACTIVITY_NEW_DOCUMENT );
intentObject.Call<AndroidJavaObject>("addFlags", FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
currentActivity.Call("startActivityForResult", intentObject, INSTALL_CODE);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM