カメラ機能を無効にする


Android4.0では、カメラ機能を無効にすることができます。
例えば工場や職場のオフィスなどでスマートフォンを使用する場合、カメラで撮影すると情報漏洩に繋がるような現場では、カメラ機能をオフにすることで、情報漏洩を未然に防ぐことができます。

今回は、ボタンを押すとカメラ機能がオフになるサンプルアプリを例に、APIを解説していきます。

図:デバイス管理者権限切り替え画面(左)、サンプルアプリ画面(右)

図:カメラ無効時のカメラアプリ起動時画面

ポイントとしては次の点です。

  • デバイスの管理権限を有効にする
  • セキュリティーポリシーの宣言
  • setCameraDisabledメソッドにてカメラを無効にする

それでは続きをどうぞ

DeviceAdminReceiverを継承したクラスの作成

カメラを無効にするには、デバイスの管理者権限をアクティブにする必要があります。

まずはそのための準備として、DeviceAdminReceiverを継承したクラスを作成します。
DeviceAdminReceiverは、Settingsからデバイスの管理者権限のアクティブ/ディスアクティブを切り替える際にシステム側からインテントで呼び出されます。

LockReciever.java

public class LockReciever extends DeviceAdminReceiver {

	 @Override
	    public void onEnabled(Context context, Intent intent) {
		// 管理者権限をアクティブに切り替えたときに呼ばれる
	    }

	    @Override
	    public void onDisabled(Context context, Intent intent) {
		// 管理者権限をディスアクティブに切り替えたときに呼ばれる
	    }

}

各コールバック関数の中身の実装については、有効/無効の切り替えに合わせて何か処理をする必要がなければ、特に必要がありません。

作成したら、AndroidManifest.xmlファイルに、以下のように登録します。

AndroidManifest.xml

        <receiver android:permission="android.permission.BIND_DEVICE_ADMIN"
        	android:name=".LockReciever">
        	<meta-data android:name="android.app.device_admin"
        		android:resource="@xml/device_admin" />
        	<intent-filter>
        		<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"></action>
        	</intent-filter>
	</receiver>

デバイスの管理者権限切り替えの際のインテントを受け取るためには、 android.permission.BIND_DEVICE_ADMINパーミッションをReceiverに登録しておく必要があります。

セキュリティーポリシーの宣言

デバイスの管理者権限を取得するためには、セキュリティーポリシーの宣言が必要です。
res/xmlフォルダを作成し、以下のようにdevice_admin.xmlファイルを作成します。

device_admin.xml

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

uses-policiesタグ内にdisable-cameraタグを記述します。

DisableCameraActivity.javaファイルにてカメラを無効にする

カメラ機能を無効にするボタンが置かれたActivityを実装します。


図:カメラOFFボタン押下でカメラ機能OFF

ソースコードは以下のようになっています。

DisableCameraActivity.java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // DevicePolicyManagerインスタンス生成
        mDPM = (DevicePolicyManager)getSystemService(this.DEVICE_POLICY_SERVICE);
        mLockReciever = new ComponentName(this, LockReciever.class);

        // デバイス管理者権限を有効にする画面を呼び出す
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
        		mLockReciever);
        startActivityForResult(intent, 1);

        // デバイスの管理者権限の状態(有効/無効)を取得
        mAdminActive = mDPM.isAdminActive(mLockReciever);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				if (mAdminActive) {
				       // デバイスの管理者権限がアクティブの場合はカメラ無効
					mDPM.setCameraDisabled(mLockReciever, true);
				}
			}
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 1:
                if (resultCode == Activity.RESULT_OK) {
                    Log.i("DeviceAdminSample", "Administration enabled!");
                } else {
                    Log.i("DeviceAdminSample", "Administration enable FAILED!");
                }
                return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

7行目〜14行目は、デバイスの管理者権限取得に関する処理です。
8行目では、DeviceAdminReceiverクラスを継承したDeviceAdminReceiverクラスのインスタンスを生成しています。
カメラを無効にするには、新しく追加されたsetCameraDisabledメソッドを利用します(25行目)。
DevicePolicyManagerクラスのインスタンスに対してsetCameraDisabledメソッドを利用することで、カメラの有効/無効を切り替えます。

表:setCameraDisabledメソッドの引数

引数概要
第1引数DeviceAdminReceiverを継承したクラスのインスタンス
第2引数カメラ機能の有効(true)/無効(false)フラグ

以上で実装は完了です。

カメラ無効時にカメラを起動すると、以下のようにエラーメッセージが表示されてカメラが使用できなくなっているのが確認できます。

図:カメラ無効時のカメラ起動時画面