Esempio n. 1
0
        public void StartRecording()
        {
            var mManager = MainActivity.CurrentActivity.GetSystemService(Context.MediaProjectionService) as MediaProjectionManager;

            mediaProjection = mManager.GetMediaProjection((int)MainActivity.ReturnResultFromPermission, MainActivity.ReturnDataFromPermission);
            DisplayManager dManager       = GetSystemService(Context.DisplayService) as DisplayManager;
            var            displayMetrics = new DisplayMetrics();

            dManager.GetDisplay(0).GetMetrics(displayMetrics);

            mediaRecorder = new MediaRecorder();
            mediaRecorder.SetAudioSource(AudioSource.Mic);
            mediaRecorder.SetVideoSource(VideoSource.Surface);

            var profile = CamcorderProfile.Get(CamcorderQuality.High);

            profile.FileFormat       = OutputFormat.Mpeg4;
            profile.VideoFrameHeight = displayMetrics.HeightPixels;
            profile.VideoFrameWidth  = displayMetrics.WidthPixels;

            mediaRecorder.SetProfile(profile);
            mediaRecorder.SetOutputFile($"{Android.OS.Environment.ExternalStorageDirectory}/demovideo.mp4");
            mediaRecorder.Prepare();

            recordingDisplay = mediaProjection.CreateVirtualDisplay("Rec display", displayMetrics.WidthPixels, displayMetrics.HeightPixels,
                                                                    (int)displayMetrics.Density, Android.Views.DisplayFlags.Round,
                                                                    mediaRecorder.Surface, null, null);

            mediaRecorder.Start();
        }
        public bool Stop()
        {
            StopScript();

            if (!ServiceStarted)
            {
                return(false);
            }

            _virtualDisplay?.Release();
            _virtualDisplay = null;

            _imgListener?.Dispose();
            _imgListener = null;

            _imageReader?.Close();
            _imageReader = null;

            _mediaProjection?.Stop();
            _mediaProjection = null;

            ScreenshotManager.ReleaseMemory();
            ImageLocator.ClearCache();

            _windowManager.RemoveView(_layout);
            ServiceStarted = false;

            HideForegroundNotification();

            return(true);
        }
        public bool Start(Intent MediaProjectionToken = null)
        {
            if (ServiceStarted)
            {
                return(false);
            }

            if (MediaProjectionToken != null)
            {
                _mediaProjection = MediaProjectionManager.GetMediaProjection((int)Result.Ok, MediaProjectionToken);
            }

            _imageReader = ImageReader.NewInstance(_screenWidth, _screenHeight, (ImageFormatType)1, 2);
            _imgListener = new ImgListener(_imageReader);
            _imageReader.SetOnImageAvailableListener(_imgListener, null);

            SetupVirtualDisplay();

            _windowManager.AddView(_layout, _layoutParams);
            ServiceStarted = true;

            ShowForegroundNotification();

            return(true);
        }
Esempio n. 4
0
        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            if (intent == null)
            {
                return(StartCommandResult.NotSticky);
            }

            if (intent.Action == ACTION_STOP)
            {
                Stop();
                return(StartCommandResult.NotSticky);
            }
            else if (intent.Action == ACTION_START)
            {
                string         host          = intent.GetStringExtra(EXTRA_HOST);
                int            port          = intent.GetIntExtra(EXTRA_PORT, 1704);
                EBroadcastMode broadcastMode = (EBroadcastMode)intent.GetIntExtra(EXTRA_BROADCAST_MODE, (int)EBroadcastMode.Media);

                Intent stopIntent = new Intent(this, typeof(SnapclientService));
                stopIntent.SetAction(ACTION_STOP);
                PendingIntent PiStop = PendingIntent.GetService(this, 0, stopIntent, 0);

                NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
                                                     .SetSmallIcon(Resource.Drawable.ic_media_play)
                                                     .SetTicker("Snap.Net.Broadcast started")
                                                     .SetContentTitle("Snap.Net Broadcast")
                                                     .SetContentText("Snap.Net.Broadcast is running...")
                                                     .SetContentInfo(string.Format("{0}:{1}", host, port))
                                                     .SetStyle(new NotificationCompat.BigTextStyle().BigText("Snap.Net.Broadcast is running..."))
                                                     .AddAction(Resource.Drawable.ic_media_stop, "Stop", PiStop);

                Intent resultIntent = new Intent(this, typeof(MainActivity));

                TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);
                stackBuilder.AddParentStack(Class.FromType(typeof(MainActivity)));

                stackBuilder.AddNextIntent(resultIntent);
                PendingIntent resultPendingIntent =
                    stackBuilder.GetPendingIntent(
                        0,
                        PendingIntentFlags.UpdateCurrent
                        );

                builder.SetContentIntent(resultPendingIntent);
                Notification notification = builder.Build();

                StartForeground(NOTIFICATION_CHANNEL, notification);

                m_MediaProjection =
                    m_MediaProjectionManager.GetMediaProjection((int)Result.Ok,
                                                                intent.GetParcelableExtra(EXTRA_RESULT_DATA) as Intent);

                _Start(host, port, broadcastMode);

                return(StartCommandResult.Sticky);
            }

            return(StartCommandResult.NotSticky);
        }
 public void Dispose()
 {
     _mediaProjection?.Stop();
     _mediaProjection = null;
     _virtualDisplay?.Release();
     _imageReader?.Close();
     _orientationEventListener?.Dispose();
 }
Esempio n. 6
0
 private void TearDownMediaProjection()
 {
     if (mediaProjection != null)
     {
         mediaProjection.Stop();
         mediaProjection = null;
     }
 }
Esempio n. 7
0
 /// <summary>
 /// 释放截图。
 /// </summary>
 public void TearDownMediaProjection()
 {
     _mediaProjection?.Stop();
     _mediaProjection = null;
     _virtualDisplay?.Release();
     _virtualDisplay = null;
     _imageReader?.Close();
     _imageReader = null;
 }
Esempio n. 8
0
 protected override void OnDestroy()
 {
     base.OnDestroy();
     mMediaRecorder.Release();
     mMediaRecorder.Dispose();
     mMediaRecorder = null;
     mediaProjection.Stop();
     mediaProjection = null;
     virtualDisplay.Release();
     virtualDisplay = null;
 }
Esempio n. 9
0
        /// <summary>
        /// 刷新虚拟显示
        /// </summary>
        private void StartVirtualDisplay()
        {
            _imageReader?.Close();
            _virtualDisplay?.Release();
            _mediaProjection?.Stop();

            _mediaProjection = _mediaProjectionManager.GetMediaProjection((int)Result.Ok, _intent);

            //屏幕宽高
            var screenHeight = ScreenMetrics.Instance.GetOrientationAwareScreenHeight();
            var screenWidth  = ScreenMetrics.Instance.GetOrientationAwareScreenWidth();

            InitVirtualDisplay(screenWidth, screenHeight, (int)ScreenMetrics.Instance.DeviceScreenDensity);
        }
Esempio n. 10
0
        public MediaProjectionScreenshotService(MediaProjection MediaProjection, DisplayMetrics Metrics)
        {
            _mediaProjection = MediaProjection;

            var screenDensity = (int)Metrics.DensityDpi;
            var screenWidth   = Metrics.WidthPixels;
            var screenHeight  = Metrics.HeightPixels;

            _convertedMat      = new Mat();
            _colorCorrectedMat = new Mat();

            _imageReader = ImageReader.NewInstance(screenWidth, screenHeight, (ImageFormatType)1, 2);

            _virtualDisplay = _mediaProjection.CreateVirtualDisplay("ScreenCapture",
                                                                    screenWidth, screenHeight, screenDensity,
                                                                    DisplayFlags.None, _imageReader.Surface, null, null);
        }
        /// <summary>
        /// 刷新虚拟显示
        /// </summary>
        /// <param name="orientation"></param>
        private static void RefreshVirtualDisplay()
        {
            _imageReader?.Close();
            _virtualDisplay?.Release();
            _mediaProjection?.Stop();

            _mediaProjection = _mediaProjectionManager.GetMediaProjection((int)Result.Ok, _intent.Clone().JavaCast <Intent>());

            //屏幕方向
            var orientation = Context.Resources.Configuration.Orientation;

            //屏幕宽高
            var screenHeight = ScreenMetrics.Instance.GetOrientationAwareScreenHeight(orientation);
            var screenWidth  = ScreenMetrics.Instance.GetOrientationAwareScreenWidth(orientation);

            InitVirtualDisplay(screenWidth, screenHeight, (int)ScreenMetrics.Instance.DeviceScreenDensity);
            SetImageListener(new Handler());
        }
Esempio n. 12
0
        public static void ActivityResult(int requestCode, Result resultCode, Intent data)
        {
            if (requestCode == REQUEST_RECORD)
            {
                if (resultCode == Result.Ok)
                {
                    mediaProjection = mediaProjectionManager.GetMediaProjection((int)resultCode, data);
                    mediaProjection.RegisterCallback(new MediaProjectionCallback(), null);

                    // DisplayManager.VirtualDisplayFlagAutoMirror,
                    virtualDisplay = mediaProjection.CreateVirtualDisplay("MainActivity", DISPLAY_WIDTH, DISPLAY_HEIGHT, (int)screenDensity,
                                                                          DisplayFlags.Presentation, mediaRecorder.Surface, null, null);

                    mediaRecorder.Start();
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("!!Result Code Is" + resultCode + "!!");
                }
            }
        }
Esempio n. 13
0
        public void Dispose()
        {
            _convertedMat.Release();
            _colorCorrectedMat.Release();

            _convertedMat = _colorCorrectedMat = null;

            _lastestPattern?.Dispose();
            _lastestPattern = null;

            _readBitmap?.Recycle();
            _readBitmap = null;

            _virtualDisplay?.Release();
            _virtualDisplay = null;

            _imageReader?.Close();
            _imageReader = null;

            _mediaProjection?.Stop();
            _mediaProjection = null;
        }
Esempio n. 14
0
        public void StartRecording(Bundle savedInstanceState)
        {
            string path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + "/test.mp4";

            mMediaRecorder.SetVideoSource(VideoSource.Surface);
            mMediaRecorder.SetOutputFormat(OutputFormat.Webm);
            //mMediaRecorder.SetVideoEncodingBitRate(512 * 1000);
            mMediaRecorder.SetVideoEncoder(VideoEncoder.Vp8);
            mMediaRecorder.SetVideoSize(480, 640);
            //mMediaRecorder.SetVideoFrameRate(10);
            mMediaRecorder.SetOutputFile(path);
            mMediaRecorder.Prepare();

            var metrics = new DisplayMetrics();

            Activity.WindowManager.DefaultDisplay.GetMetrics(metrics);
            screenDensity          = (int)metrics.DensityDpi;
            mediaProjectionManager = (MediaProjectionManager)Activity.GetSystemService(Context.MediaProjectionService);

            resultCode      = savedInstanceState.GetInt(STATE_RESULT_CODE);
            resultData      = (Intent)savedInstanceState.GetParcelable(STATE_RESULT_DATA);
            mediaProjection = mediaProjectionManager.GetMediaProjection(resultCode, resultData);
            mMediaRecorder.Start();
        }
Esempio n. 15
0
 /// <summary>
 /// Initializes a new instance of the <see cref="LocalScreenMedia"/> class.
 /// </summary>
 /// <param name="context">The Android context.</param>
 /// <param name="disableAudio">Whether to disable audio.</param>
 /// <param name="disableVideo">Whether to disable video.</param>
 /// <param name="aecContext">The AEC context, if using software echo cancellation.</param>
 public LocalScreenMedia(MediaProjection projection, Android.Content.Context context, bool disableAudio, bool disableVideo, AecContext aecContext)
     : base(context, disableAudio, disableVideo, aecContext)
 {
     projectionSource = new MediaProjectionSource(projection, context, 3);
     Initialize();
 }
		private void TearDownMediaProjection()
		{
			if (mediaProjection != null) {
				mediaProjection.Stop ();
				mediaProjection = null;
			}
		}
		private void SetUpMediaProjection()
		{
			mediaProjection = mediaProjectionManager.GetMediaProjection (resultCode, resultData);
		}
Esempio n. 18
0
 private void SetUpMediaProjection()
 {
     mediaProjection = mediaProjectionManager.GetMediaProjection(resultCode, resultData);
 }