专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-963-0016      微信咨询  |  联系我们

Xamarin.Android 调用手机拍照功能

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:57:11       共计:3659 浏览

最近开发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

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:Xamarin Android入门(服务、数据存储) | ·下一条:基于SuperSocket实现客户端与客户端的消息推送以及服务端与客户端互发心跳数据包维持长连接、离线消息存储并转发,涉及技术点:C# WinForm、SuperSocket、Redis

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有