Unity 实现Android不锁屏

来源:互联网 发布:火石软件招聘 编辑:程序博客网 时间:2024/05/16 12:19

本文来自: http://stackoverflow.com/questions/19846822/unity3d-android-lockscreen-not-shown-when-screen-times-out-wakelock

我建一个 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
    }  





0 0
原创粉丝点击