Захватите изображение с камеры в полном разрешении безопасным способом (без сохранения на диск, если возможно)

Я разрабатываю приложение, которое позволит пользователям делать снимки защищенных документов и загружать эти изображения на сервер (хорошим примером того, что я пытаюсь сделать, является банковское приложение, позволяющее пользователям фотографировать чеки).

Из соображений безопасности я не хочу, чтобы образ физически сохранялся на диске в любой момент, если это возможно.

Когда я пытаюсь сделать это с намерением MediaStore.ACTION_IMAGE_CAPTURE, это работает... но разрешение очень низкое. Я предполагаю, что это для предотвращения чрезмерного использования оперативной памяти. Я искал решения, но все они, которые я нашел, связаны с сохранением изображения на SD-карте или внутренней памяти NAND. Я не хочу этого делать.

Если невозможно избежать сохранения фотографии, есть ли способ сохранить изображение в месте, доступном только для моего приложения? Затем я бы удалил файл после его загрузки. И если мне придется сделать это таким образом, есть ли способ зашифровать фотографию при ее сохранении?

Вот упрощение моего текущего кода, если это вообще поможет:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent,requestCode);

и

protected void onActivityResult(int requestCode, int resultcode, Intent data)
{
    if (resultcode == RESULT_OK)
    {
        Bitmap bmp = getBitmapFromIntent(data);
    }
}
private Bitmap getBitmapFromIntent(Intent intent)
{
    Bundle extras = intent.getExtras();
    return (Bitmap) extras.get("data");
}

person Danation    schedule 31.10.2012    source источник


Ответы (1)


Вы можете сохранять файлы прямо во внутренней памяти устройства. По умолчанию файлы, сохраненные во внутреннем хранилище, являются частными для вашего приложения, и другие приложения не могут получить к ним доступ (и пользователь). Когда пользователь удаляет ваше приложение, эти файлы удаляются.

String file_path = "/data/data/com.packagename/cache/";
            File dir = new File(file_path);
            if (!dir.exists())
                dir.mkdirs();
            File file = new File(dir, "1" + ".jpg");

            try {
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(data); // data in byte format
                fos.close();
            } catch (FileNotFoundException e) {
                Log.e("Not Found", "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.e("Not Found", "Error accessing file: " + e.getMessage());
        }
person Imran Ali    schedule 31.10.2012
comment
Спасибо, это навело меня на правильный путь. Посмотрев вокруг, я хочу использовать getCacheDir() вместо жесткого кодирования пути к файлу. - person Danation; 01.11.2012
comment
Но что, если кто-то попытается восстановить данные с помощью специального программного обеспечения? Будут ли восстановлены захваченные файлы? - person CLOUGH; 19.10.2016
comment
@КЛО Да. Доступное аппаратное обеспечение телефона и Android сильно изменились за 4 года. Теперь я просто храню картинку в памяти, и все в порядке. - person Danation; 27.10.2016