Xamarin.Android 的照相機使用

Android 提供了不少硬體功能。其中照相機功能更是兵家必爭之地。
甚至爆發如「三星門」等事件。不過本篇文章的目的只呼叫Android系統定義的API,取得相片後顯示出來。

現在我們先引入幾個 Android 負責處理 Camera 的命名空間。
當然會多些,不過要是在 Visual Studio 內開發的同學,很快就可以用工具移除。

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;

using Android.OS;
using Android.App;
using Android.Views;
using Android.Widget;
using Android.Content;
using Android.Runtime;
using Android.Graphics;
using Android.Provider;
using Android.Content.PM;

using Java.IO;

using Environment = Android.OS.Environment;
using Uri = Android.Net.Uri;

我們先檢查硬體配備是否已準備好?

private bool IsThereAnAppToTakePictures ()
{
  Intent intent = new Intent (MediaStore.ActionImageCapture);
   IList<ResolveInfo> availableActivities = PackageManager.QueryIntentActivities (intent, PackageInfoFlags.MatchDefaultOnly);
   return availableActivities != null && availableActivities.Count > 0;
}

特別請大家注意

Intent intent = new Intent (MediaStore.ActionImageCapture);

在這邊我們使用系統提供的 Intent 來取得照相機的功能。

然後我們準備存儲目錄

private void CreateDirectoryForPictures ()
{
    App._dir = new File (
    Environment.GetExternalStoragePublicDirectory ( Environment.DirectoryPictures), "AndroidTips");
    if (!App._dir.Exists ())
    {
        bool result =App._dir.Mkdirs( );
        Debug.WriteLine ("mkdir:" + result);
    }
}      

準備處理 Bitmap 的方法(改變大小確保能按比例顯示)

public static class BitmapHelpers
{
  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);

       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;
  }
}

準備回調的方法

protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult (requestCode, resultCode, data);

    // Make it available in the gallery

    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 = resultImageView.Height ;
    App.bitmap = App._file.Path.LoadAndResizeBitmap (width, height);
    if (App.bitmap != null) {
        resultImageView.SetImageBitmap (App.bitmap);

        Debug.WriteLine ("contentUri:" + contentUri);

        App.bitmap = null;
    }

    // Dispose of the Java side bitmap.
    GC.Collect();
}

如此即可快速調用照相機的功能。

參考資料:https://developer.xamarin.com/recipes/android/other_ux/camera_intent/take_a_picture_and_save_using_camera_app/

时间: 04-16

Xamarin.Android 的照相機使用的相关文章

Xamarin.iOS 照相機功能的使用 (1) :最簡單的做法

iOS 提供我們幾種不同的方法使用照相機並且儲存於相簿. Xamarin.iOS 當然也可以很快地使用這樣的方法,使用照相機功能. 在這之前我們可以先稍微了解一下基本結構,如下圖. 若是有DirectX (DirectInput) 或是OpenGL ES 操作經驗的朋友就可以發現基本上的概念並沒有差很多.都是從獲取device開始,到準備好接收輸出的 byte[] 並管理,到決定輸出的格式為何. 我們現在先使用最簡單的 UIImagePickerController 來實現照相機功能 btnUI

Xamarin.Android绑定库分享

使用Xamarin.Android时,会用到各种第三方库,而这些库基本上是java编写的,要在Xamarin.Android中使用这些库,就需要通过Android Binding Project绑定对应的java库,然后在C#中使用.绑定时,可能需要编写相关的转换规则或者修改对应的java源代码,遇到问题时,可以到Xamarin的官网查看,也可以Google. Xamarin.Android绑定参考文档地址: http://developer.xamarin.com/guides/android

跨过几个坑,终于完成了我的第一个Xamarin Android App!

时间过得真快,距离上次发随笔又是一年多.作为上次发的我的第一个WP8.1应用总结的后继,这次同样的主要功能,改为实现安卓版APP.前几个月巨硬收购Xamarin,把Xamarin集成到VS里了,大大方便了我广大.net码农.由于年初脱了WP的坑,换了个安卓低端机,想着什么时候装Xamarin开发个App玩玩. 上个月笔记本100G的C盘莫名其妙快满了,趁着重装系统的机会,安装了VS2015 with sp3,下载开发Android App需要的各种东东.这里要感谢[C#]VS2015开发环境的安

Xamarin.Android开发实践(十七)

Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定位,从而使我们的生活更加方便,所以本章我们将学习如何在Xamarin中进行定位的开发. 二.准备工作 因为我们的虚拟机是运行在电脑本地的,自然就没法进行定位了,但是我们可以借助DDMS这个工具帮助我们去调试. 首先要确定你的Android SDK所在的目录,读者可以通过以下方式找到: 工具->选项 然后读者打开该文件夹下的tools文件夹,我们就可以看到里面有很多以bat结果的文件,这个时候我们打开

Xamarin.Android中使用ResideMenu实现侧滑菜单

上次使用Xamarin.Android实现了一个比较常用的功能PullToRefresh,详情见:Xamarin. Android实现下拉刷新功能 这次将实现另外一个手机App中比较常用的功能:侧滑菜单.通过搜索,发现有很多侧滑菜单,有仿手机QQ的侧滑菜单,有折叠的侧滑菜单,有SlidingMenu等,不过我还是比较喜欢 ResideMenu实现的效果,所以想通过Xamarin.Android的绑定实现该效果.这次实现该菜单遇到的问题比较多,花的时间也较多,花了三四个晚上才解决所有的问题.下面是

xamarin.android 绑定百度地图SDK遇到的问题

在 xamarin.android 绑定项目中,绑定 百度地图的LBS地图SDK,参考 https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-jar/ 设置好后,编译,  然后提示错误,其中一个错误 是 意思就是说转换 出来的CS 代码中,有重复的 类型. 理论上来说,转换的 CS 代码 是不应该出现重复代码的,有重复,意味这 jar有重复代码. 然后查看 百度地

张高兴的 Xamarin.Android 学习笔记:(一)环境配置

最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多.我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了.由于手头没啥中文资料,我也是自己摸索出来的,而且我对 Android 也只是处于最开始的了解阶段(学习笔记嘛,别学边写嘛╮(╯▽╰)╭),难免会出现错误,有问题大家共同讨论(毕竟 .Net 就要靠我们腾达了). 以 Visual Studio 2015 Community 为例. 1. 安装 Xam

Xamarin Android自学和实践步骤

一.入门(已完成) 1.学习Xamarin Android项目的基本结构 2.学习界面布局的基本方式 3.学习基本编码规则 4.学习页面跳转和传值 5.学习对话框和提示信息显示方法 6.学习使用系统剪贴板 7.学习使用系统接口选择照片或文件 8.学习使用系统接口分享数据或链接 9.学习扫描和识别图像二维码 二.调用本机数据库 三.与服务器交互 四.推送信息 五.调用GPS和蓝牙等

Xamarin.Android和UWP之MVVM的简单使用(一)

0x01 前言 就目前而言,MVVM可以说是挺流行的,无论是web端还是移动端,web端的主要代表angularjs,avalonjs等, 移动端(xamarin,uwp)的代表应该是mvvmlight,mvvmcross等, 我们的主题是移动端,所以主要讲mvvmlight,mvvmcross,这篇主要讲MvvmLight,下篇讲MvvmCross. 还是以Demo的形式来谈使用. 0x02 简单的MVVM(mvvmlight) Demo 先来个web版最简单的MVVM效果,然后在按xamar