public async Task <FileData> TakePhoto(CapturePhotoOptions p_options) { if (await IsCameraAvailable()) { return(await TakeMedia(true, p_options ?? new CapturePhotoOptions())); } return(null); }
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); }
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); }
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; } }
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; })); }
// 参见 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)); }