Получить фотографию с камеры и сохранить ее в SQL Server с помощью Xamarin.Android - PullRequest
0 голосов
/ 02 октября 2019

Я новичок в Xamarin. Android. Я использую Visual Studio 2017 для разработки приложений для Android.

Мне нужно захватить изображение через камеру, что я сделал следующим образом:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {

            base.OnActivityResult(requestCode, resultCode, data);
            if (resultCode == Result.Ok)
            {
                Bitmap bitmap = (Bitmap)data.Extras.Get("data");
                Photo.SetScaleType(ImageView.ScaleType.FitCenter);
                Photo.SetImageBitmap(bitmap);
            }
        Snap.Click += (sender, e) =>
            {
                Intent intent = new Intent(MediaStore.ActionImageCapture);
                StartActivityForResult(intent, 0);
            };

Теперь проблема в том, что я хочу сохранить / вставить эту фотографию (растровое изображение) на сервер Sqlтаблицы в столбце типа Изображение, чтобы я мог отобразить это фото в приложении Windows Form и в дальнейшем использовать его в отчетах Crystal.

1 Ответ

0 голосов
/ 03 октября 2019

Подключение к SQL Server напрямую из приложения - ужасная практика, и вместо этого им следует управлять с помощью веб-службы, поскольку очень легко декодировать двоичные файлы APK или IPA. Затем пользователь может просто уничтожить вашу базу данных SQL. Вот почему вы не найдете учебных пособий о том, как это сделать.

При этом, когда вы начинаете захват изображения, ваш код будет выглядеть примерно так: StartActivityForResult(intent, save_request_code);

А затемВы должны переопределить функцию OnActivityResult, которая вызывается после того, как снимок сделан (или выбран из галереи). Если действие было успешным, мы создаем байтовый массив и передаем его в SQL

private const int save_request_code = 7; // You can use any integer

// "protected override void OnActivityResult(int requestCode, int resultCode, Intent data)" depending on your Android support library version
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) 
{
    base.OnActivityResult(requestCode, resultCode, data);
    switch (requestCode)
    {
        case save_request_code:
            switch ((Result)resultCode) // (Result) conversion not needed if it is already a Result object above 
            {
                case Result.Canceled:
                    break;
                case Result.FirstUser:
                    break;
                case Result.Ok:
                    {
                        try
                        {
                            Bitmap bitmap = MediaStore.Images.Media.GetBitmap(this.ContentResolver, data.Data);
                            using (MemoryStream stream = new MemoryStream())
                            {
                                bitmap.Compress(Bitmap.CompressFormat.Jpeg,100, stream);
                                byte[] array=stream.ToArray();
                                SqlConnection CN = new SqlConnection(txtConnectionString.Text);
                                string qry = "insert into ImagesStore(OriginalPath,ImageData) values(@OriginalPath, @ImageData)";
                                SqlCommand SqlCom = new SqlCommand(qry, CN);
                                SqlCom.Parameters.Add(new SqlParameter("@OriginalPath", (object)txtImagePath.Text));
                                SqlCom.Parameters.Add(new SqlParameter("@ImageData", (object)imageData));
                                CN.Open();
                                SqlCom.ExecuteNonQuery();
                                CN.Close();

                            }

                        }
                        catch (Exception ex)
                        {
                            System.Console.WriteLine (ex.Message)
                        }

                    }
                default:
                    throw new ArgumentOutOfRangeException("resultCode");
            }
            break;
    }
}

Также кажется, что вы не дали приложению разрешение на чтение данных телефона, поэтому вы делаете это, добавляя этов файл манифеста:

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

Опять же, пожалуйста, не запускайте этот код в производство без использования веб-службы.

...