Mematikan Kamera Pada Perangkat Android Dengan Device Administrator API


Walaupun Android adalah turunan dari sistem dari Linux, pengguna biasanya tidak memiliki akses ke user root seperti di Linux. Hal ini dilakukan demi alasan keamanan. Sebagai alternatifnya, aplikasi dapat menggunakan Device Administration API untuk memiliki kemampuan yang lebih spesial dibandingkan aplikasi lainnya. Bila sebuah aplikasi didaftarkan sebagai device administrator, aplikasi tersebut akan memiliki kemampuan untuk mengatur policy pada perangkat. Salah satu policy yang boleh diatur oleh device administrator adalah mematikan fasilitas kamera (tersedia sejak Android 4.0).

Sebagai latihan, saya akan membuat aplikasi yang dapat mematikan atau mengaktifkan kamera di perangkat Android. Saya akan mulai dengan sebuah proyek baru di Android Studio. Sebuah aplikasi device administrator harus memiliki sebuah class yang diturunkan dari DeviceAdminReceiver. Sebagai latihan, saya membuat implementasi tersebut seperti pada kode program berikut ini:

public class MyCameraDeviceAdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        Toast.makeText(context, "MyCameraDeviceAdmin diaktifkan", Toast.LENGTH_LONG).show();
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return "MyCameraDeviceAdmin akan dimatikan!";
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        Toast.makeText(context, "MyCameraDeviceAdmin dimatikan", Toast.LENGTH_LONG).show();
    }

}

DeviceAdminReceiver pada dasarnya adalah sebuah broadcast receiver. Oleh sebab itu, saya perlu mendaftarkannya pada AndroidManifest.xml seperti berikut ini:

<manifest ...>

  <application ...>
     ...
     <receiver android:name=".MyCameraDeviceAdminReceiver"
        android:label="MyCamera Device Administrator"
        android:permission="android.permission.BIND_DEVICE_ADMIN">
        <meta-data android:name="android.app.device_admin" android:resource="@xml/mycamera_device_admin" />
           <intent-filter>
              <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
           </intent-filter>
     </receiver>
  </application>

</manifest>

Deklarasi broadcast receiver di atas membutuhkan referensi ke file XML lainnya. Untuk itu, saya membuat sebuah file bernama mycamera_device_admin.xml di folder xml pada resources dengan isi seperti berikut ini:

<?xml version="1.0" encoding="utf-8"?>
<device-admin>
    <uses-policies>
        <disable-camera />
    </uses-policies>
</device-admin>

Deklarasi di atas menunjukkan bahwa aplikasi device administrator ini hanya mengatur policy yang berkaitan dengan mematikan penggunaan kamera.

Setelah men-deploy aplikasi ke perangkat, saya bisa mendaftarkan aplikasi device administrator ini dengan memilih menu Settings, Security, Device administrators. Saya akan menemukan device administrator saya seperti pada gambar berikut ini:

Melihat daftar device administrator

Melihat daftar device administrator

Untuk mengaktifkannya, saya dapat memberikan tanda centang pada device administrator yang saya buat seperti pada gambar berikut ini:

Mengaktifkan device administrator

Mengaktifkan device administrator

Bila saya memilih Activate, kode program di onEnabled() akan dipanggil. Hal ini terlihat dari toast yang muncul seperti pada gambar berikut ini:

Device administrator yang aktif

Device administrator yang aktif

Bila saya menghilangkan tanda centang dan memilih Deactivate, sebuah dialog akan muncul sesuai dengan pesan yang dikembalikan oleh onDisableRequested() seperti pada gambar berikut ini:

Me-nonaktif-kan device administrator

Me-nonaktif-kan device administrator

Setelah itu kode program onDisabled() akan dipanggil, seperti yang terlihat pada gambar berikut ini:

Device administrator yang tidak aktif

Device administrator yang tidak aktif

Walaupun sekarang saya sudah bisa mendaftarkan aplikasi tersebut sebagai device administrator, tidak ada apa-apa yang dikerjakan olehnya. Aplikasi saya hanya menampilkan toast dan tidak menghubungi sebuah server yang berisi pusat kebijakan. Hal ini karena saya ingin aplikasi ini dikendalikan oleh pengguna melalui sebuah activity.

Sebagai contoh, saya akan membuat sebuah activity baru dengan nama MainActivity. Activity ini akan memungkinkan pengguna untuk mengendalikan apakah kamera hendak diaktifkan atau tidak, seperti yang terlihat pada kode program berikut ini:

public class MainActivity extends Activity implements CompoundButton.OnCheckedChangeListener {

    private DevicePolicyManager pm;
    private MyCameraDeviceAdminReceiver myCameraDeviceAdminReceiver;
    private ComponentName adminName;
    private CheckBox statusKamera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myCameraDeviceAdminReceiver = new MyCameraDeviceAdminReceiver();
        pm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);

        // Tampilkan dialog untuk mendaftarkan aplikasi ini sebagai device administrator
        // bila belum pernah didaftarkan sebelumnya.
        adminName= myCameraDeviceAdminReceiver.getWho(this);
        if (!pm.isAdminActive(adminName)) {
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminName);
            intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                "Anda harus menjadikan aplikasi ini sebagai device administrator");
            startActivity(intent);
        }

        //
        // Tampilan hanya berupa sebuah checkbox untuk mengaktifkan dan mematikan
        // fasilitas kamera.
        //
        LinearLayout layout = new LinearLayout(this);
        statusKamera = new CheckBox(this);
        statusKamera.setText("Jangan aktifkan kamera di perangkat ini!");
        statusKamera.setOnCheckedChangeListener(this);
        statusKamera.setChecked(pm.getCameraDisabled(null));
        layout.addView(statusKamera);
        setContentView(layout);
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if (pm.isAdminActive(adminName)) {
            pm.setCameraDisabled(adminName, isChecked);
        } else {
            Toast.makeText(this, "Anda harus mendaftarkan aplikasi ini sebagai device administrator terlebih dahulu",
                Toast.LENGTH_SHORT).show();
        }
    }
}

Pada saat activity ini dijalankan, ia akan memeriksa apakah device administrator yang sebelumnya saya buat sudah aktif atau tidak dengan menggunakan method isAdminActive() dari DevicePolicyManager. Bila device administrator belum aktif, ia akan membuat Intent baru yang akan menampilkan kotak dialog pendaftaran device administrator tersebut (sehingga pengguna tidak perlu memilih masuk ke menu Settings untuk mengaktifkannya).

Tampilan program ini cukup sederhana karena ia hanya berisi sebuah CheckBox seperti pada gambar berikut ini:

Tampilan launcher activity

Tampilan launcher activity

Bila CheckBox tersebut dimodifikasi oleh pengguna, method setCameraDisabled() dari DevicePolicyManager akan dipanggil untuk mengatur apakah kamera boleh digunakan atau tidak.

Sebagai contoh, bila saya melarang penggunaan kamera, maka pada saat saya berusaha menjalankan aplikasi yang menggunakan kamera, saya akan menemukan pesan kesalahan seperti Security policy restricts use of Camera.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: