[英]Native Android Activity and with touchevents in Java required using 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>
总结一下我的问题是:
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.