隐藏

Xamarin.Android 调用手机拍照功能

发布:2021/10/26 17:02:44作者:管理员 来源:本站 浏览次数:839

最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~


实现思路:首先加载-->判断是否具备拍照功能-->创建图片目录(文件夹)-->点击拍照事件-->返回图片并绑定在控件上显示。


引用命名空间:

复制代码


   using System;

   using System.Collections.Generic;

   using Android.App;

   using Android.Content;

   using Android.Content.PM;

   using Android.Graphics;

   using Android.OS;

   using Android.Provider;

   using Android.Widget;

   using Java.IO;

   using Environment = Android.OS.Environment;

   using Uri = Android.Net.Uri;


复制代码


加载:

复制代码


protected override void OnCreate(Bundle bundle)

       {

           base.OnCreate(bundle);

           SetContentView(Resource.Layout.Main);

           

           if (IsThereAnAppToTakePictures())   //判断本设备是否存在拍照功能

           {

               CreateDirectoryForPictures();


               Button button = FindViewById<Button>(Resource.Id.myButton);

               _imageView = FindViewById<ImageView>(Resource.Id.imageView1);

               button.Click += TakeAPicture;

           }

       }


复制代码


判断是否具备拍照功能:

复制代码


       /// <summary>

       ///  判断是否具备拍照功能

       /// </summary>

       /// <returns></returns>

       private bool IsThereAnAppToTakePictures()

       {

           Intent intent = new Intent(MediaStore.ActionImageCapture);

           IList<ResolveInfo> availableActivities =

               PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);

           return availableActivities != null && availableActivities.Count > 0;

       }    


复制代码


创建图片目录(文件夹):

复制代码


       /// <summary>

       /// 创建目录图片

       /// </summary>

       private void CreateDirectoryForPictures()

       {

           App._dir = new File(

               Environment.GetExternalStoragePublicDirectory(

                   Environment.DirectoryPictures), "CameraAppDemo");        //CameraAppDemo

           if (!App._dir.Exists())

           {

               App._dir.Mkdirs();

           }

       }


复制代码


点击拍照事件:

复制代码


       /// <summary>

       /// 拍照

       /// </summary>

       /// <param name="sender"></param>

       /// <param name="eventArgs"></param>

       private void TakeAPicture(object sender, EventArgs eventArgs)

       {

           Intent intent = new Intent(MediaStore.ActionImageCapture);


           App._file = new File(App._dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));       //保存路径


           intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file));


           StartActivityForResult(intent, 0);

       }


复制代码


返回图片并绑定在控件上显示:

复制代码


       /// <summary>

       /// 拍照结束执行

       /// </summary>

       /// <param name="requestCode"></param>

       /// <param name="resultCode"></param>

       /// <param name="data"></param>

       protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)

       {

           base.OnActivityResult(requestCode, resultCode, data);


           Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);

           Uri contentUri = Uri.FromFile(App._file);

           mediaScanIntent.SetData(contentUri);

           SendBroadcast(mediaScanIntent);


           // Display in ImageView. We will resize the bitmap to fit the display

           // Loading the full sized image will consume to much memory

           // and cause the application to crash.


           int height = Resources.DisplayMetrics.HeightPixels;

           int width = _imageView.Height;


           //获取拍照的位图

           App.bitmap = App._file.Path.LoadAndResizeBitmap(width, height);

           if (App.bitmap != null)

           {

               //将图片绑定到控件上

               _imageView.SetImageBitmap(App.bitmap);


               //清空bitmap 否则会出现oom问题

               App.bitmap = null;

           }


           // Dispose of the Java side bitmap.

           GC.Collect();

       }


复制代码


LoadAndResizeBitmap方法:

复制代码


       public static Bitmap LoadAndResizeBitmap(this string fileName, int width, int height)

       {

           // First we get the the dimensions of the file on disk

           BitmapFactory.Options options = new BitmapFactory.Options { InJustDecodeBounds = true };

           BitmapFactory.DecodeFile(fileName, options);


           // Next we calculate the ratio that we need to resize the image by

           // in order to fit the requested dimensions.

           int outHeight = options.OutHeight;

           int outWidth = options.OutWidth;

           int inSampleSize = 1;


           if (outHeight > height || outWidth > width)

           {

               inSampleSize = outWidth > outHeight

                                  ? outHeight / height

                                  : outWidth / width;

           }


           // Now we will load the image and have BitmapFactory resize it for us.

           options.InSampleSize = inSampleSize;

           options.InJustDecodeBounds = false;

           Bitmap resizedBitmap = BitmapFactory.DecodeFile(fileName, options);


           return resizedBitmap;

       }


复制代码


App类:


   public static class App

   {

       public static File _file;

       public static File _dir;

       public static Bitmap bitmap;

   }


最后再附上下载地址:


链接: https://pan.baidu.com/s/1h0Zg1jkCyKrZKN6N5eIB8Q


密码: wgdm