以编程方式阻止Android设备的硬件访问

时间:2012-11-16 08:44:41

标签: android bluetooth android-camera android-wifi android-hardware

我必须编写一个可用作“设备硬件管理员”的应用程序。用户应该能够根据他的偏好启用或禁用硬件的任何功能。我正在添加以下应用程序UI的屏幕截图:

Application UI

这些设置存储在应用程序的本地数据库中。我设法做的如下:

步骤1:我已注册广播接收器以检测所有这些动作。

<receiver android:name=".HardwareActionListener" >
    <intent-filter>
        <action android:name="android.intent.action.CAMERA_BUTTON" >
        </action>

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.hardware.action.NEW_PICTURE" >
        </action>
    </intent-filter>
    <intent-filter>
        <action android:name="android.media.action.IMAGE_CAPTURE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.UMS_CONNECTED" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.UMS_DISCONNECTED" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" >
        </action>
    </intent-filter>
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" >
        </action>
    </intent-filter>
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED_ACTION" >
        </action>
    </intent-filter>
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
</receiver>

我正在为Wifi和蓝牙正确播放广播。我没有收到关于相机动作或USB连接和断开连接的广播。

问题1 :我用于相机和USB检测的目标过滤器有什么问题吗?

步骤2:我想阻止用户使用这些硬件。我设法在用户启动它之后通过检测接收器类的onReceive()方法中的动作来禁用蓝牙或wifi。

if (intent.getAction().equalsIgnoreCase(
                "android.bluetooth.adapter.action.STATE_CHANGED")) {

    int extraBTState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                    BluetoothAdapter.ERROR);
    switch (extraBTState) {
        case BluetoothAdapter.STATE_CONNECTING:
            BluetoothAdapter mBluetoothAdapter = BluetoothAdapter
                        .getDefaultAdapter();
            mBluetoothAdapter.disable();
        break;
        case BluetoothAdapter.STATE_ON:

            BluetoothAdapter mBluetoothAdapter1 = BluetoothAdapter
                        .getDefaultAdapter();
            mBluetoothAdapter1.disable();
        break;
        case BluetoothAdapter.STATE_CONNECTED:

            BluetoothAdapter mBluetoothAdapter2 = BluetoothAdapter
                        .getDefaultAdapter();
            mBluetoothAdapter2.disable();
        break;
        case BluetoothAdapter.STATE_OFF:
            Toast.makeText(context, "Bluetooth access not allowed",
                        Toast.LENGTH_SHORT).show();
        break;
    }

} else if (intent.getAction().equalsIgnoreCase(
                "android.net.wifi.WIFI_STATE_CHANGED")) {
    int extraWifiState = intent.getIntExtra(
                    WifiManager.EXTRA_WIFI_STATE,
                    WifiManager.WIFI_STATE_UNKNOWN);
    switch (extraWifiState) {
        case WifiManager.WIFI_STATE_DISABLED:
            Toast.makeText(context, "Wifi enabling not allowed",
                        Toast.LENGTH_SHORT).show();
        break;

        case WifiManager.WIFI_STATE_ENABLED:

            WifiManager wifiManager1 = (WifiManager) context
                        .getSystemService(Context.WIFI_SERVICE);
            wifiManager1.setWifiEnabled(false);
        break;
        case WifiManager.WIFI_STATE_ENABLING:

            WifiManager wifiManager2 = (WifiManager) context
                        .getSystemService(Context.WIFI_SERVICE);
            wifiManager2.setWifiEnabled(false);
        break;

    }

} 

因此,它检测到蓝牙或WiFi已打开或已连接,并将其关闭或以编程方式断开连接。

但要求是用户根本不应该启动蓝牙或WiFi。这意味着禁用WiFi和蓝牙按钮。

问题2 :这可能吗?

任何帮助或建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

  

我用于相机和USB检测的intent滤镜有什么问题吗?

是。例如:

  • <category>通常不用于广播,绝对不是LAUNCHER类别
  • android.media.action.STILL_IMAGE_CAMERA以及过滤器中的其他人是活动操作,而不是广播操作
  

问题2:这可能吗?

从SDK应用中,没有。欢迎您将源代码下载到Android,根据需要进行修改,编译并构建ROM mod,然后在任何设备上安装ROM mod。