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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:55:40