Maui Blazor はカメラ実装を使用します


# Maui Blazor はカメラを使用して達成します

Maui Blazor のインターフェースは WebView でレンダリングされるため、Android カメラを使用する場合は取得できません ネイティブカメラはインターフェースコンポーネントにバインドする必要があるため、他の実装方法を探しました WebView 経由でデバイスのカメラを呼び出す js を使用するマルチサポート・プラットフォームの
互換性 現時点では Android と PC がテストされていますが、ioc と mac がないためテストできませんが、互換性がある可能性が高く、動的に許可を申請する必要がある可能性があります。

## 1. js メソッドの追加
wwwroot に `helper.js` ファイルを作成し、次の 2 つの js 関数を追加し
、`index.html` に `<script src="helper.js"></script> を追加します。 js

```js

/**
 * 要素の src を設定します
 * @param {any} CanvasId CanvasId dom id
 * @param {any} videoId ビデオ dom id
 * @param {any} srcId img dom id
 * @param {any} widht setscreenshot width
 * @param {any} height スクリーンショットの高さを設定します
 */
function setImgSrc(dest,videoId, srcId, width, height) {     let video = document.getElementById(videoId);     let Canvas = document.getElementById(canvasId);     console.log ( video.clientHeight, video.clientWidth);     Canvas.getContext('2d').drawImage(video, 0, 0, width, 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) (ストリーム) {             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();             };             //鏡像












            video.style.webkitTransform = "scaleX(-1)";
            video.style.transform = "スケールX(-1)";
        });
    }
}
```

次に各プラットフォームの互換性

アンドロイド:

プラットフォーム/Android/AndroidManifest.xml ファイルの内容

```xml
<?xml version="1.0"coding="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" " />
    
    <!-- アプリが Android 5.0 (API レベル 21) 以降をターゲットとする場合にのみ必要です。-->
    <uses-feature android:name="android.hardware.location.gps" />

    <クエリ
        > <イン
            テント> <アクション android:name="android.intent.action.VIEW" />
            <データ android:scheme="http"/>
        </intent> <イン
        テント>
            <アクション android:name="android.インテント.アクション.VIEW" />
            <data android:scheme="https"/>
        </intent>
    </queries>
</manifest>
```

Platforms/Android/MainActivity.cs ファイルの内容

```c#
[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 ファイルの内容

```c#
#Android.Webkit を使用した ANDROID の場合
;
Microsoft.AspNetCore.Components.WebView.Maui を使用します。

名前空間 MainSamp;

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(プラットフォームビュー);     } }





#endif
```

次のコードを `MauiProgram.cs` に追加します。次のコードがない場合、カメラのアクセス許可がなく、
これはこの [問題](https://github.com/dotnet/maui/issues/3694) に反映されています。

```c#

#if ANDROID
        builder.ConfigureMauiHandlers(handlers =>
        {             handlers.AddHandler<IBlazorWebView, MauiBlazorWebViewHandler>();         }); #endif ```



上記は Android 用の適応コードです PC では追加のコードを設定する必要はありません Ios と Mac は不明です

次にインターフェースを書きます

```razor
@page "/" @*インターフェイスルーティング*@

@inject IJSRuntime JSRuntime @*注入jsRuntime*@

@if(OpenCameraStatus) @*カメラが開いていないときはビデオを表示しません*@ {
<     video id="@VideoId" width="@widht" height="@height" />     <canvas class="d-none " id="@CanvasId" width="@widht" height="@height" /> } < button @οnclick="" style="margin:8px">カメラを開く</button>  @*カメラを開く必要があるためユーザー手動トリガー インターフェースがスライドして入る場合、カメラを開くメソッドを直接呼び出すことができないため、トリガーするボタンを追加します *@ <button style="margin:8px" >スクリーンショット</button> @*Take aビデオストリームの画像*@





<img id="@ImgId" />

@code{     プライベート文字列 CanvasId;     プライベート文字列 ImgId;     プライベート文字列ビデオID;     private bool OpenCameraStatus;     プライベート int 幅 = 320;     プライベート int 高さ = 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");         Base.OnInitializedAsync() を待ちます。     }





    private async Task Screenshot()
    {         await JSRuntime.InvokeAsync<String>("setImgSrc", CanvasId,VideoId, ImgId, width, height);     } } ```



次に、プログラムを実行して効果を確認します。

サンプルコード: [gitee](https://gitee.com/hejiale010426/main-sample) [gi​​thub](https://github.com/239573049/main-sample)

トークンを持ってシェアしに来てください

技術交流グループ:737776595

おすすめ

転載: blog.csdn.net/xiaohucxy/article/details/128654918