diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
index 54c1714a224ae08fe17c706fd967df62ffc614e0..d0e2a5c06edaa01a9d06591468262c978089d197 100644
--- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
@@ -30,7 +30,6 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.database.ContentObserver;
-import android.hardware.usb.UsbManager;
 import android.net.ConnectivityManager;
 import android.os.Build;
 import android.os.Bundle;
@@ -62,7 +61,6 @@ import cx.ring.client.ConversationActivity;
 import cx.ring.facades.ConversationFacade;
 import cx.ring.model.Codec;
 import cx.ring.model.Settings;
-import cx.ring.model.SipCall;
 import cx.ring.model.Uri;
 import cx.ring.services.AccountService;
 import cx.ring.services.CallService;
@@ -534,11 +532,6 @@ public class DRingService extends Service {
                     updateConnectivityState();
                     break;
                 }
-                case UsbManager.ACTION_USB_DEVICE_ATTACHED:
-                case UsbManager.ACTION_USB_DEVICE_DETACHED: {
-                    mHardwareService.initVideo();
-                    break;
-                }
                 case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: {
                     mConnectivityChecker.run();
                     mHandler.postDelayed(mConnectivityChecker, 100);
@@ -546,7 +539,6 @@ public class DRingService extends Service {
             }
         }
     };
-
     @Override
     public void onCreate() {
         Log.i(TAG, "onCreated");
@@ -565,8 +557,6 @@ public class DRingService extends Service {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             intentFilter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
         }
-        intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
-        intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
         registerReceiver(receiver, intentFilter);
         updateConnectivityState();
 
@@ -585,6 +575,7 @@ public class DRingService extends Service {
         unregisterReceiver(receiver);
         getContentResolver().unregisterContentObserver(contactContentObserver);
 
+        mHardwareService.unregisterCameraDetectionCallback();
         mDisposableBag.clear();
         isRunning = false;
     }
diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraService.java b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
index 817d22b05e09cc83e29bafb7dea17949cd082249..555852b03c65e4e353d54c79ad6b1f6e06e7009f 100644
--- a/ring-android/app/src/main/java/cx/ring/services/CameraService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
@@ -94,6 +94,21 @@ public class CameraService {
     private MediaProjection currentMediaProjection;
     private VirtualDisplay virtualDisplay;
     private MediaCodec currentCodec;
+    private final CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() {
+        @Override
+        public void onCameraAvailable(@NonNull String cameraId) {
+            init()
+                .onErrorComplete()
+                .subscribe();
+        }
+
+        @Override
+        public void onCameraUnavailable(@NonNull String cameraId) {
+            init()
+                .onErrorComplete()
+                .subscribe();
+        }
+    };
 
     CameraService(@NonNull Context c) {
         manager = (CameraManager) c.getSystemService(Context.CAMERA_SERVICE);
@@ -368,6 +383,7 @@ public class CameraService {
                 })
                 .ignoreElement()
                 .doOnError(e -> Log.e(TAG, "Error initializing video device", e))
+                .doOnComplete(() -> manager.registerAvailabilityCallback(availabilityCallback, getVideoHandler()))
                 .onErrorComplete();
     }
 
@@ -938,4 +954,9 @@ public class CameraService {
                     (long) rhs.getWidth() * rhs.getHeight());
         }
     }
+
+    public void unregisterCameraDetectionCallback() {
+        if (manager != null && availabilityCallback != null)
+            manager.unregisterAvailabilityCallback(availabilityCallback);
+    }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
index 7cddda0d6a7e9f085a1b990453ba98c1cf5987ea..04fd494c276271c2cf89beeafb9645e962a2ebbd 100644
--- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
@@ -24,6 +24,7 @@ import android.bluetooth.BluetoothHeadset;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.graphics.Point;
+import android.hardware.camera2.CameraManager;
 import android.media.AudioDeviceInfo;
 import android.media.AudioManager;
 import android.media.MediaRecorder;
@@ -33,10 +34,11 @@ import android.view.SurfaceHolder;
 import android.view.TextureView;
 import android.view.WindowManager;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.media.AudioAttributesCompat;
-import androidx.media.AudioManagerCompat;
 import androidx.media.AudioFocusRequestCompat;
+import androidx.media.AudioManagerCompat;
 
 import java.io.File;
 import java.lang.ref.WeakReference;
@@ -741,4 +743,9 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager
         int w, h;
         long window = 0;
     }
+
+    @Override
+    public void unregisterCameraDetectionCallback() {
+        cameraService.unregisterCameraDetectionCallback();
+    }
 }
diff --git a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
index 117fb31e68ab20f4b8e10bf20b680bb8a480a083..de47bef2ea1df98bcd6b3025fa6552e53b0a45b7 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java
@@ -161,6 +161,8 @@ public abstract class HardwareService {
 
     public abstract boolean shouldPlaySpeaker();
 
+    public abstract void unregisterCameraDetectionCallback();
+
     public void connectivityChanged(boolean isConnected) {
         Log.i(TAG, "connectivityChange() " + isConnected);
         connectivityEvents.onNext(isConnected);