Xamarin Android: Create Your Own Android Camera App

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.
 
 


Similar Articles