5

Unity を使用して Android アプリを作成していますが、非常にうまくいっています。ただし、画面のタイムアウトとロック画面が表示されないという奇妙な問題があります。

何が起こるべきか

  • ユーザーがプレイを停止
  • 画面がタイムアウトしてオフになる
  • その後、プレーヤーが戻ってきて、電話の電源を入れ直します
  • ロック画面が表示され、ユーザーはパスワードを入力するか、電話のロックを解除できます
  • アプリはフォーカスを取り戻し、続行します

何が起こっている

  • ユーザーがプレイを停止
  • 画面がタイムアウトしてオフになる
  • その後、プレーヤーが戻ってきて、電話の電源を入れ直します
  • ロック画面が表示されない!アプリはフォーカスされており、ロック画面をすべてバイパスします
  • ユーザーは、セキュリティが侵害されたことに腹を立てます:(

ノート

  • これは、Android プラグインを使用しているかどうかに関係なく発生します
  • Unity 4.2.0f4 を使用しています (最近のバージョンの変更ログにはこの問題について何もありません)。
  • 空の Android プロジェクトでも発生します
  • これを5つの異なるデバイスでテストしましたが、すべて同じ問題があります

これは、画面がタイムアウトしたときに Unity があきらめないウェイクロックが原因であると思われます。これにより、アプリがフォーカスを保持し、ロック画面が「ロード」されなくなります。これはかなり深刻な問題です。

これを修正する方法を知っている人はいますか?

注: 1週間ほど前に Unity Answers でこの質問をしましたが、まだ回答がありません。ここで運が良かったのかなと思いました。

4

3 に答える 3

0

Unity の経験はありませんが、これを使用してみてくださいhttp://developer.android.com/reference/android/os/PowerManager.WakeLock.html

ユニティが isHeld(); を使用して何らかの方法でウェイクロックを強制しているかどうかを確認するには。アクティビティ内でオーバーライドしてみてください

編集:ダウンロード時にウェイクロックを使用していますが、これにより画面が黒くなりますが、デバイスはロックされません。おそらくこれが原因です。解放してみてください。これにより、何らかの競合が発生する可能性がありますが、常に試してみる価値があります。

于 2013-11-11T12:02:45.407 に答える
0

これはテストされていませんが、これを試すことができます。

基本的に、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 マニフェスト ファイルにあることを確認して、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>

次に、外部 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

}

最後に、アクティブな単一動作で、アプリケーションの一時停止イベントでロック画面を呼び出します:ここで参照

void OnApplicationPause(bool pauseStatus)
{
     InvokeAndroidLockScreen();
}

次のフラグが false に設定されていることを確認する必要があります

Application.runInBackground = false;

そうしないと、デバイスの電源がオフになったときに一時停止イベントがトリガーされないと思います。(デフォルトではオフになっています)

これが回避策であるとしても、これは Unity のバグであり、彼らに報告する必要があると思います。

于 2013-11-11T15:00:12.693 に答える