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
相关产品推荐
相关产品推荐

