zoukankan      html  css  js  c++  java
  • Xamarin.Android 调用手机拍照功能

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

  • 相关阅读:
    SAP MM 采购附加费计入物料成本之二
    SAP MM 采购附加费计入物料成本?
    SAP MM 作为采购附加费的运费为啥没能在收货的时候计入物料成本?
    SAP MM 外部采购流程里的Advanced Return Management
    SAP MM 外部采购流程里的如同鸡肋一样的Advanced Returns Management功能
    SAP MM Why is the freight not included in the material cost at the time of GR?
    SAP MM: Change of material moving average price after goods receipt and invoice verification posting for PO
    SAP 创建启用了ARM功能的采购订单,报错 Shipping processing is not selected to supplier 100057 in purchase org. 0002
    GIT·代码仓库默认分支更改
    .Net/C#·运行报错缺少XXX文件,但双击无法跳转缺少位置
  • 原文地址:https://www.cnblogs.com/swjian/p/9033714.html
Copyright © 2011-2022 走看看