Unity3d Android Lockscreen은 화면이 시간이 흐르면 ​​표시되지 않습니다. (Wakelock?)

StackOverflow https://stackoverflow.com/questions/19846822

문제

나는 Unity를 사용하여 Android 앱을 구축하고 있으며 매우 잘 어울리고 있습니다. 그러나 화면 타이밍과 관련된 이상한 문제가 있고 잠금 화면이 표시되지 않습니다.

무슨 일이 있어야합니다

  • 사용자는 재생을 중지합니다
  • 스크린 타임이 꺼져 꺼집니다
  • 나중에 플레이어는 돌아와서 휴대 전화를 다시 켭니다.
  • 잠금 화면 쇼, 사용자는 비밀번호를 입력하거나 휴대 전화 잠금을 해제 할 수 있습니다.
  • 앱은 초점을 되찾고 계속합니다

무슨 일이 일어나고 있는지

  • 사용자는 재생을 중지합니다
  • 스크린 타임이 꺼져 꺼집니다
  • 나중에 플레이어는 돌아와서 휴대 전화를 다시 켭니다.
  • 잠금 화면 아니다 보여 주다! 앱은 잠금 화면을 모두 우회하여 초점을 맞추고 있습니다.
  • 사용자는 자신의 보안이 손상되었다는 사실에 화를냅니다.

메모

  • Android 플러그인을 사용하는지 여부에 관계없이 이것은 발생합니다.
  • Unity 4.2.0f4를 사용하고 있습니다 (최근 버전의 Changelogs는이 문제에 대해 아무것도 가지고 있지 않지만)
  • 빈 안드로이드 프로젝트에서도 발생합니다
  • 5 개의 다른 장치에서 이것을 테스트했는데 모두 같은 문제가 있습니다.

나는 이것이 화면이 꺼질 때 Unity가 포기하지 않는 Wakelock에 의해 야기된다고 생각합니다. 이로 인해 앱이 초점을 맞추고 잠금 화면이 '로드'되지 않습니다. 이것은 꽤 심각한 문제입니다.

누구 든지이 문제를 해결하는 방법을 알고 있습니까?

참고 : 이미 물었습니다 Unity에 대한이 질문 일주일 전에는 아직 응답을 얻지 못했습니다. 나는 여기서 더 나은 행운을 누릴 것이라고 생각했다.

도움이 되었습니까?

해결책

먼저 감사합니다 Michaeltaylor3d의 답변 나를 올바른 방향으로 가리키기 위해.

그가 수정했다고 생각하는 문제를 해결하는 방식에는 몇 가지 문제가있었습니다.

첫 번째 문제는 다음과 같습니다 KeyguardManager 화면 잠금에 대한 접근. 이것은 API 버전 8에서 감가 상각되었으며 API 9+에서는 작동하지 않습니다. 새로운 솔루션은 장치 관리자 API를 사용하여 게임에 매우 방해가됩니다.

Eclipse의 UnityPlayer 정의를 살펴보고 Setwakelock (부울)이라는 기능을 찾았지만 비공개입니다.

맞춤형 안드로이드 활동을했습니다. 그것에서 보호 된 UnityPlayer 기능에 액세스합니다 setWakeLock(boolean) 그리고 그것을 onPause 기능.

나는 이것이 이상적이지 않다는 것을 인정하지만 부작용이없는 것으로 보인다. 버그 보고서를 Unity에 제출 했으므로이 작업이 오랫동안 필요하지 않기를 바랍니다.

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 Interop도 필요하지 않습니다.

다시 말하지만, 이것은 일종의 해킹 솔루션이라는 것을 알고 있지만 부작용이없는 API 레벨에 관계없이 여러 장치에서 작동하는 것 같습니다. 바라건대 이것은 곧 Unity에 의해 고정되어 더 이상 추악한 수정이 필요하지 않을 것입니다.

다른 팁

나는 Unity의 경험이 없지만 이것을 사용해보십시오. http://developer.android.com/reference/android/os/powermanager.wakelock.html

Unity가 Wakelock을 어떻게 든 isheld ()로 강요하는지 확인하기 위해; 그리고 당신의 활동 내에서 그것을 무시하십시오

편집 : 다운로드 할 때 wakelock을 사용하고 있는데, 이것은 화면을 검은 색으로 만들지 만 장치를 잠그지 않으므로 아마도 해당되는 경우에 해당하는 경우에는 어떤 종류의 충돌이 발생할 수 있지만 항상 시도해 볼 가치가 있습니다.

이것은 테스트되지 않았지만 이것을 시도 할 수 있습니다.

기본적으로 Android SDK에 직접 액세스하려고 시도하려고합니다. Unity에는이를 수행 할 수있는 몇 가지 클래스가 있습니다.

외부 Java 클래스를 작성하여 플러그인/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();  
    }
}

또한 Unity가 기본 대신이 활동을로드하고 Plugins Android 폴더에 넣을 수 있도록 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>

그런 다음 외부 Java 클래스를 호출하는 Unity C# 스크립트를 만듭니다. 여기에 참조되었습니다

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();
}

다음 깃발이 거짓으로 설정되어 있는지 확인해야합니다.

Application.runInBackground = false;

장치가 꺼지면 일시 정지 이벤트가 트리거되지 않을 것이라고 생각합니다. (이것은 기본적으로 꺼져 있습니다)

이것이 주변의 작업이더라도, 나는 이것이 여전히 통일 버그라고 생각합니다. 그들에게보고.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top