我是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);
};
现在的问题是,我想将此照片(位图)保存/插入列类型为Image的Sql Server表中,以便可以在Windows窗体应用程序中显示此照片,并在Crystal报表中进一步使用它。
直接从App连接到SQL Server是一种糟糕的做法,应该由Web服务来管理,因为解码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;
}
}
同样,请不要在不使用Web服务的情况下将此代码投入生产。