android 4.2的版本 照相机界面切换至前摄像头,按返回后再进照相在后摄像头,进去应还在前摄像头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 4.2的版本 照相机界面切换至前摄像头,按返回后再进照相在后摄像头,进去应还在前摄像头相关的知识,希望对你有一定的参考价值。

android 4.2的版本 照相机界面切换至前摄像头,按返回后再进照相在后摄像头,进去应还在前摄像头 开发的时候 遇到这个问题 怎么让他按返回键的时候 里面切换的状态也保存呢,按home键因为程序没有关闭 所以会保存 但是按返回键就关闭相机了,怎么修改这里的代码,让他关闭了也保存?求大神解答

文件,android / platform/packages/apps/Camera / android-4.2.2_r1.2 / . / src / com / android / camera / PhotoModule.java:
private int getPreferredCameraId(ComboPreferences preferences)
int intentCameraId = Util.getCameraFacingIntentExtras(mActivity);
if (intentCameraId != -1)
// Testing purpose. Launch a specific camera through the intent
// extras.注意这个注释,
return intentCameraId;
else
return CameraSettings.readPreferredCameraId(preferences);


这个方法返回的CaremaId就是要Launch 的Camera
android / platform/packages/apps/Camera / android-4.2.2_r1.2 / . / src / com / android / camera / CameraSettings.java文件中静态方法:
public static int readPreferredCameraId(SharedPreferences pref)
return Integer.parseInt(pref.getString(KEY_CAMERA_ID, "0"));//我猜可能没设置,总返回0

读取保存在xml文件中的ID,搜索KEY_CAMERA_ID,看有没有在某个地方设置ID值。
发现:
public static void writePreferredCameraId(SharedPreferences pref,
int cameraId)
Editor editor = pref.edit();
editor.putString(KEY_CAMERA_ID, Integer.toString(cameraId));
editor.apply();

写入ID值,再找这个方法看看哪里调用了。

我没有下载4.2源码,上面源代码是从googlesrouce上网页上查到的,提供个思路给你希望对你有帮助。
参考技术A 接收back键消息,把摄像头的信息保存一下,下次进来时候设置一下不就行了吗追问

哥你说的这些我也会说啊 原理很简单,就是到里面怎么处理是个问题

Android无法在通信过程中从相机切换到屏幕共享webrtc

【中文标题】Android无法在通信过程中从相机切换到屏幕共享webrtc【英文标题】:Android unable to switch from camera to screen sharing webrtc in middle of communication 【发布时间】:2020-11-25 04:38:08 【问题描述】:

我正在开发 android 应用程序并将 webrtc 与 openvidu 一起使用。我得到了屏幕共享和相机共享工作。但只有其中任何一种适用于一个对等连接。我无法在它们之间切换。默认情况下,当建立连接时,相机将被共享,单击按钮我应该能够在不断开现有连接的情况下共享屏幕。但是,在我的情况下并没有发生这种情况。它不会在单击按钮时发布屏幕。一片空白。

如果有人在相机和共享屏幕之间切换,反之亦然,请帮助我。 提前致谢。

    public VideoTrack MakeCameraSettingsReady() 
            final EglBase.Context eglBaseContext = EglBase.create().getEglBaseContext();
            PeerConnectionFactory peerConnectionFactory = this.sessionManager.getPeerConnectionFactory();
    
            // create AudioSource
            AudioSource audioSource = peerConnectionFactory.createAudioSource(new MediaConstraints());
            this.audioTrack = peerConnectionFactory.createAudioTrack("101", audioSource);
    
            surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext);
            // create VideoCapturer
            videoCapturer = createVideoCapturer();
    
            //MediaConstraints constraints = new MediaConstraints();
    
            VideoSource videoSource = peerConnectionFactory.createVideoSource(videoCapturer.isScreencast());
            localVideoTrack = peerConnectionFactory.createVideoTrack("100", videoSource);
            videoCapturer.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
            videoCapturer.startCapture(720, 1280, 30);
    
            return localVideoTrack;
        
    
        public VideoTrack MakeScreenCaptureReady() 
            final EglBase.Context eglBaseContext = EglBase.create().getEglBaseContext();
            PeerConnectionFactory peerConnectionFactory = this.sessionManager.getPeerConnectionFactory();
    
            // create AudioSource
            AudioSource audioSource = peerConnectionFactory.createAudioSource(new MediaConstraints());
            this.audioTrack = peerConnectionFactory.createAudioTrack("101", audioSource);
    
            surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", eglBaseContext);
            // create VideoCapturer
            screenCapturerAndroid = (ScreenCapturerAndroid) createScreenCapturer();
    
            //MediaConstraints constraints = new MediaConstraints();
    
            VideoSource videoSource = peerConnectionFactory.createVideoSource(screenCapturerAndroid.isScreencast());
            localVideoTrack = peerConnectionFactory.createVideoTrack("100", videoSource);
            screenCapturerAndroid.initialize(surfaceTextureHelper, context, videoSource.getCapturerObserver());
            screenCapturerAndroid.startCapture(720, 1280, 30);

            return localVideoTrack;
        

当我点击按钮分享屏幕时,我使用以下代码:

  private fun stopCameraShare()
            videoCapturerAndroid?.stopCapture()
            localRenderer.dispose()
            localVideoView.release()
            localVideoView.clearImage()
            stream?.removeTrack(localVideoTrack)
            localVideoTrack.dispose()
        

    private fun shareScreen()
            stopCameraShare()
            val mediaProjectionManager = activity!!.getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
            startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 29)
        

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == SCREEN_RECORD_REQUEST_CODE) 
            if (resultCode == RESULT_OK) 
                //Start screen recording
                mResultCode = resultCode
                mResultData = data

                runOnUiThread 
                    screenCaptureVideoTrack = mLiveSessionViewModel!!.localParticipant?.MakeScreenCaptureReady()
                    mLiveSessionViewModel!!.localParticipant?.screenCaptureVideoTrack = screenCaptureVideoTrack
                
            
        
    

我尝试过的参考资料: How to share screen remotely in a video/audio call?

https://github.com/Jeffiano/ScreenShareRTC

https://chromium.googlesource.com/external/webrtc/+/b75f2541c942e2f35c3b7d7003ed17504176ced1/webrtc/api/android/java/src/org/webrtc/ScreenCapturerAndroid.java

WebRTC - change video stream in the middle of communication

最终,我试图找到一种可以在通信过程中添加跟踪/删除跟踪的方法。谢谢!

【问题讨论】:

【参考方案1】:

我认为您正在使用两个视频轨道。 您为什么不尝试只使用一个视频轨道。 像相机共享一样,将视频轨道分配为 mLiveSessionViewModel!!.localParticipant?.mediaStream.videotraks[0] = cameraVideoTrack 切换到屏幕共享,删除现有视频轨道并添加相应的视频轨道 mLiveSessionViewModel!!.localParticipant?.mediaStream.videotrakcs[0].removeTrack(cameraVideoTrack) mLiveSessionViewModel!!.localParticipant?.mediaStream.videotracks[0].addTrack(screenShareVideoTrack)

【讨论】:

以上是关于android 4.2的版本 照相机界面切换至前摄像头,按返回后再进照相在后摄像头,进去应还在前摄像头的主要内容,如果未能解决你的问题,请参考以下文章

Android调用照相机和百度地图开发,百度地图显示界面覆盖了相机界面,求大神解答?

iOS 4.2,寻找一种方法来操纵 iPhone 4 相机的焦距

android 相机 怎么改变相机预览界面大小

Android:单击按钮时切换相机

Android 4.4.2 - 相机 uri 返回 null 并且裁剪功能也不起作用?

Android无法在通信过程中从相机切换到屏幕共享webrtc