Миниатюра изображения сохраняется вместо полного изображения из MediaStore.ActionImageCapture - PullRequest
0 голосов
/ 21 января 2019

В настоящее время я пытаюсь сделать снимок через Android и сохранить изображение, где я буду загружать его в базу данных позже. Пройдя несколько уроков в Интернете, я обнаружил, что код, который я использую, сохраняет только миниатюру с низким разрешением захваченного изображения вместо полного изображения.

Есть ли способ получить полноразмерное изображение для сохранения? Формат должен быть Jpeg из-за способа установки программного обеспечения, использующего базу данных.

Фотосъемка работает по назначению:

    private void _openCamera_Click(object sender, EventArgs e)
    {
       Intent intent = new Intent(MediaStore.ActionImageCapture);
       StartActivityForResult(intent, 0);
    }

Здесь изображение заканчивается сохранением в виде эскиза. В идеале этот раздел будет единственным кодом, который мы модифицируем:

    protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
       base.OnActivityResult(requestCode, resultCode, data);

       Bitmap bitmap = (Bitmap)data.Extras.Get("data");

       this._photo.SetImageBitmap(bitmap);

       MemoryStream memStream = new MemoryStream();
       bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
       this._tempImageData = memStream.ToArray();
    } 

Обновление: Ответ SushiHangover работает без нареканий. Для работы с кэшированным изображением я использовал следующий код:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode != Result.Ok || requestCode != 88)
        {
            return;
        }

        Bitmap bitmap = BitmapFactory.DecodeFile(cacheName);

        this._photo.SetImageBitmap(bitmap);

        MemoryStream memStream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, memStream);
        this._tempImageData = memStream.ToArray();
    }

1 Ответ

0 голосов
/ 22 января 2019

Это действительно упрощенная C # версия официальной Android Photo Basics для полноразмерной фотографии.

Примечание. При этом сохраняется полноразмерная фотография в изолированной папке приложения cache

.

Добавить файл "Resources / xml / file_paths.xml":

<?xml version="1.0" encoding="UTF-8" ?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache_images" path="." />
</paths>

Добавление FileProvider в теги манифеста application открытия / закрытия:

<provider android:name="android.support.v4.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"></meta-data>
</provider>

Создайте файл фотографии и запросите приложение для фотографий:

cacheName = Path.Combine(CacheDir.AbsolutePath, Path.GetTempFileName());

using (var cacheFile = new Java.IO.File(cacheName)) 
using (var photoURI = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", cacheFile))
using (var intent = new Intent(MediaStore.ActionImageCapture))
{
    intent.PutExtra(MediaStore.ExtraOutput, photoURI);
    StartActivityForResult(intent, 88);
}

Примечание: cacheName - переменная уровня класса, она потребуется в методе OnActivityResult

В OnActivityResult сделайте что-нибудь со своей фотографией ...

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    if (resultCode == Result.Ok && requestCode == 88)
    {
        // Do something with your photo...
        Log.Debug("SO", cacheName );
    }
}
...