Невозможно применить защищенное переопределение void OnActivityResult (int requestCode, [GeneratedEnum] Result resultCode, Intent data) в фрагментах - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу отобразить изображение после съемки фотографий из галереи и камеры, но у меня есть проблема с этим. Я использую 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);
                }
            }
        }

1 Ответ

0 голосов
/ 28 апреля 2020

Я думаю, что вы вызываете неправильный метод (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);
            }
        }
    }
...