C#开发Android移动应用系列之调用手机摄像头拍照

By jerryxjr1220 at 2023-08-17 • 0人收藏 • 330人看过

继续分享通过Xamarin开发Android应用的案例:调用手机摄像头拍照

  1. 新建一个内容页Page3并通过路由注册,方法与之前相同,略过

  2. 在内容页Page3.xaml上放一个Image和一个Button

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="XamarinApp1.Views.Page3">
    <ContentPage.Content>
        <StackLayout>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="500"></RowDefinition>
                </Grid.RowDefinitions>
                <Image Source="" x:Name="imageview" Grid.Row="0" HeightRequest="500" WidthRequest="500"/>
            </Grid>
            <Button Text="Shoot" Clicked="Button3_Clicked"/>

        </StackLayout>
    </ContentPage.Content>
</ContentPage>

3. 在Page3.xaml.cs上编写按钮点击事件

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

using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using Xamarin.Essentials;
using System.IO;
using XamarinApp1.ViewModels;

namespace XamarinApp1.Views
{
	[XamlCompilation(XamlCompilationOptions.Compile)]
	public partial class Page3 : ContentPage
	{
       
		public Page3 ()
		{
			InitializeComponent ();
        
		}

		public async void Button3_Clicked(object sender, EventArgs e)
		{
            // 检查是否支持相机
            if (!MediaPicker.IsCaptureSupported)
            {
                await DisplayAlert("Error", "相机不可用", "OK");
                return;
            }

            // 获取图像
            var options = new MediaPickerOptions
            {
                Title = "拍照"
            };
            var photo = await MediaPicker.CapturePhotoAsync(options);

            // 获取图像的字节数据
            using (var stream = await photo.OpenReadAsync())
            {
                var buffer = new byte[stream.Length];
                await stream.ReadAsync(buffer, 0, (int)stream.Length);

                // 这里可以对图像数据进行处理

                // 显示图像
                var im = new Image { Source = ImageSource.FromStream(() => new MemoryStream(buffer)) };
                // 将图像显示在你的界面上
                imageview.Source = im.Source;
            }
        }

	}

	
}

4. 要调用手机摄像头需设置手机权限,在Properties下的AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.xamarinapp1" android:installLocation="preferExternal">
	<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
	<application android:label="XamarinApp1.Android" android:theme="@style/MainTheme"></application>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.BATTERY_STATS" />
	<uses-permission android:name="android.permission.CAMERA" />
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

5. 在MainActivity.cs中处理权限请求

using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;
using AndroidX.Core.App;
using Android;

namespace XamarinApp1.Droid
{
    [Activity(Label = "XamarinApp1", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        const int RequestStorageWriteId = 0; // 这里的值可以是任意整数,只要确保唯一就可以

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // 请求存储写入权限
            if (CheckSelfPermission(Manifest.Permission.WriteExternalStorage) != (int)Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage }, RequestStorageWriteId);
            }
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            
        }
    }
}

screenshots.gif

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...