Step 1- Open Visual Studio->New Project->Templates->Visual C#->Android->Blank app.

Select Blank app. Give project name and project location.

Blank App

Step 2- Open Solution Explorer-> Project Name->Resources->Layout->Main.axml. Click Open Design View.

Step 3- Go to Tool bar, select button and ImageView. Drag and drop Main.xaml design view.

CODE
Step 4- Go to Solution Explorer-> Project Name. Right click to Add->Class, followed by opening new Dialog box. This dialog box is required to select the class and give name for BitmapHelpers.cs.

Class

Step 5- Open Solution Explorer-> Project Name->Resources-> BitmapHelpers.cs. This class is reducing the image size and recycling the memory. It will be used to calculate an image ratio.

Code

C# Code

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Android.App;
  6. using Android.Content;
  7. using Android.OS;
  8. using Android.Runtime;
  9. using Android.Views;
  10. using Android.Widget;
  11. using Android.Graphics;
  12. using Android.Graphics.Drawables;
  13. namespace Camera {
  14. public static class BitmapHelpers {
  15. /// This method will recyle the memory help by a bitmap in an ImageView
  16. public static void RecycleBitmap(this ImageView imageView) {
  17. if (imageView == null) {
  18. return;
  19. }
  20. Drawable toRecycle = imageView.Drawable;
  21. if (toRecycle != null) {
  22. ((BitmapDrawable) toRecycle).Bitmap.Recycle();
  23. }
  24. }
  25. /// Load the image from the device, and resize it to the specified dimensions.
  26. public static Bitmap LoadAndResizeBitmap(this string fileName, int width, int height) {
  27. // First we get the the dimensions of the file on disk
  28. BitmapFactory.Options options = new BitmapFactory.Options {
  29. InPurgeable = true,
  30. InJustDecodeBounds = true
  31. };
  32. BitmapFactory.DecodeFile(fileName, options);
  33. // Next we calculate the ratio that we need to resize the image by
  34. // in order to fit the requested dimensions.
  35. int outHeight = options.OutHeight;
  36. int outWidth = options.OutWidth;
  37. int inSampleSize = 1;
  38. if (outHeight > height || outWidth > width) {
  39. inSampleSize = outWidth > outHeight ? outHeight / height : outWidth / width;
  40. }
  41. // Now we will load the image and have BitmapFactory resize it for us.
  42. options.InSampleSize = inSampleSize;
  43. options.InJustDecodeBounds = false;
  44. Bitmap resizedBitmap = BitmapFactory.DecodeFile(fileName, options);
  45. return resizedBitmap;
  46. }
  47. }
  48. }
Step 6- Open Solution Explorer-> Project Name->Resources-> MainActicity.cs. Add NameSpace, given below-
  1. using Android.Provider;
  2. using Java.IO;
  3. using Android.Graphics;
  4. using Android.Content.PM;
  5. using Uri = Android.Net.Uri;
  6. using System.Collections.Generic;
Step 7- First, declare the button, image variables and open Oncreate(). The code is given below-

Code
C# Code
  1. Button BtnTakeImg;
  2. ImageView ImgView;
  3. public static File _file;
  4. public static File _dir;
  5. protected override void OnCreate(Bundle bundle)
  6. {
  7. base.OnCreate(bundle);
  8. // Set our view from the "main" layout resource
  9. SetContentView(Resource.Layout.Main);
  10. if (IsThereAnAppToTakePictures()) {
  11. CreateDirectoryForPictures();
  12. BtnTakeImg = FindViewById < Button > (Resource.Id.btntakepicture);
  13. ImgView = FindViewById < ImageView > (Resource.Id.ImgTakeimg);
  14. BtnTakeImg.Click += TakeAPicture;
  15. }
  16. }
Step 8- We create IsThereAnAppToTakePictures() and CreateDirectoryForPictures().

Step 9- Here, CreateDirectoryForPictures () is to be used to create separate folder for our image. IsThereAnAppToTakePictures() is redirecting to Android Camera path.

Code
Code

C# Code
  1. private void CreateDirectoryForPictures() {
  2. _dir = new File(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryPictures), "C#Corner");
  3. if (!_dir.Exists()) {
  4. _dir.Mkdirs();
  5. }
  6. }
  7. private bool IsThereAnAppToTakePictures() {
  8. Intent intent = new Intent(MediaStore.ActionImageCapture);
  9. IList < ResolveInfo > availableActivities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
  10. return availableActivities != null && availableActivities.Count > 0;
  11. }
  12. private void TakeAPicture(object sender, EventArgs eventArgs) {
  13. Intent intent = new Intent(MediaStore.ActionImageCapture);
  14. _file = new File(_dir, string.Format("Image_{0}.jpg", Guid.NewGuid()));
  15. intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(_file));
  16. StartActivityForResult(intent, 102);
  17. }
  18. protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) {
  19. if (requestCode == 102 && resultCode == Result.Ok) {
  20. // make it available in the gallery
  21. Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
  22. Uri contentUri = Uri.FromFile(_file);
  23. mediaScanIntent.SetData(contentUri);
  24. SendBroadcast(mediaScanIntent);
  25. //Converstion Image Size
  26. int height = ImgView.Height;
  27. int width = Resources.DisplayMetrics.WidthPixels;
  28. using(Bitmap bitmap = _file.Path.LoadAndResizeBitmap(width, height)) {
  29. //View ImageView
  30. ImgView.RecycleBitmap();
  31. ImgView.SetImageBitmap(bitmap);
  32. //Upload Image in Database
  33. }
  34. }
  35. }
Step 10-Finally, give the permission AndroidManifest.XML, stated below-
  1. <uses-permission android:name="android.permission.CAMERA" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Step 11- Press F5 or build and run the Application.


Step 12-
After running the Application, go and check gallery. See the last captured picture. Finally, we successfully created Xamarin Android, using our own camera app and showing Imageview last captured image.