我建一个 android 应用程序使用统一,它是很好。但是,我遇到一个奇怪问题有关屏幕超时和锁屏界面不显示。
应发生什么情况
- 用户停止播放
- 屏幕时间出去和曲折关闭
- 以后,玩家返回并重新打开他们的电话
- 锁屏界面显示,用户可以输入他们的密码,或否则解除锁定他们的电话
- 应用程序重新获得焦点并继续
发生了什么事情
- 用户停止播放
- 屏幕时间出去和曲折关闭
- 以后,玩家返回并重新打开他们的电话
- 锁屏界面并不显示 !这款应用程序是正确的焦点,都放在一起绕过锁屏界面
- 用户生气其安全性:(
备注
- 发生这种情况无论我使用 Android 插件
- 我使用的统一 4.2.0f4 (虽然为较新版本的改动) 有没有什么关于这一问题)
- 它甚至发生在一个空白的 Android 项目
- 5 不同的设备上测试过此,都有同样的问题
我怀疑这造成的团结不会放弃当屏幕超时 wakelock。这会导致应用程序持有的重点和锁屏界面从来没有获取 ' 加载 '。这是一个很严重的问题。
有谁知道的任何方式来解决此问题吗?
注: 我已经问过这个问题上统一的答案有点在一周前,还没有收到任何答复。我想也许我会有好运在这里。
解决方法 1:
我首先要感谢MichaelTaylor3D 的回答说我指向正确的方向。
有几个问题与他解决的问题,我觉得我已经更正的方法:
第一个问题是与 KeyguardManager
到锁定屏幕的方法。这贬值 API 版本 8 中,API 9+ 不会工作。新的解决方案使用设备管理 API 这似乎非常侵入性的游戏。
我通过 eclipse 中的 UnityPlayer 定义看,发现一个功能称为 setWakeLock(boolean),然而它是私有。
我做了一个自定义的 android 活动。在这,我访问受保护的 UnityPlayer 函数 setWakeLock(boolean)
和调用它 onPause
函数。
我承认这是不甚理想,但它似乎没有副作用的工作。我已经提交到统一的 bug 报告,所以希望这项工作大约不会要求为长。
public class UnityPlayerWithLockscreen extends UnityPlayerNativeActivity {
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
//Provides access to the private UnityPlayer.setWakeLock(boolean) method.
public void setWakeLock(boolean useWakelock) {
Method setWakeLockMethod;
//Use Reflection to get the setWakeLock(boolean) method from the UnityPlayer class
setWakeLockMethod = mUnityPlayer.getClass().getDeclaredMethod("setWakeLock");
//Set the method to me accessible
setWakeLockMethod.setAccessible(true);
//Invoke the method with our argument
setWakeLockMethod.invoke(mUnityPlayer, useWakelock);
}
@Override
protected void onPause()
{
super.onPause();
//Force unity to release the wakelock
setWakeLock(false);
}
}
然后您需要在 AndroidManifest 文件中设置这项活动作为主要活动:
<?xml version="1.0" encoding="utf-8"?>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".UnityPlayerWithLockscreen"
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>
此解决方案还不需要任何 C# 脚本或 C# <-> Java 互操作。
再次,我知道这是种一个出租司机的解决方案,但它似乎没有副作用 API 级别无关的几个设备上的工作。但愿这很快获取固定的统一,将不再需要丑陋的修复程序。
另外一篇文章:
手机不锁屏功能使用Android编辑器ADT其实是很容易实现的,但是Unity并没有提供现成的接口,但是可以调用Android接口,来辅助实现这个不锁屏的功能。
修改AndroidManifest.xml文件,添加<uses-permission android:name=“android.permission.WAKE_LOCK” />
01 | package com.test; |
02 | |
03 | import android.os.Bundle; |
04 | import android.view.WindowManager; |
05 | |
06 | import com.unity3d.player.UnityPlayerActivity; |
07 | |
08 | public class MainActivity extends UnityPlayerActivity { |
09 | |
10 | |
11 | @Override |
12 | protected void onCreate(Bundle savedInstanceState) { |
13 | super.onCreate(savedInstanceState); |
14 | |
15 | //不锁屏 |
16 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
17 | } |
18 | } |