Реализация камеры прямо в приложении - PullRequest
0 голосов
/ 19 сентября 2018

Я реализую функцию камеры непосредственно в приложении, так как я не хочу использовать Intent для открытия приложения камеры по умолчанию.Я следовал предоставленному коду здесь :

Приложение вылетает сразу после получения фотографии со следующим сообщением об ошибке:

Java.Lang.RuntimeException: не удалось подключиться к сервису камеры

Вот как я это настроил.Я опустил ненужный код.

namespace camera_test
    {
        [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true, Icon = "@drawable/icon")]
        public class MainActivity : Android.Support.V7.App.AppCompatActivity, Android.Hardware.Camera.IPictureCallback, Android.Hardware.Camera.IPreviewCallback,
            Android.Hardware.Camera.IShutterCallback, ISurfaceHolderCallback
        {
    static Android.Hardware.Camera camera = null;
    Button btnStart;
    Button btnEnd;

    protected override void OnCreate(Bundle savedInstanceState)
    { 
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource

        SetContentView(Resource.Layout.activity_main);

        SurfaceView surface = (SurfaceView)FindViewById(Resource.Id.surface);
        var holder = surface.Holder;
        holder.AddCallback(this);
        holder.SetType(Android.Views.SurfaceType.PushBuffers);

        btnStart = FindViewById<Button>(Resource.Id.buttonStart);
        btnEnd = FindViewById<Button>(Resource.Id.buttonEnd);

        btnStart.Click += BtnStart_Click;
        btnEnd.Click += BtnEnd_Click;

        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.SetVmPolicy(builder.Build());

    }


    private void BtnStart_Click(object sender, EventArgs e)
    {
        camera.StartPreview();



    private void BtnEnd_Click(object sender, EventArgs e)
    {

        Android.Hardware.Camera.Parameters p = camera.GetParameters();
        p.PictureFormat = Android.Graphics.ImageFormatType.Jpeg;
        camera.SetParameters(p);
        camera.TakePicture(this, this, this);
        StartActivity(typeof(MainActivity));

    }
    void Android.Hardware.Camera.IPictureCallback.OnPictureTaken(byte[] data, Android.Hardware.Camera camera)
    {
        Java.IO.FileOutputStream outStream = null;
        Java.IO.File dataDir = Android.OS.Environment.ExternalStorageDirectory;
        DateTime DT = DateTime.Now;
        String DateTimeStamp = DT.Year.ToString("D4") + "-" + DT.Month.ToString("D2") + "-" + DT.Day.ToString("D2") + "-" + DT.Hour.ToString("D2") + DT.Minute.ToString("D2") + DT.Second.ToString("D2");
        String PictureFilename = "Photo-" + DateTimeStamp + ".jpg";

        if (data != null)
        {
            try
            {
                outStream = new Java.IO.FileOutputStream(dataDir + "/" + PictureFilename);
                outStream.Write(data);
                outStream.Close();
            }
            catch (FileNotFoundException e)
            {
                System.Console.Out.WriteLine(e.Message);
            }
            catch (IOException ie)
            {
                System.Console.Out.WriteLine(ie.Message);
            }
        }
    }

    void Android.Hardware.Camera.IPreviewCallback.OnPreviewFrame(byte[] b, Android.Hardware.Camera c)
    {

    }

    void Android.Hardware.Camera.IShutterCallback.OnShutter()
    {

    }


    public void SurfaceCreated(ISurfaceHolder holder)
    {


        try
        {
            camera = Android.Hardware.Camera.Open();
            Android.Hardware.Camera.Parameters p = camera.GetParameters();
            p.PictureFormat = Android.Graphics.ImageFormatType.Jpeg;
            camera.SetParameters(p);
            camera.SetPreviewCallback(this);
            camera.Lock();
            camera.SetPreviewDisplay(holder);
            // camera.StartPreview();
        }
        catch (IOException e)
        {
        }
    }

    public void SurfaceDestroyed(ISurfaceHolder holder)
    {

        camera.Unlock();
        camera.StopPreview();
        camera.SetPreviewCallback(null);
        camera.Release();
        camera = null;
    }

    public void SurfaceChanged(ISurfaceHolder holder, Android.Graphics.Format f, int i, int j)
    {
    }
}

}

Я предполагаю, что это как-то связано с тем, как камера открывается и закрывается, но я не могу понять,Как решить эту проблему.Обратите внимание, что кнопка запуска правильно запускает просмотрщик камеры.Только при нажатии кнопки «Завершить» происходит сбой приложения.Любая помощь или предложения будут оценены.Также я знаю, что камера устарела.Спасибо.

ОБНОВЛЕНИЕ:

Ошибка возникает, когда:

  • устройство меняет ориентацию

  • или когда я вызываю эту строку: StartActivity(typeof(MainActivity));.

Т.е. ошибка возникает при перезапуске активности (я думаю, что если меняется ориентация, то она перезапускаетактивность, а)Я понятия не имею, как еще возобновить свою деятельность, потому что мне нужно.Интересно, что если я переключаюсь на другое занятие, а затем снова переключаюсь на основное занятие с функцией камеры, ошибка не возникает.Я очень озадачен.

1 Ответ

0 голосов
/ 20 сентября 2018

Существует ли причина, по которой вы используете устаревший API камеры?

Вам следует использовать camera2: https://developer.android.com/reference/android/hardware/camera2/package-summary

Xamarin также предоставляет базовый пример для этого: https://developer.xamarin.com/samples/monodroid/android5.0/Camera2Basic/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...