这是未经测试的,但你可以试试这个方法,
基本上,你想要尝试直接访问Android SDK,Unity有一些类可以让你做到这一点。
试着编写一个外部Java类并将其放置在Plugins/Android文件夹中。
Java类的方法可能类似于这样: 参考此问题
确保它 编译成 .jar 文件
package com.yourcompany.yourgamename;
import com.unity3d.player.UnityPlayerActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.app.Activity;
public class MainActivity extends UnityPlayerActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
public static void lockScreen()
{
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE);
KeyguardLock lock = keyguardManager.newKeyguardLock(KEYGUARD_SERVICE);
lock.reenableKeyguard();
}
}
同时确保将此代码添加到 Android Manifest 文件中,以便 Unity 加载此活动而不是主要活动,并将其放置在 \Plugins\Android 文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
然后创建一个Unity C#脚本,调用外部的Java类:
在这里引用
public static void InvokeAndroidLockScreen()
{
#if UNITY_ANDROID
using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
obj_Activity .CallStatic("lockScreen");
}
}
#else
Debug.LogWarning("Cant invoke lockscreen on a non Android Device");
#endif
}
最后,在一个活动的MonoBehavior中,在应用程序暂停事件上调用锁屏:在这里引用
void OnApplicationPause(bool pauseStatus)
{
InvokeAndroidLockScreen();
}
您需要确保以下标志设置为false
Application.runInBackground = false
我认为否则当设备关闭时暂停事件将不会被触发。(默认情况下关闭)
即使这是一个解决方法,我仍然认为这是一个Unity Bug,应该向他们报告。