【问题标题】:How to turn off or dim the camera if the camera is used by any app?如果相机被任何应用程序使用,如何关闭或调暗相机?
【发布时间】:2020-12-28 13:34:19
【问题描述】:

我想制作一个控制相机的应用程序。如果打开此应用时使用相机,则应关闭相机或将相机调暗。这可能吗?

    //this method is checking the camera
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() {
                @Override
                public void onCameraAvailable(String cameraId) {
                    super.onCameraAvailable(cameraId);
                }

                @Override
                public void onCameraUnavailable(String cameraId) {
                    super.onCameraUnavailable(cameraId);
                    //how do I turn off the camera ?
                }
            }, new Handler());
        }

【问题讨论】:

  • 您可以使用设备管理员随意禁用和启用相机,这有帮助吗?在这里了解更多信息developer.android.com/guide/topics/admin/device-admin
  • @DanBaruch 设备管理员弃用。从 Android 9(API 级别 28)开始,某些管理策略在被设备管理员调用时将被标记为已弃用。我们建议您现在就开始为这一变化做好准备。要了解更多信息并查看迁移选项,请阅读设备管理员弃用。
  • @DanBaruch 你还有什么建议
  • 设备管理员未被弃用。他们所说的与您的相机需求无关。
  • @DanBaruch DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName deviceAdminSample = ????? what will i write here dpm.setCameraDisabled(deviceAdminSample, true);

标签: android android-camera android-permissions


【解决方案1】:

您创建一个类来接受 DeviceAdmin 权限:

public  class MyDevicePolicyReceiver extends DeviceAdminReceiver {

private static final String LOG_TAG = "LOG";

@Override
public void onDisabled(Context context, Intent intent) {
}

@Override
public void onEnabled(Context context, Intent intent) {
}

@Override
public CharSequence onDisableRequested(Context context, Intent intent) {
    return disableRequestedSeq;
}

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
}
}

你注册如下:

    public ComponentName mDeviceAdminSample;
    public DevicePolicyManager mDPM;

    mDeviceAdminSample = new ComponentName(getApplicationContext(),
                MyDevicePolicyReceiver.class);
        mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
        if(mDPM == null || !mDPM.isAdminActive(mDeviceAdminSample)) {
            Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mDeviceAdminSample);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                "Your_String");
        startActivityForResult(intent, ANY_REQUEST_CODE);
        return;

【讨论】:

  • 你能检查我分享的代码吗?我哪里做错了。
  • 您分享的代码不包括我给您的代码。运行我在此处提供的代码后,您可以使用以下行禁用摄像头:mDPM.setCameraDisabled(mDeviceAdminSample, false);
  • 我添加了 mDPM.setCameraDisabled(mDeviceAdminSample, false);但我收到此错误 java.lang.SecurityException: No active admin ComponentInfo{com.example.myapplication/com.example.myapplication.MyDevicePolicyReceiver} at android.os.Parcel.createException(Parcel.java:2074) at android.os.Parcel.readException(Parcel.java:2042) at android.os.Parcel.readException(Parcel.java:1990)
  • 我加了<receiver android:name=".MyDevicePolicyReceiver" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_receiver" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver>
  • ` java.lang.SecurityException: Admin ComponentInfo{com.example.myapplication/com.example.myapplication.MyDevicePolicyReceiver} 不是设备所有者或配置文件所有者,因此不得使用策略:禁用相机`
【解决方案2】:
public void checkCam(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

        manager.registerAvailabilityCallback(new CameraManager.AvailabilityCallback() {
            @Override
            public void onCameraAvailable(String cameraId) {
                super.onCameraAvailable(cameraId);
                Log.e("onCameraAvailable","-");
            }

            @Override
            public void onCameraUnavailable(String cameraId) {
                super.onCameraUnavailable(cameraId);

                Log.e("onCameraUnavailable","-");

                mDeviceAdminSample = new ComponentName(getApplicationContext(),
                        MyDevicePolicyReceiver.class);
                mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
                if(mDPM == null || !mDPM.isAdminActive(mDeviceAdminSample)) {
                    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
                    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample);
                    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
                            "Your_String");
                    startActivityForResult(intent, 132);
                    return;
                }
            }
        }, new Handler());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2020-10-27
    相关资源
    最近更新 更多