Xamarin 打开相机 选择系统照片并上传服务器

1. 首先在AndroidManifest.xml中进行配置权限

  <!-- 这两个权限用于进行拍照存储权限-->
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 在OnCreate() 事件中判断功能,绑定事件

if (IsThereAnAppToTakePictures())   //判断本设备是否存在拍照功能
            {
                getqx(); //权限
                btnCamera = FindViewById<Button>(Resource.Id.btnCameraClick001);
                _imageView = FindViewById<ImageView>(Resource.Id.imageView1);
                btnCamera.Click += Button_Clicked;

                originalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(
                Android.OS.Environment.DirectoryPictures
                ), "pic_" + SystemClock.CurrentThreadTimeMillis() + ".png");

                finalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory(
                    Android.OS.Environment.DirectoryPictures
                    ), "pic_" + SystemClock.CurrentThreadTimeMillis() + ".png");

                // android 7.0系统解决拍照的问题
                StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                StrictMode.SetVmPolicy(builder.Build());
                builder.DetectFileUriExposure();
            }
 private async void Button_Clicked(object sender, EventArgs e)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            string[] actions = new string[] { "拍照", "从相册选择" };
            var adapter = new ArrayAdapter<String>(this, Android.Resource.Layout.SimpleSpinnerItem, actions);
            adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
            builder.SetItems(actions, (s, e) =>
            {
                switch (actions[e.Which])
                {
                    case "拍照":
                        try
                        {
                            // 摄像头拍摄
                            // TakeAPicture(sender, e);
                            CutImageByCamera();
                        }
                        catch (Exception ex)
                        {

                            Toast.MakeText(this, "App Camera Error:" + ex.InnerException, ToastLength.Short).Show();
                        }
                        break;
                    case "从相册选择":
                        //TakeImageAction();
                        try
                        {
                            // 相册选择
                            CutImageByImgStore();
                        }
                        catch (Exception ex)
                        {
                            Toast.MakeText(this, "App Select Photo Gallery Error:" + ex.InnerException, ToastLength.Short).Show();
                        }
                        Toast.MakeText(this, "you selected " + actions[e.Which], ToastLength.Short).Show();
                        break;
                }
            });
            builder.Create();
            builder.Show();
        }

3. 打开相机和打开系统文件

  /// <summary>
        /// 调用摄像头拍摄
        /// </summary>
        private void CutImageByCamera()
        {
            Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
            getImageByCamera.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile));
            getImageByCamera.PutExtra(MediaStore.ExtraVideoQuality, 1);
            StartActivityForResult(getImageByCamera, Camera_RequestCode);
        }

        /// <summary>
        /// 调用相册选择
        /// </summary>
        private void CutImageByImgStore()
        {
            Intent _intentCut = new Intent(Intent.ActionGetContent, null);
            _intentCut.SetType("image/*");// 设置文件类型
            _intentCut.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile));
            _intentCut.PutExtra(MediaStore.ExtraVideoQuality, 1);
            StartActivityForResult(_intentCut, PhotoGallery_RequestCode);
        }

注意: Android7.0以上不支持file:// 来进行保存,需要把路径改为content://

4. 结束后回调

  protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            if (resultCode == Result.Ok)
            {
                if (requestCode == Camera_RequestCode)// 拍照结束裁剪
                {
                    byte[] bitmapData;
                    base.OnActivityResult(requestCode, resultCode, data);
                    data.SetData(Android.Net.Uri.FromFile(originalFile));
                    CropRawPhoto(data.Data);
                }
                if (requestCode == PhotoGallery_RequestCode)// 选择图片 
                {
                    /*
                    * 若系统版本低于4.4,返回原uri
                    * 若高于4.4,解析uri后返回
                    * */
                    if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat)
                    {
                        var url = Android.Net.Uri.Parse("file://" + GetPath(BaseContext, data.Data));
                        data.SetData(url);
                    }

                    CropRawPhoto(data.Data);
                }
                if (requestCode == Display_RequestCode)// 裁剪后保存并显示
                {
                    Intent intent = new Intent();
                    //intent.SetData(Android.Net.Uri.FromFile(finalFile));
                    int height = Resources.DisplayMetrics.HeightPixels;
                    int width = _imageView.Height;
                    //SetResult(Result.Ok, intent);
                    Bitmap bitmap = PhotoUtils.LoadAndResizeBitmap(finalFile.Path.ToString(), width, height);
                    PhotoUtils.SaveUrl(bitmap, DateTime.Now.ToString("yyyyMMddhhmmss"));
                    _imageView.SetImageBitmap(bitmap);

                    //清空bitmap 否则会出现oom问题 (内存泄漏)
                    bitmap = null;
                    GC.Collect();
                }

               
            }
        }

上传服务器代码(客户端):

   // <summary>
        /// 上传图片到服务器
        /// </summary>
        /// <returns></returns>
        public static void SaveUrl(Bitmap bitmap, string name)
        {
            // 创建WebClient实例
            WebClient myWebClient = new WebClient();

            //访问权限设置      
            myWebClient.Credentials = CredentialCache.DefaultCredentials;

            Byte[] bitmapData = null;
            try
            {
                // 图片转换为流
                using (var stream = new MemoryStream())
                {
                    bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
                    bitmapData = stream.ToArray();
                }

                string content = Convert.ToBase64String(bitmapData);
                ContentPath contentPath = new ContentPath()
                {
                    content = content,
                    pathandname = name + ".png"
                };

                RWMS_Android.Common.A_ASRS_001.Upload(JsonConvert.SerializeObject(contentPath));
                //本地方法用不了
                //FileStream fs = new FileStream(name, FileMode.Open, FileAccess.Read);
                //Upload(bitmapData, "png", url);

                //using (System.IO.FileStream fos = new FileStream(Android.OS.Environment.GetExternalStoragePublicDirectory(
                //Android.OS.Environment.DirectoryPictures) + name + ".png", FileMode.Open, FileAccess.Read))
                using (System.IO.FileStream fos = new FileStream(url + name + ".png", FileMode.Open, FileAccess.Read))
                //{
                //Stream postStream = myWebClient.OpenWrite(url, "PUT");
                //if (postStream.CanWrite)
                //{
                //    postStream.Write(bitmapData, 0, bitmapData.Length);
                //}
                //postStream.Close();
                //}
            }
            catch (Exception ex)
            {

            }
        }

上传服务器代码(接口):

  [HttpPost]
        public string UpdateFile([FromBody] object json)
        {
            JObject jObject = (JObject)JsonConvert.DeserializeObject(json.ToString());
            string content = jObject["content"].ToString();
            string pathandname = jObject["pathandname"].ToString();
            //保存图片路径
            string FilePath = ConfigurationManager.AppSettings["fileServiceStoragePath"];
            //判断路径是否存在
            if (!Directory.Exists(FilePath))
            {
                //创建路径
                Directory.CreateDirectory(FilePath);
            }

            string SaveFilePath = Path.Combine(FilePath, pathandname);
            byte[] fileBytes;
            try
            {
                fileBytes = Convert.FromBase64String(content);
                MemoryStream memoryStream = new MemoryStream(fileBytes); //1.定义并实例化一个内存流,以存放提交上来的字节数组。
                FileStream fileUpload = new FileStream(SaveFilePath, FileMode.Create); ///2.定义实际文件对象,保存上载的文件。
                memoryStream.WriteTo(fileUpload); ///3.把内存流里的数据写入物理文件
                memoryStream.Close();
                fileUpload.Close();
                fileUpload = null;
                memoryStream = null;
                return "成功";
            }
            catch
            {
                return "失败";
            }
        }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值