Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android開発】プログラムでデバイスの画面のオン・オフを切り替える方法

はじめに

このチュートリアルでは、DevicePolicyManagerDeviceAdminReceiverを活用して、Androidアプリからデバイスの画面をオン・オフ(ロック)する方法を解説します。通常、画面のロックはユーザーが電源ボタンで操作しますが、デバイス管理者権限(Device Admin)を利用することで、アプリ側から意図的に画面をロックできるようになります。

全体の流れとしては、以下の手順で実装を進めます。

  • デバイス管理者権限の有効化・無効化を行うボタンを配置したレイアウトを作成
  • デバイス管理者ポリシー(force-lock)を定義したXMLを追加
  • DeviceAdminReceiverを継承したクラスを実装
  • MainActivityで権限の管理と画面ロック処理を記述
  • AndroidManifest.xmlにreceiverを登録

ステップ1:プロジェクトの作成

まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。

ステップ2:レイアウトファイル(activity_main.xml)の編集

res/layout/activity_main.xml に以下のコードを追加します。「Enable(有効化)」ボタンと「Lock(ロック)」ボタンを横並びに配置したシンプルな構成です。

<? xml version= "1.0" encoding= "utf-8" ?>
<RelativeLayout xmlns: android = "https://schemas.android.com/apk/res/android"
   xmlns: tools = "https://schemas.android.com/tools"
   android :layout_width= "match_parent"
   android :layout_height= "match_parent"
   android :layout_margin= "16dp"
   tools :context= ".MainActivity" >
   <LinearLayout
      android :layout_width= "match_parent"
      android :layout_height= "wrap_content"
      android :layout_centerInParent= "true"
      android :orientation= "horizontal" >
      <Button
         android :id= "@+id/btnEnable"
         android :layout_width= "0dp"
         android :layout_height= "wrap_content"
         android :layout_weight= "1"
         android :onClick= "enablePhone"
         android :text= "Enable" />
      <Button
         android :id= "@+id/btnLock"
         android :layout_width= "0dp"
         android :layout_height= "wrap_content"
         android :layout_weight= "1"
         android :onClick= "lockPhone"
         android :text= "Lock" />
   </LinearLayout>
</RelativeLayout>

ステップ3:デバイス管理者ポリシー(policies.xml)の定義

次に、res/xml/policies.xml を作成し、以下のコードを記述します。ここでは画面を強制的にロックするための「force-lock」ポリシーを宣言しています。

<? xml version= "1.0" encoding= "utf-8" ?>
<device-admin xmlns: android = "https://schemas.android.com/apk/res/android" >
   <uses-policies>
      <force-lock />
   </uses-policies>
</device-admin>

ステップ4:DeviceAdminクラスの作成

src フォルダに DeviceAdmin クラスを作成し、以下のコードを追加します。DeviceAdminReceiver を継承し、管理者権限が有効化・無効化されたタイミングでトーストを表示するだけのシンプルな実装です。

package app.tutorialspoint.com.sample ;
import android.app.admin.DeviceAdminReceiver ;
import android.content.Context ;
import android.content.Intent ;
import android.widget.Toast ;
public class DeviceAdmin extends DeviceAdminReceiver {
   @Override
   public void onEnabled (Context context , Intent intent) {
      super .onEnabled(context , intent) ;
      Toast. makeText (context , "Enabled" , Toast. LENGTH_SHORT ).show() ;
   }
   @Override
   public void onDisabled (Context context , Intent intent) {
      super .onDisabled(context , intent) ;
      Toast. makeText (context , "Disabled" , Toast. LENGTH_SHORT ).show() ;
   }
}

ステップ5:MainActivityの実装

src/MainActivity に以下のコードを追加します。このクラスが本チュートリアルの中核となる部分です。

主な処理内容は以下の通りです。

  • onCreate():DevicePolicyManager のインスタンスを取得し、すでに管理者権限が有効かどうかを isAdminActive() で判定。状態に応じてボタンの表示を切り替えます。
  • enablePhone():権限が無効な場合は ACTION_ADD_DEVICE_ADMIN インテントを発行して、システムの権限許可画面を起動します。有効な場合は removeActiveAdmin() で権限を解除します。
  • lockPhone():lockNow() を呼び出すことで、即座に画面をロック(画面オフ)します。
  • onActivityResult():権限リクエストの結果を受け取り、成功時はUIを更新、失敗時はトーストで通知します。
package app.tutorialspoint.com.sample ;
import android.app.Activity ;
import android.app.admin.DevicePolicyManager ;
import android.content.ComponentName ;
import android.content.Context ;
import android.content.Intent ;
import android.support.annotation. Nullable ;
import android.support.v7.app.AppCompatActivity ;
import android.os.Bundle ;
import android.view.View ;
import android.widget.Button ;
import android.widget.Toast ;
public class MainActivity extends AppCompatActivity {
   static final int RESULT_ENABLE = 1 ;
   DevicePolicyManager deviceManger ;
   ComponentName compName ;
   Button btnEnable , btnLock ;
   @Override
   protected void onCreate (Bundle savedInstanceState) {
      super .onCreate(savedInstanceState) ;
      setContentView(R.layout. activity_main ) ;
      btnEnable = findViewById(R.id. btnEnable ) ;
      btnLock = findViewById(R.id. btnLock ) ;
      deviceManger = (DevicePolicyManager)
      getSystemService(Context. DEVICE_POLICY_SERVICE ) ;
      compName = new ComponentName( this, DeviceAdmin. class ) ;
      boolean active = deviceManger .isAdminActive( compName ) ;
      if (active) {
         btnEnable .setText( "Disable" ) ;
         btnLock .setVisibility(View. VISIBLE ) ;
      } else {
         btnEnable .setText( "Enable" ) ;
         btnLock .setVisibility(View. GONE ) ;
      }
   }
   public void enablePhone (View view) {
      boolean active = deviceManger .isAdminActive( compName ) ;
      if (active) {
         deviceManger .removeActiveAdmin( compName ) ;
         btnEnable .setText( "Enable" ) ;
         btnLock .setVisibility(View. GONE ) ;
      } else {
         Intent intent = new Intent(DevicePolicyManager. ACTION_ADD_DEVICE_ADMIN ) ;
         intent.putExtra(DevicePolicyManager. EXTRA_DEVICE_ADMIN , compName ) ;
         intent.putExtra(DevicePolicyManager. EXTRA_ADD_EXPLANATION , "You should enable the app!" ) ;
         startActivityForResult(intent , RESULT_ENABLE ) ;
      }
   }
   public void lockPhone (View view) {
      deviceManger .lockNow() ;
   }
   @Override
   protected void onActivityResult ( int requestCode , int resultCode , @Nullable Intent
   data) {
      super .onActivityResult(requestCode , resultCode , data) ;
      switch (requestCode) {
         case RESULT_ENABLE :
            if (resultCode == Activity. RESULT_OK ) {
               btnEnable .setText( "Disable" ) ;
               btnLock .setVisibility(View. VISIBLE ) ;
            } else {
               Toast. makeText (getApplicationContext() , "Failed!" ,
               Toast. LENGTH_SHORT ).show() ;
            }
         return;
      }
   }
}

ステップ6:AndroidManifest.xmlの編集

最後に、androidManifest.xml に以下のコードを追加します。ポイントは、DeviceAdmin クラスを receiver として登録し、「BIND_DEVICE_ADMIN」パーミッションを付与することです。また、meta-data でステップ3で作成した policies.xml を参照させています。

<? xml version= "1.0" encoding= "utf-8" ?>
<manifest xmlns: android = "https://schemas.android.com/apk/res/android"
   package= "app.tutorialspoint.com.sample" >
   <uses-permission android :name= "android.permission.CALL_PHONE" />
   <application
      android :allowBackup= "true"
      android :icon= "@mipmap/ic_launcher"
      android :label= "@string/app_name"
      android :roundIcon= "@mipmap/ic_launcher_round"
      android :supportsRtl= "true"
      android :theme= "@style/AppTheme" >
      <activity android :name= ".MainActivity" >
         <intent-filter>
            <action android :name= "android.intent.action.MAIN" />
            <category android :name= "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
      <receiver
         android :name= ".DeviceAdmin"
         android :description= "@string/app_description"
         android :label= "@string/app_name"
         android :permission= "android.permission.BIND_DEVICE_ADMIN" >
         <meta-data
            android :name= "android.app.device_admin"
            android :resource= "@xml/policies" />
         <intent-filter>
            <action android :name= "android.app.action.DEVICE_ADMIN_ENABLED" />
         </intent-filter>
      </receiver>
   </application>
</manifest>

アプリの実行と動作確認

それでは、実際にアプリを実行してみましょう。実機のAndroidスマートフォンをPCに接続していることを前提としています。Android Studioから任意のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。接続中のモバイルデバイスを選択すると、実機にアプリがインストールされ、以下のような初期画面が表示されます。

【Android開発】プログラムでデバイスの画面のオン・オフを切り替える方法

初回起動時は「Enable」ボタンのみが表示されています。このボタンをタップするとシステムのデバイス管理者許可画面が開くので、許可すると「Lock」ボタンが表示されます。「Lock」をタップすれば、即座に画面がロックされて画面がオフになります。

まとめ

今回は、DevicePolicyManager と DeviceAdminReceiver を組み合わせることで、アプリからAndroidデバイスの画面をロック(画面オフ)する方法を紹介しました。リモートワイプやキオスク端末向けアプリなど、デバイス管理系の機能を実装する際の基礎として活用できます。なお、デバイス管理者APIはAndroid 13以降では非推奨になりつつあるため、最新の環境では WorkManager や Device Policy Manager(企業向け)への移行も検討するとよいでしょう。

  1. Androidで「OK Google」をオン・オフ切り替えする方法【音声認識とアシスタント設定】

    グーグルアシスタントは、スマートフォンに手を触れずに操作できるとても便利なツールです。しかし、音声起動機能が周囲の会話まで拾ってしまい、こちらが話している最中に不要な通知や検索結果が割り込んでくることがあります。さらに、「自分の話す内容をGoogleに常時聞かれ、記録されている」という点に不安を感じるユーザーも少なくありません。こうした悩みを解消するために、この記事では「OK Google」やグーグルアシスタントをオン・オフする具体的な手順を解説します。「OK Google」音声認識をオンにする方法まず、Android端末で「設定」アプリを開きましょう。設定メニューには、端末をカスタマイズする

  2. Androidで「OK Google」をオフにする3つの方法【Googleアシスタント無効化ガイド】

    Googleアシスタントは、AI技術によって私たちのスマートフォンでの検索や操作体験を大きく便利にしてくれます。お気に入りの音楽を再生したり、ちょっとした疑問に答えたり、退屈なときには話しかけて楽しませてくれることもあります。 しかし、ときどき「OK Google」というトリガーワードに反応して、アシスタントが突然起動することがあります。この機能が煩わしく感じられ、「OK Google」をオフにしたいと思ったことはありませんか?同じ悩みを抱えている方のために、本記事ではGoogleアシスタントを完全に無効化する方法を詳しく解説します。最後まで読めば、問題を解決するためのさまざまなテクニックが身