예제 #1
0
 public async Task <FileData> TakePhoto(CapturePhotoOptions p_options)
 {
     if (await IsCameraAvailable())
     {
         return(await TakeMedia(true, p_options ?? new CapturePhotoOptions()));
     }
     return(null);
 }
예제 #2
0
        public async Task <FileData> TakePhoto(CapturePhotoOptions p_options)
        {
            if (!await IsCameraAvailable())
            {
                return(null);
            }

            var options = p_options ?? new CapturePhotoOptions();
            var capture = new CameraCaptureUI();

            capture.PhotoSettings.Format        = CameraCaptureUIPhotoFormat.Jpeg;
            capture.PhotoSettings.MaxResolution = (options.VideoQuality == 1) ? CameraCaptureUIMaxPhotoResolution.HighestAvailable : CameraCaptureUIMaxPhotoResolution.SmallVga;
            // we can only disable cropping if resolution is set to max
            if (capture.PhotoSettings.MaxResolution == CameraCaptureUIMaxPhotoResolution.HighestAvailable)
            {
                capture.PhotoSettings.AllowCropping = options.AllowCropping;
            }

            var result = await capture.CaptureFileAsync(CameraCaptureUIMode.Photo);

            if (result == null)
            {
                return(null);
            }

            // 将文件移动到CachePath
            await result.MoveAsync(await StorageFolder.GetFolderFromPathAsync(Kit.CachePath), Kit.NewGuid + ".jpg");

            var fd   = new FileData(result.Path, result.Name, (await result.GetBasicPropertiesAsync()).Size);
            var prop = await result.Properties.GetImagePropertiesAsync();

            fd.Desc = $"{prop.Width} x {prop.Height} (jpg)";

            // 生成缩略图
            if (prop.Width > FileData.ThumbSize || prop.Height > FileData.ThumbSize)
            {
                fd.ThumbPath = Path.Combine(Kit.CachePath, Kit.NewGuid + "-t.jpg");
                using (var fs = File.Create(fd.ThumbPath))
                {
                    // 默认根据DPI调整缩略图大小
                    var fl = await result.GetThumbnailAsync(ThumbnailMode.SingleItem, FileData.ThumbSize, ThumbnailOptions.ResizeThumbnail);

                    await fl.AsStreamForRead().CopyToAsync(fs);
                }
            }
            return(fd);
        }
예제 #3
0
        Task <FileData> TakeMedia(bool p_isPhoto, CapturePhotoOptions p_options)
        {
            var ntcs        = new TaskCompletionSource <FileData>();
            var previousTcs = Interlocked.Exchange(ref _tcs, ntcs);

            if (previousTcs != null)
            {
                previousTcs.TrySetResult(null);
            }

            try
            {
                var intent = new Intent(Application.Context, typeof(CameraCaptureActivity));
                intent.PutExtra(CameraCaptureActivity.ExtraIsPhoto, p_isPhoto);
                intent.PutExtra(CameraCaptureActivity.ExtraFront, p_options.UseFrontCamera);
                intent.PutExtra(MediaStore.ExtraVideoQuality, p_options.VideoQuality);
                if (p_options is CaptureVideoOptions vo)
                {
                    // 一定要转成int,否正无法按int获取值!
                    intent.PutExtra(MediaStore.ExtraDurationLimit, (int)vo.DesiredLength.TotalSeconds);
                    if (vo.DesiredSize > 0)
                    {
                        intent.PutExtra(MediaStore.ExtraSizeLimit, vo.DesiredSize);
                    }
                }
                intent.SetFlags(ActivityFlags.NewTask);

                Application.Context.StartActivity(intent);
                EventHandler <FileData> handler = null;
                handler = (s, e) =>
                {
                    var tcs = Interlocked.Exchange(ref _tcs, null);
                    CameraCaptureActivity.Captured -= handler;
                    tcs?.SetResult(e);
                };
                CameraCaptureActivity.Captured += handler;
            }
            catch (Exception ex)
            {
                Debug.Write(ex);
                _tcs.SetException(ex);
            }

            return(_tcs.Task);
        }
예제 #4
0
        async void OnTakePhoto(object sender, RoutedEventArgs e)
        {
            CapturePhotoOptions op = new CapturePhotoOptions();

            if ((bool)_cbFront.IsChecked)
            {
                op.UseFrontCamera = true;
            }
            var fd = await Kit.TakePhoto(op);

            if (fd != null)
            {
                _img.Source = new BitmapImage(new Uri(fd.FilePath));
            }
            else
            {
                _img.Source = null;
            }
        }
예제 #5
0
        Task <FileData> TakeMedia(bool p_isPhoto, CapturePhotoOptions p_options)
        {
            StatusBarStyle = UIApplication.SharedApplication.StatusBarStyle;
            var viewController = GetHostViewController();

            var ndelegate = new CaptureDelegate();
            var od        = Interlocked.CompareExchange(ref _pickerDelegate, ndelegate, null);

            if (od != null)
            {
                throw new InvalidOperationException("同一时间只可激活一次");
            }

            var view = new CaptureController(ndelegate);

            view.MediaTypes    = new[] { p_isPhoto ? "public.image" : "public.movie" };
            view.SourceType    = UIImagePickerControllerSourceType.Camera;
            view.CameraDevice  = p_options.UseFrontCamera ? UIImagePickerControllerCameraDevice.Front : UIImagePickerControllerCameraDevice.Rear;
            view.AllowsEditing = p_options.AllowCropping;
            if (p_isPhoto)
            {
                view.CameraCaptureMode = UIImagePickerControllerCameraCaptureMode.Photo;
            }
            else if (p_options is CaptureVideoOptions voptions)
            {
                view.CameraCaptureMode    = UIImagePickerControllerCameraCaptureMode.Video;
                view.VideoQuality         = (voptions.VideoQuality == 0) ? UIImagePickerControllerQualityType.Low : UIImagePickerControllerQualityType.High;
                view.VideoMaximumDuration = voptions.DesiredLength.TotalSeconds;
            }
            viewController.PresentViewController(view, true, null);

            return(ndelegate.Task.ContinueWith(t =>
            {
                Dismiss(view);
                return t.Result;
            }));
        }
예제 #6
0
파일: CrossCallback.cs 프로젝트: Daoting/dt
        // 参见 https://github.com/jamesmontemagno/MediaPlugin

        /// <summary>
        /// 拍照
        /// </summary>
        /// <param name="p_options">选项</param>
        /// <returns>照片文件信息,失败或放弃时返回null</returns>
        public Task <FileData> TakePhoto(CapturePhotoOptions p_options = null)
        {
            return(new CameraCapture().TakePhoto(p_options));
        }