Azure Cognitive Services Проблема доступа к Xamarin.Forms - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с Microsoft Azure Cognitive Services.

Когда я фотографирую на телефоне с помощью камеры, по умолчанию она сохраняется в пути:

DCIM / Camera

, но когда я фотографирую с помощью своего приложения, оно сохраняется в

Встроенное хранилище / Изображения / температура

Краткоеописание ситуации:

1) Я делаю фотографии, используя камеру по умолчанию, и я могу открыть ее в своем приложении, используя Plugin.Media, и MCS отлично работает, код:

private async void btnPick_Clicked(object sender, EventArgs e)
        {
            await CrossMedia.Current.Initialize();

            var file = await CrossMedia.Current.PickPhotoAsync(new PickMediaOptions());
            Image = ImageSource.FromStream(() => file.GetStream());

            var result = client.RecognizeTextAsync(file.GetStream()).Result;
            var words = from r in result.Regions
                        from l in r.Lines
                        from w in l.Words
                        select w.Text;

            OutputText = string.Join(" ", words.ToArray());

            await Navigation.PushAsync(new TextFromPhoto(OutputText, Image));
        }

2) Когда я фотографирую, используя свое приложение, используя этот код:

private async void btnTake_Clicked(object sender, EventArgs e)
        {
            await CrossMedia.Current.Initialize();

            if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            {
                await DisplayAlert("No Camera", ":( No camera available.", "OK");
                return;
            }

            var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
            {
                SaveToAlbum = true
            });

            Image = ImageSource.FromStream(() => file.GetStream());


            var myStream = file.GetStream();

            var result = client.RecognizeTextAsync(myStream).Result;
            var words = from r in result.Regions
                        from l in r.Lines
                        from w in l.Words
                        select w.Text;

            OutputText = string.Join(" ", words.ToArray());

            await Navigation.PushAsync(new TextFromPhoto(OutputText, Image));
        }

Приложение переходит в режим прерывания, и разрыв начинается на этой строке:

                var result = client.RecognizeTextAsync(myStream).Result;

Эта строка работала в предыдущем методе

Вот 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.OCRScannerForms.Android" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />

  <uses-permission android:name="android.permission.CAMERA"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  <application android:label="OCRScannerForms.Android">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>
</manifest>

А вот Resources/xml/file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-files-path name="my_images" path="Pictures" />
  <external-files-path name="my_movies" path="Movies" />
</paths>

Интересно, что яЯ не могу открыть в моем приложении, фотография, сделанная ранее в моем приложении.

Я подозреваю, что проблема с пути к фотографии, но я не могу 'отремонтировать это

1 Ответ

0 голосов
/ 18 октября 2018

Вы должны использовать новые Computer Vision API вместо Microsoft.ProjectOxford.Vision

Например:

    private async void btnTake_Clicked(object sender, EventArgs e)
    {
        await CrossMedia.Current.Initialize();

        if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
        {
            await DisplayAlert("No Camera", ":( No camera available.", "OK");
            return;
        }

        var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions
        {
            SaveToAlbum = true,
            PhotoSize = PhotoSize.Small
        });

        var Image = ImageSource.FromStream(() => file.GetStream());


        var client = new HttpClient();
        var queryString = HttpUtility.ParseQueryString(string.Empty);

        // Request headers
        client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

        // Request parameters
        queryString["mode"] = "Printed";

        var uri = "https://eastus.api.cognitive.microsoft.com/vision/v2.0/recognizeText?" + queryString;

        HttpResponseMessage response;

        var myStream = file.GetStream();

        BinaryReader binaryReader = new BinaryReader(myStream);
        var byteData = binaryReader.ReadBytes((int)myStream.Length);

        using (var content = new ByteArrayContent(byteData))
        {
            content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            response = await client.PostAsync(uri, content);
        }

        string operationLocation = "";
        operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();
        string contentString;
        int i = 0;
        do
        {
            System.Threading.Thread.Sleep(1000);
            response = await client.GetAsync(operationLocation);
            contentString = await response.Content.ReadAsStringAsync();
            ++i;
        }
        while (i < 10 && contentString.IndexOf("\"status\":\"Succeeded\"") == -1);

        Label1.Text = JToken.Parse(contentString).ToString();
    }

И результат:

Demo result

Пожалуйста, проверьте следующую ссылку для получения дополнительной информации: https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/587f2c6a154055056008f200

...