網站首頁 編程語言 正文
由于Maui Blazor中界面是由WebView渲染,所以再使用Android的攝像頭時無法去獲取,因為原生的攝像頭需要綁定界面組件
所以我找到了其他的實現方式,通過WebView使用js調用設備攝像頭 支持多平臺兼容目前測試了Android 和PC 由于沒有ioc和mac無法測試 大概率是兼容可能需要動態申請權限
1. 添加js方法
我們再wwwroot中創建一個helper.js
的文件并且添加以下倆個js函數
再index.html
中添加<script src="helper.js"></script>
引入js
/** * 設置元素的src * @param {any} canvasId canvasId的dom id * @param {any} videoId video的dom id * @param {any} srcId img的dom id * @param {any} widht 設置截圖寬度 * @param {any} height 設置截圖高度 */ function setImgSrc(dest,videoId, srcId, widht, height) { let video = document.getElementById(videoId); let canvas = document.getElementById(canvasId); console.log(video.clientHeight, video.clientWidth); canvas.getContext('2d').drawImage(video, 0, 0, widht, height); canvas.toBlob(function (blob) { var src = document.getElementById(srcId); src.setAttribute("height", height) src.setAttribute("width", widht); src.setAttribute("src", URL.createObjectURL(blob)) }, "image/jpeg", 0.95); } /** * 初始化攝像頭 * @param {any} src */ function startVideo(src) { if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({ video: true }).then(function (stream) { let video = document.getElementById(src); if ("srcObject" in video) { video.srcObject = stream; } else { video.src = window.URL.createObjectURL(stream); } video.onloadedmetadata = function (e) { video.play(); }; //mirror image video.style.webkitTransform = "scaleX(-1)"; video.style.transform = "scaleX(-1)"; }); } }
然后各個平臺的兼容
android:
Platforms/Android/AndroidManifest.xml文件內容
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:supportsRtl="true"></application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!--相機權限--> <uses-permission android:name="android.permission.CAMERA" android:required="false"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--相機功能--> <uses-feature android:name="android.hardware.camera" /> <!--音頻錄制權限--> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!--位置權限--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. --> <uses-feature android:name="android.hardware.location.gps" /> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https"/> </intent> </queries> </manifest>
Platforms/Android/MainActivity.cs文件內容
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] public class MainActivity : MauiAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Platform.Init(this, savedInstanceState); // 申請所需權限 也可以再使用的時候去申請 ActivityCompat.RequestPermissions(this, new[] { Manifest.Permission.Camera, Manifest.Permission.RecordAudio, Manifest.Permission.ModifyAudioSettings }, 0); } }
MauiWebChromeClient.cs文件內容
#if ANDROID using Android.Webkit; using Microsoft.AspNetCore.Components.WebView.Maui; namespace MainSample; public class MauiWebChromeClient : WebChromeClient { public override void OnPermissionRequest(PermissionRequest request) { request.Grant(request.GetResources()); } } public class MauiBlazorWebViewHandler : BlazorWebViewHandler { protected override void ConnectHandler(Android.Webkit.WebView platformView) { platformView.SetWebChromeClient(new MauiWebChromeClient()); base.ConnectHandler(platformView); } } #endif
在MauiProgram.cs
中添加以下代碼;如果沒有下面代碼會出現沒有攝像頭權限
具體在這個?issue體現
#if ANDROID builder.ConfigureMauiHandlers(handlers => { handlers.AddHandler<IBlazorWebView, MauiBlazorWebViewHandler>(); }); #endif
以上是android的適配代碼 pc不需要設置額外代碼 ios和mac不清楚
然后編寫界面
@page "/" @*界面路由*@ @inject IJSRuntime JSRuntime @*注入jsRuntime*@ @if(OpenCameraStatus) @*在攝像頭沒有被打開的情況不顯示video*@ { <video id="@VideoId" width="@widht" height="@height" /> <canvas class="d-none" id="@CanvasId" width="@widht" height="@height" /> } <button @onclick="" style="margin:8px">打開攝像頭</button> @*因為攝像頭必須是用戶手動觸發如果界面是滑動進入無法直接調用方法打開攝像頭所以添加按鈕觸發*@ <button style="margin:8px">截圖</button> @*對視頻流截取一張圖*@ <img id="@ImgId" /> @code{ private string CanvasId; private string ImgId; private string VideoId; private bool OpenCameraStatus; private int widht = 320; private int height = 500; private async Task OpenCamera() { if (!OpenCameraStatus) { // 由于打開攝像頭的條件必須是用戶手動觸發如果滑動切換到界面是無法觸發的 await JSRuntime.InvokeVoidAsync("startVideo", "videoFeed"); OpenCameraStatus = true; StateHasChanged(); } } protected override async Task OnInitializedAsync() { // 初始化id ImgId = Guid.NewGuid().ToString("N"); CanvasId = Guid.NewGuid().ToString("N"); VideoId = Guid.NewGuid().ToString("N"); await base.OnInitializedAsync(); } private async Task Screenshot() { await JSRuntime.InvokeAsync<String>("setImgSrc", CanvasId,VideoId, ImgId, widht, height); } }
然后可以運行程序就可以看到我們的效果了
示例代碼:gitee?github
原文鏈接:https://www.cnblogs.com/hejiale010426/p/17045707.html
相關推薦
- 2022-09-29 Shell之function函數的定義及調用示例_linux shell
- 2022-12-04 C++?Boost?Graph算法超詳細精講_C 語言
- 2022-07-06 python如何實現質數求和_python
- 2022-04-20 Android實現將View轉化為圖片并保存到本地_Android
- 2022-07-21 SpringBoot批量下載壓縮包的實現
- 2022-09-27 Swift超詳細講解指針_Swift
- 2022-06-30 MongoDB排序時內存大小限制與創建索引的注意事項詳解_MongoDB
- 2023-04-20 react:理解“為了在回調中使用 `this`,這個綁定是必不可少的”
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支