Use Barcode Scanner + with intent from Xamarin Android app
Categories:
Integrate Barcode Scanning with Intents in Xamarin.Android

Learn how to seamlessly integrate barcode scanning into your Xamarin.Android application using external barcode scanner apps via Android Intents, focusing on popular solutions like ZXing.
Integrating barcode scanning functionality into mobile applications is a common requirement for various use cases, from inventory management to retail point-of-sale systems. While you can embed a full-fledged barcode scanning library directly into your Xamarin.Android app, a simpler and often more efficient approach is to leverage existing barcode scanner applications installed on the user's device through Android Intents. This method reduces your app's footprint and development complexity, relying on robust, dedicated scanner apps like ZXing's Barcode Scanner.
Understanding Android Intents for Barcode Scanning
Android Intents are powerful messaging objects that allow different components of an application or even different applications to communicate with each other. For barcode scanning, we can use an implicit intent to request that an installed barcode scanner application perform a scan and return the result to our app. The most widely adopted standard for this is the com.google.zxing.client.android.SCAN
intent action, popularized by the ZXing Barcode Scanner app.
sequenceDiagram participant App as Xamarin.Android App participant Scanner as Barcode Scanner App participant Android as Android OS App->>Android: Create Intent (SCAN action) Android->>Scanner: Start Activity (Intent) Scanner-->>Scanner: User Scans Barcode Scanner->>Android: Set Result (OK, Data) Android->>App: OnActivityResult (RequestCode, ResultCode, Data) App-->>App: Process Scanned Data
Sequence diagram illustrating the intent-based barcode scanning process.
Implementing Intent-Based Scanning in Xamarin.Android
To initiate a barcode scan and receive its result, you'll typically follow these steps:
- Create an Intent: Instantiate an
Intent
object with thecom.google.zxing.client.android.SCAN
action. - Add Extras (Optional): You can pass extra parameters to the scanner app, such as
SCAN_MODE
(e.g.,QR_CODE_MODE
,PRODUCT_MODE
) to specify the type of barcode to scan. - Start Activity for Result: Use
StartActivityForResult
to launch the scanner app, expecting a result back. - Handle Result: Override
OnActivityResult
in your Activity to process the scanned data when the scanner app returns.
using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;
namespace BarcodeScannerApp
{
[Activity(Label = "BarcodeScannerApp", MainLauncher = true)]
public class MainActivity : Activity
{
private const int SCAN_REQUEST_CODE = 1001;
private TextView _resultTextView;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);
_resultTextView = FindViewById<TextView>(Resource.Id.resultTextView);
Button scanButton = FindViewById<Button>(Resource.Id.scanButton);
scanButton.Click += (sender, e) => StartBarcodeScan();
}
private void StartBarcodeScan()
{
var intent = new Intent("com.google.zxing.client.android.SCAN");
// Optional: Specify scan mode, e.g., QR_CODE_MODE, PRODUCT_MODE
// intent.PutExtra("SCAN_MODE", "QR_CODE_MODE");
// Check if a scanner app is available to handle the intent
if (intent.ResolveActivity(PackageManager) != null)
{
StartActivityForResult(intent, SCAN_REQUEST_CODE);
}
else
{
Toast.MakeText(this, "No barcode scanner app found. Please install one.", ToastLength.Long).Show();
// Optionally, direct user to Play Store to install ZXing Barcode Scanner
// var marketIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("market://details?id=com.google.zxing.client.android"));
// StartActivity(marketIntent);
}
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == SCAN_REQUEST_CODE)
{
if (resultCode == Result.Ok)
{
string contents = data.GetStringExtra("SCAN_RESULT");
string format = data.GetStringExtra("SCAN_RESULT_FORMAT");
_resultTextView.Text = $"Scanned: {contents} (Format: {format})";
Toast.MakeText(this, $"Scanned: {contents}", ToastLength.Short).Show();
}
else if (resultCode == Result.Canceled)
{
_resultTextView.Text = "Scan cancelled.";
Toast.MakeText(this, "Scan cancelled.", ToastLength.Short).Show();
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/scanButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Scan Barcode" />
<TextView
android:id="@+id/resultTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Scan result will appear here" />
</LinearLayout>
Handling Scanner App Availability
A crucial aspect of using intent-based scanning is gracefully handling scenarios where no compatible barcode scanner app is installed on the user's device. As shown in the code example, you should always check if an activity can resolve your intent using intent.ResolveActivity(PackageManager) != null
. If no app is found, you can inform the user and optionally provide a link to the Google Play Store to install a recommended scanner, such as the ZXing Barcode Scanner.
1. Set up your Xamarin.Android Project
Create a new Xamarin.Android project in Visual Studio. Ensure your MainActivity.cs
and Resources/layout/Main.axml
files are configured as shown in the examples.
2. Implement the Scan Logic
Copy the C# code into your MainActivity.cs
file. This includes the StartBarcodeScan()
method to initiate the intent and the OnActivityResult()
override to handle the scan results.
3. Design the User Interface
Update your Main.axml
layout file to include a Button
to trigger the scan and a TextView
to display the results.
4. Test on a Device
Deploy your application to an Android device. First, test without a barcode scanner app installed to verify the 'No app found' message. Then, install a compatible app (e.g., ZXing Barcode Scanner from the Play Store) and test the scanning functionality.