我想从图库和相机中拍摄图片后显示图片,但是,我遇到了一个问题。我使用Xamarin Android native与c#进行开发。在这种情况下,我使用一个片段来显示我的图片。问题是,我不能覆盖 protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
. 我知道这个功能是用来发送图像并在图像视图中显示图像的。但是,错误说,没有找到合适的方法来覆盖。另外,我在 resultCode
和 ContentResolver
请帮助我。它让我疯狂。有什么帮助吗?
下面是我的完整代码。
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Provider;
using Android.Runtime;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;
using System;
using System.IO;
namespace MyPhotographicMemory.Droid.Fragments
{
public class Fragment_Picture : Android.Support.V4.App.Fragment
{
private Button btnUpload, btnChoose, btnCapture;
private ImageView imgView;
public Bitmap mBitMap;
private Android.Net.Uri filePath;
private const int PICK_IMAGE_REQUSET = 71;
private const int TAKE_IMAGE_REQUSET = 0;
private MemoryStream inputStream;
private ProgressBar progressBar;
public string URL { get; private set; }
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var ignored = base.OnCreateView(inflater, container, savedInstanceState);
var v = inflater.Inflate(Resource.Layout.FragmentPicture, null);
btnChoose = v.FindViewById<Button>(Resource.Id.btnChoose);
btnUpload = v.FindViewById<Button>(Resource.Id.btnUpload);
btnCapture = v.FindViewById<Button>(Resource.Id.btnCapture);
imgView = v.FindViewById<ImageView>(Resource.Id.imgView);
progressBar = v.FindViewById<ProgressBar>(Resource.Id.progressBar);
btnChoose.Click += BtnChoose_Click;
btnUpload.Click += BtnUpload_Click;
btnCapture.Click += BtnCapture_Click;
return v;
}
//button events
private void BtnCapture_Click(object sender, EventArgs e)
{
CaptureImage();
}
private void BtnUpload_Click(object sender, EventArgs e)
{
ContinueImage();
Busy();
}
private void BtnChoose_Click(object sender, EventArgs e)
{
ChooseImage();
}
//call
private void Busy()
{
btnCapture.Enabled = false;
btnChoose.Enabled = false;
btnUpload.Enabled = false;
progressBar.Visibility = Android.Views.ViewStates.Visible;
}
private void ContinueImage()
{
if (inputStream != null)
Upload(inputStream);
}
private void Upload(MemoryStream inputStream)
{
throw new NotImplementedException();
}
private void CaptureImage()
{
Intent intent = new Intent(MediaStore.ActionImageCapture);
StartActivityForResult(intent, 0);
}
private void ChooseImage()
{
Intent intent = new Intent();
intent.SetType("image/*");
intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(intent, "Select Picture"), PICK_IMAGE_REQUSET);
}
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUSET &&
resultCode == Result.Ok &&
data != null &&
data.Data != null)
{
filePath = data.Data;
try
{
mBitMap = MediaStore.Images.Media.GetBitmap(ContentResolver, filePath);
imgView.SetImageBitmap(mBitMap);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
bitmapData = stream.ToArray();
}
inputStream = new MemoryStream(bitmapData);
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
else if (requestCode == 0 &&
resultCode == Result.Ok &&
data != null)
{
try
{
mBitMap = (Bitmap)data.Extras.Get("data");
imgView.SetImageBitmap(mBitMap);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
bitmapData = stream.ToArray();
}
inputStream = new MemoryStream(bitmapData);
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
}
我想你调用了错误的方法(protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
在Activity中使用),你应该投下 Result.OK
到 int
在C# Xamarin.Android中,请查看以下内容。
public override void OnActivityResult(int requestCode, int resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE_REQUSET &&
resultCode == (int)Result.Ok &&
data != null &&
data.Data != null)
{
filePath = data.Data;
try
{
mBitMap = MediaStore.Images.Media.GetBitmap(Activity.ContentResolver, filePath);
imgView.SetImageBitmap(mBitMap);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
bitmapData = stream.ToArray();
}
inputStream = new MemoryStream(bitmapData);
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
else if (requestCode == 0 &&
resultCode == (int)Result.Ok &&
data != null)
{
try
{
mBitMap = (Bitmap)data.Extras.Get("data");
imgView.SetImageBitmap(mBitMap);
byte[] bitmapData;
using (var stream = new MemoryStream())
{
mBitMap.Compress(Bitmap.CompressFormat.Jpeg, 100, stream);
bitmapData = stream.ToArray();
}
inputStream = new MemoryStream(bitmapData);
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
}