diff --git a/bin/jni/jni_interface.i b/bin/jni/jni_interface.i
index ec12cb88261b49f7c1fe6f259752b2bb715083c4..5e7ec6b7df53e801750f639883f2029905cac803 100644
--- a/bin/jni/jni_interface.i
+++ b/bin/jni/jni_interface.i
@@ -284,6 +284,7 @@ void init(ConfigurationCallback* confM, Callback* callM, PresenceCallback* presM
     const std::map<std::string, SharedCallback> videoEvHandlers = {
         exportable_callback<VideoSignal::GetCameraInfo>(bind(&VideoCallback::getCameraInfo, videoM, _1, _2, _3, _4)),
         exportable_callback<VideoSignal::SetParameters>(bind(&VideoCallback::setParameters, videoM, _1, _2, _3, _4, _5)),
+        exportable_callback<VideoSignal::RequestKeyFrame>(bind(&VideoCallback::requestKeyFrame, videoM)),
         exportable_callback<VideoSignal::StartCapture>(bind(&VideoCallback::startCapture, videoM, _1)),
         exportable_callback<VideoSignal::StopCapture>(bind(&VideoCallback::stopCapture, videoM)),
         exportable_callback<VideoSignal::DecodingStarted>(bind(&VideoCallback::decodingStarted, videoM, _1, _2, _3, _4, _5)),
diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i
index 245a6ef373b25dac17671cd8449cc9591759d7a1..06f63f46237d7796d2e48e2b65c6b7c445f3265c 100644
--- a/bin/jni/videomanager.i
+++ b/bin/jni/videomanager.i
@@ -43,6 +43,7 @@ public:
     virtual ~VideoCallback(){}
     virtual void getCameraInfo(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates) {}
     virtual void setParameters(const std::string, const int format, const int width, const int height, const int rate) {}
+    virtual void requestKeyFrame(){}
     virtual void startCapture(const std::string& camid) {}
     virtual void stopCapture() {}
     virtual void decodingStarted(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer) {}
@@ -397,6 +398,7 @@ public:
     virtual ~VideoCallback(){}
     virtual void getCameraInfo(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates){}
     virtual void setParameters(const std::string, const int format, const int width, const int height, const int rate) {}
+    virtual void requestKeyFrame(){}
     virtual void startCapture(const std::string& camid) {}
     virtual void stopCapture() {}
     virtual void decodingStarted(const std::string& id, const std::string& shm_path, int w, int h, bool is_mixer) {}
diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp
index 39f2c079316556a6efdba9e19d74fc00c378e8b4..bd0a3751037b78f687e8bc2878f519cebb51cda1 100644
--- a/src/client/ring_signal.cpp
+++ b/src/client/ring_signal.cpp
@@ -107,6 +107,7 @@ getSignalHandlers()
 #ifdef __ANDROID__
         exported_callback<DRing::VideoSignal::GetCameraInfo>(),
         exported_callback<DRing::VideoSignal::SetParameters>(),
+        exported_callback<DRing::VideoSignal::RequestKeyFrame>(),
 #endif
         exported_callback<DRing::VideoSignal::StartCapture>(),
         exported_callback<DRing::VideoSignal::StopCapture>(),
diff --git a/src/dring/videomanager_interface.h b/src/dring/videomanager_interface.h
index a482be31cbf84bb0c99f5493da7d15b68f1337ed..e53c011352400e6a2d2a8163e6a54f2c9f98010b 100644
--- a/src/dring/videomanager_interface.h
+++ b/src/dring/videomanager_interface.h
@@ -209,6 +209,10 @@ struct DRING_PUBLIC VideoSignal {
             constexpr static const char* name = "GetCameraInfo";
             using cb_type = void(const std::string& device, std::vector<int> *formats, std::vector<unsigned> *sizes, std::vector<unsigned> *rates);
         };
+        struct DRING_PUBLIC RequestKeyFrame {
+            constexpr static const char* name = "RequestKeyFrame";
+            using cb_type = void();
+        };
 #endif
         struct DRING_PUBLIC StartCapture {
             constexpr static const char* name = "StartCapture";
diff --git a/src/media/video/video_sender.cpp b/src/media/video/video_sender.cpp
index 2421d96be1e47e50e388d258a0e3d9d50efad00f..8d2d8975543525947c23955abda52d159092d261 100644
--- a/src/media/video/video_sender.cpp
+++ b/src/media/video/video_sender.cpp
@@ -68,6 +68,12 @@ void
 VideoSender::encodeAndSendVideo(VideoFrame& input_frame)
 {
     if (auto packet = input_frame.packet()) {
+#if __ANDROID__
+        if (forceKeyFrame_) {
+            emitSignal<DRing::VideoSignal::RequestKeyFrame>();
+            forceKeyFrame_ = 0;
+        }
+#endif
         videoEncoder_->send(*packet);
     } else {
         bool is_keyframe = forceKeyFrame_ > 0