Xamarin Android使用ActionImageCapture拍照画质偏低的解决方案咨询
解决Xamarin Android调用相机拍摄图片画质偏低的问题
问题核心:你当前通过data.Extras.Get("data")获取的是相机返回的缩略图,而非原始拍摄的高清图片,所以即使后续保存画质也无法提升。正确的做法是让相机直接将原图保存到指定文件,再读取该文件显示。
步骤1:配置FileProvider(适配Android 7.0+)
在AndroidManifest.xml中添加FileProvider配置:
<application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
在Resources/xml目录下创建file_paths.xml文件:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_images" path="Pictures" /> </paths>
步骤2:申请存储权限
在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
针对Android 6.0+动态申请权限:
const int RequestStorageId = 2000; if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteExternalStorage) != Permission.Granted) { ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.WriteExternalStorage, Manifest.Permission.ReadExternalStorage }, RequestStorageId); }
步骤3:修改相机Intent,指定原图保存路径
private File _photoFile; const int PickImageId = 1000; private void TakePhoto() { // 创建保存图片的文件 var storageDir = GetExternalFilesDir(Android.OS.Environment.DirectoryPictures); _photoFile = File.CreateTempFile( System.DateTime.Now.ToString("yyyyMMddHHmmssfff"), ".jpg", storageDir ); // 获取适配版本的文件Uri Android.Net.Uri photoUri; if (Build.VERSION.SdkInt >= BuildVersionCodes.N) { photoUri = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", _photoFile); } else { photoUri = Android.Net.Uri.FromFile(_photoFile); } // 启动相机并指定输出路径 Intent intent = new Intent(MediaStore.ActionImageCapture); intent.PutExtra(MediaStore.ExtraOutput, photoUri); StartActivityForResult(intent, PickImageId); }
步骤4:修改OnActivityResult读取原图
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == PickImageId && resultCode == Result.Ok) { // 直接读取保存的高清原图 Bitmap bitmap = BitmapFactory.DecodeFile(_photoFile.AbsolutePath); // 可选:根据ImageView尺寸压缩图片,避免内存溢出 int targetWidth = imgview.Width; int targetHeight = imgview.Height; if (targetWidth > 0 && targetHeight > 0) { bitmap = Bitmap.CreateScaledBitmap(bitmap, targetWidth, targetHeight, true); } imgview.SetImageBitmap(bitmap); } }
关键说明
- 放弃从
data.Extras.Get("data")获取图片,该接口仅返回低分辨率缩略图。 - 通过
MediaStore.ExtraOutput指定输出路径,让相机直接将高清原图写入目标文件。 - 使用FileProvider解决Android 7.0+的文件Uri安全限制问题。
- 若需将图片存入DCIM/Camera系统目录,Android 10+需适配Scoped Storage,可通过MediaStore接口将图片插入系统相册。
内容的提问来源于stack exchange,提问作者Jason Yeoh
相关产品推荐
相关产品推荐

