如何给你的安卓手机摄像头“装个门”

1,523 阅读1分钟

现在很多人使用手机的时候都很注意自己的隐私。但偏偏有一些App就对用户的隐私很感兴趣。想要悄悄的启动摄像头来“看看”你。

那有没有可能一个功能,可以让用户自己控制摄像头的开启和关闭呢?关闭的话别的App也不能使用摄像头呢?

答案当然是可以的!!!

我们需要给app添加device admin(设备管理员)权限。

第一步在AndroidManifest.xml声明receiver

<receiver
            android:name=".DevAdminReceiver"
            android:description="@string/device_admin_description"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_DEVICE_ADMIN">
            <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 android:name="android.app.action.ACTION_DEVICE_ADMIN_DISABLE_REQUESTED" />
                <action android:name="android.app.action.ACTION_DEVICE_ADMIN_DISABLED" />
            </intent-filter>
        </receiver>

这样就会在手机设置->其他设置->设备与隐私->设备管理器中看到

WechatIMG129.jpeg

其中摄像头拦截是App的名字,android:description字段设置了下面的提示语。

meta-data中的android:resource描述了具体配置文件的路径。

第二步 res/xml/device_admin.xml

<device-admin>
    <uses-policies>
        <disable-camera />
    </uses-policies>
</device-admin>

WechatIMG130.jpeg 当然除了disable-camera还有其他的权限可配置

        <!--锁屏 -->
        <force-lock />
        <!--限制密码类型-->
        <limit-password />
        <!-- 监控屏幕解锁尝试次数 -->
        <watch-login />
        <!-- 重置密码-->
        <reset-password />
        <!--恢复出厂设置-->
        <wipe-data />
        <!-- 设置锁定屏幕密码的有效期 -->
        <expire-password />
        <!-- 设置存储设备加密 -->
        <encrypted-storage />
        <!-- 停用相机 -->
        <disable-camera />

第三步 DevAdminReceiver.java

import android.app.admin.DeviceAdminReceiver;
import android.content.Context;
import android.content.Intent;


public class DevAdminReceiver extends DeviceAdminReceiver {

    @Override
    public void onEnabled(Context context, Intent intent) {
        if (DevAdminSettingsActivity.staticDevAdminSettingsActivity != null) {
            DevAdminSettingsActivity.staticDevAdminSettingsActivity.recreate();
        }
    }

    @Override
    public CharSequence onDisableRequested(Context context, Intent intent) {
        return context.getString(R.string.admin_receiver_status_disable_warning);
    }

    @Override
    public void onDisabled(Context context, Intent intent) {
        if (DevAdminSettingsActivity.staticDevAdminSettingsActivity != null) {
            DevAdminSettingsActivity.staticDevAdminSettingsActivity.recreate();
        }
    }
}

其中DevAdminSettingsActivity是一个用来启动和停止的页面。

第四步 启用屏蔽

在DevAdminSettingsActivity.java中

private ComponentName admin;
private DevicePolicyManager mDPM;

mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
admin = new ComponentName(getApplicationContext(), DevAdminReceiver.class);

//激活屏蔽,需要先判断设备管理器是否可用
if (mDPM.isAdminActive(admin)) {
    //启用屏蔽
    mDPM.setCameraDisabled(admin, true);
} else {
    //如果设备管理器不可用,跳转设备管理器界面,提示用户手动激活,激活成功后通过DeviceAdminRequestCode判断,再重复上面的`mDPM.setCameraDisabled(admin, true)`
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin);
    ntent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Make sure to accept in order to provide support for lock and wipe");
    startActivityForResult(intent, DeviceAdminRequestCode);
}

//取消屏蔽
mDPM.removeActiveAdmin(admin);

这样,你的手机摄像头就被你装了一个“门”啦~