现在很多人使用手机的时候都很注意自己的隐私。但偏偏有一些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>
这样就会在手机设置->其他设置->设备与隐私->设备管理器中看到
其中摄像头拦截是App的名字,android:description
字段设置了下面的提示语。
meta-data中的android:resource描述了具体配置文件的路径。
第二步 res/xml/device_admin.xml
<device-admin>
<uses-policies>
<disable-camera />
</uses-policies>
</device-admin>
当然除了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);