「.NET for Androidでディスプレイをスリープさせない」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
|||
| (2人の利用者による、間の10版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
無操作でもディスプレイをスリープさせたくない場面も多い。 | 無操作でもディスプレイをスリープさせたくない場面も多い。 | ||
たとえば[[MonoGame]]で作る[[Android]]向けの[[ゲーム]]などである。 | たとえば[[MonoGame]]で作る[[Android]]向けの[[ゲーム]]などである。 | ||
== 環境 == | |||
* Xamarin.Android | |||
* .NET for Android | |||
Xamarin.Androidの頃から変わっていない。 | |||
== 解決策:KeepScreenOn == | == 解決策:KeepScreenOn == | ||
アクティビティに「WindowManagerFlags. | アクティビティに「WindowManagerFlags.KeepScreenOn」というフラグを設定すると一時的にディスプレイのスリープを抑制できます。この方法は | ||
<source lang= | * 権限が不要であり | ||
protected override void OnCreate(Bundle bundle) | * アクティビティが遷移する際に自動的に解除されます | ||
<source lang=csharp> | |||
public class MainActivity : Activity | |||
{ | |||
protected override void OnCreate(Bundle? savedInstanceState) | |||
{ | |||
base.OnCreate(savedInstanceState); | |||
// 画面をオフにしない。 | |||
this.Window!.AddFlags(Android.Views.WindowManagerFlags.KeepScreenOn); | |||
} | |||
} | |||
</source> | |||
[[MonoGame]]でもこの方法は有効です。 | |||
<source lang=csharp> | |||
public class Activity1 : AndroidGameActivity | |||
{ | |||
protected override void OnCreate(Bundle bundle) | |||
{ | |||
base.OnCreate(bundle); | |||
// ディスプレイをスリープさせない | |||
this.Window.AddFlags(WindowManagerFlags.KeepScreenOn); | |||
} | |||
} | |||
</source> | </source> | ||
== 解決策:wakelock == | == 解決策:wakelock == | ||
WakeLockを使う方法は、権限が必要であり、ひとたびディスプレイのスリープを抑制するとアクティビティが遷移しようが何をしようが明示的に解除しない限り延々とスリープが抑制されます。 | |||
== | 当然のように素人にはオススメできない代物です。 | ||
; 必要な権限 | |||
* <uses-permission android:name="android.permission.WAKE_LOCK" /> | |||
; 大雑把なソース | |||
どうしても使いたい場合はWakeLock利用中のあらゆる暴走をtry/catchして確実にReleaseしてください。 | |||
[[メモリ不足]]などの「アプリ外の影響」「[[OS]]の暴走」も想定しましょう。 | |||
<source lang=csharp> | |||
PowerManager? _powerManager; | |||
PowerManager.WakeLock? _wakelock; | |||
void Initialize() | |||
{ | |||
_powerManager = GetSystemService(Context.PowerService) as PowerManager; | |||
_wakelock = _powerManager?.NewWakeLock(WakeLockFlags.Full, "tag")!; | |||
} | |||
void Start() | |||
{ | |||
if (_wakelock != null) | |||
{ | |||
_wakelock.Acquire(); | |||
} | |||
} | |||
= | void Stop() | ||
{ | { | ||
if (_wakelock != null && _wakelock.IsHeld) | |||
{ | |||
_wakelock.Release(); | |||
} | |||
} | |||
{{ | void Release() | ||
{ | |||
if (_wakelock != null) | |||
{ | |||
if (_wakelock.IsHeld) | |||
{ | |||
_wakelock.Release(); | |||
} | |||
_wakelock.Dispose(); | |||
_wakelock = null; | |||
} | |||
} | |||
</source> | |||
== 関連項目 == | |||
* [[Xamarin.Androidで画面の向きを固定する]] | |||
[[category: | [[category: .NET for Android]] | ||
[[category:MonoGame]] | [[category: MonoGame]] | ||