Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 直接在应用程序中实现摄影机_C#_Android_Xamarin_Android Camera - Fatal编程技术网

C# 直接在应用程序中实现摄影机

C# 直接在应用程序中实现摄影机,c#,android,xamarin,android-camera,C#,Android,Xamarin,Android Camera,我直接在应用程序中实现相机功能,因为我不想使用Intent打开默认相机应用程序。我遵循了提供的代码: 拍照后应用程序立即崩溃,并显示以下错误消息: Java.Lang.RuntimeException:无法连接到摄影机服务 下面是我如何设置它的。我已经输入了不必要的代码 namespace camera_test { [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher

我直接在应用程序中实现相机功能,因为我不想使用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)
    {
    }
}
namespace-camera\u测试
{
[Activity(Label=“@string/app_name”,Theme=“@style/AppTheme”,MainLauncher=true,Icon=“@drawable/Icon”)]
公共类MainActivity:Android.Support.V7.App.AppCompatActivity,Android.Hardware.Camera.IPictureCallback,Android.Hardware.Camera.IPreviewCallback,
Android.Hardware.Camera.IshurtCallback,ISurfaceHolderCallback
{
静态Android.Hardware.Camera-Camera=null;
按钮btnStart;
按钮btnEnd;
创建时受保护的覆盖无效(Bundle savedInstanceState)
{ 
base.OnCreate(savedInstanceState);
//从“主”布局资源设置视图
SetContentView(Resource.Layout.activity_main);
SurfaceView surface=(SurfaceView)FindViewById(Resource.Id.surface);
var holder=表面。holder;
holder.AddCallback(本);
SetType(Android.Views.SurfaceType.PushBuffers);
btnStart=findviewbyd(Resource.Id.buttonStart);
btnEnd=findviewbyd(Resource.Id.buttonEnd);
btnStart.Click+=btnStart\u Click;
点击+=btnEnd\U点击;
StrictMode.VmPolicy.Builder Builder=新建StrictMode.VmPolicy.Builder();StrictMode.SetVmPolicy(Builder.Build());
}
私有void BtnStart_单击(对象发送方,事件参数e)
{
camera.StartPreview();
私有void BtnEnd_单击(对象发送者,事件参数e)
{
Android.Hardware.Camera.Parameters p=Camera.GetParameters();
p、 PictureFormat=Android.Graphics.ImageFormatType.Jpeg;
摄像机参数设置(p);
拍照(这个,这个,这个);
启动性(类型(主要活动));
}
void Android.Hardware.Camera.IPictureCallback.OnPictureTaken(字节[]数据,Android.Hardware.Camera-Camera)
{
Java.IO.FileOutputStream outStream=null;
Java.IO.File dataDir=Android.OS.Environment.ExternalStorageDirectory;
DateTime DT=DateTime.Now;
字符串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”);
字符串PictureFilename=“Photo-”+DateTimeStamp+“.jpg”;
如果(数据!=null)
{
尝试
{
outStream=new Java.IO.FileOutputStream(dataDir+“/”+PictureFilename);
外扩。写入(数据);
exptream.Close();
}
catch(filenotfounde异常)
{
系统、控制台、输出、写入线(e.Message);
}
捕获(IOIE)
{
系统、控制台、输出、写入线(即消息);
}
}
}
void Android.Hardware.Camera.IPreviewCallback.OnPreviewFrame(字节[]b,Android.Hardware.Camera c)
{
}
void Android.Hardware.Camera.IShutterCallback.OnShutter()文件
{
}
已处理的公共空隙表面(ISurfaceHolder)
{
尝试
{
camera=Android.Hardware.camera.Open();
Android.Hardware.Camera.Parameters p=Camera.GetParameters();
p、 PictureFormat=Android.Graphics.ImageFormatType.Jpeg;
摄像机参数设置(p);
照相机。设置预览回调(此);
摄像机锁定();
摄像头。设置预览显示(支架);
//camera.StartPreview();
}
捕获(IOE异常)
{
}
}
公共空隙表面置换(ISurfaceHolder)
{
摄像头解锁();
camera.StopPreview();
camera.SetPreviewCallback(空);
相机。释放();
摄像机=零;
}
public void surfacechange(ISurfaceHolder,Android.Graphics.Format f,int i,int j)
{
}
}
}

我猜这与相机的打开和关闭方式有关,但我不知道如何解决这个问题。请注意,“开始”按钮可以正确启动相机查看器。只有在单击“结束”按钮时,应用程序才会崩溃。如果您有任何帮助或建议,我将不胜感激。此外,我知道相机已被关闭恩贬值了,谢谢

更新:

以下情况下会发生错误:

  • 设备会改变方向

  • 或者当我调用这行时:
    StartActivity(typeof(MainActivity));


也就是说,当acitvity重新启动时会发生错误(我认为如果方向改变,那么它也会重新启动活动)。我不知道如何重新启动我的活动,因为我需要。有趣的是,如果我切换到其他活动,然后切换回具有摄像头功能的主活动,则不会发生错误。我非常困惑。

您使用不推荐的摄像头api有什么原因吗

您应该使用camera2:

Xamarin还为此提供了一个基本示例:

您是否在清单中声明了权限?此外,如果您的操作系统版本为6.0或更高版本,则您可能必须实现运行时权限模型。是的,我已声明了权限。如果是权限错误,我将无法查看相机(它在曲面视图中显示正确)。我已验证我有权访问外部存储器(读写)和相机。我刚才谈论的是读写权限,但忘了提及。请在“设置”页面的“应用程序权限”列表中检查这些权限是否处于打开或关闭状态。是的,我确实具有读写权限。请检查o