You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Android Fragment中调用相机拍照报错,求解决方法

解决Xamarin Android Fragment调用相机抛出异常的问题

嘿,我看到你的代码里有几个关键问题导致了运行时异常,咱们一步步来修复:

1. 核心问题:控件查找顺序错误

在你的OnCreateView方法中,你先尝试通过View.FindViewById查找控件,但此时你还没有加载布局文件,View对象是null,这会直接导致空引用异常。正确的流程应该是先加载布局得到View实例,再从这个实例中查找控件。

2. 必要补充:相机权限处理

Android 6.0(API级别23)及以上版本,相机权限属于危险权限,必须在运行时动态申请,否则调用相机时会被系统拦截,也会抛出权限相关的异常。

3. 缺失的步骤:处理拍照结果

你调用了StartActivityForResult来启动相机,但没有重写OnActivityResult方法,没法接收拍照后的图片并显示到ImageView中。

修正后的完整代码

public class ScanFragments : Fragment
{
    ImageView imageView;
    Button btnCamera;
    const int RequestCameraPermission = 1;
    const int RequestTakePhoto = 0;

    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }

    public static ScanFragments NewInstance()
    {
        var scan = new ScanFragments { Arguments = new Bundle() };
        return scan;
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // 先加载布局得到View实例
        var view = inflater.Inflate(Resource.Layout.ScanLayout, container, false);
        
        // 从加载好的view中查找控件
        imageView = view.FindViewById<ImageView>(Resource.Id.Iv_ScanImg);
        btnCamera = view.FindViewById<Button>(Resource.Id.btnCamera);

        btnCamera.Click += BtnCamera_Click;

        return view;
    }

    private void BtnCamera_Click(object sender, EventArgs e)
    {
        // 检查相机权限(Android 6.0+)
        if (ContextCompat.CheckSelfPermission(Context, Manifest.Permission.Camera) != Permission.Granted)
        {
            // 申请权限
            RequestPermissions(new string[] { Manifest.Permission.Camera }, RequestCameraPermission);
            return;
        }

        // 权限已授予,启动相机
        Intent intent = new Intent(MediaStore.ActionImageCapture);
        StartActivityForResult(intent, RequestTakePhoto);
    }

    // 处理权限申请结果
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == RequestCameraPermission)
        {
            if (grantResults.Length > 0 && grantResults[0] == Permission.Granted)
            {
                // 权限通过,再次启动相机
                Intent intent = new Intent(MediaStore.ActionImageCapture);
                StartActivityForResult(intent, RequestTakePhoto);
            }
            else
            {
                // 权限被拒绝,可以提示用户开启权限
                Toast.MakeText(Context, "需要相机权限才能拍照", ToastLength.Short).Show();
            }
        }
    }

    // 处理拍照结果
    public override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        if (requestCode == RequestTakePhoto && resultCode == Result.Ok)
        {
            // 获取拍照后的Bitmap并显示到ImageView
            Bitmap bitmap = (Bitmap)data.Extras.Get("data");
            imageView.SetImageBitmap(bitmap);
        }
    }
}

额外注意事项

  • 别忘了在AndroidManifest.xml中声明相机权限:
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    
  • 上面的代码中,相机返回的是缩略图,如果需要获取完整尺寸的照片,你需要指定图片保存的路径,再通过路径读取图片(这个是进阶需求,如果需要可以再深入探讨)。

内容的提问来源于stack exchange,提问作者Aswathy K R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:17