2016-02-17 1 views
0

Я хочу скрыть привязку, полученную из приложения камеры камеры, и сохранить его в локальном хранилище, чтобы он не отображался в Галерее или любом другом совместном использовании медиафайлов заявление.Запись и чтение изображения камеры в файл в локальном хранилище в Android

я сделал эта часть. Но в проводнике файлов я вижу свои снимки по адресу /storage/emulated/0/Android/data/<package name>/files**. Хорошо с этим тоже.

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

int bytes = byteSizeOf(myBitmap); 

      ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer 
      myBitmap.copyPixelsToBuffer(buffer); //Move the byte data to the buffer 

      byte[] byteArray = buffer.array();    

      FileOutputStream fileOuputStream = new FileOutputStream(path); 
      fileOuputStream.write(byteArray); 
      fileOuputStream.close(); 

Когда я читаю этот файл и преобразования его в ByteArray, я получаю то же массив байт, но когда я декодирование этого ByteArray к Bitmap, я получаю растровое изображение как null и после показывают в LogCat SkImageDecoder :: завод вернулся нулевой

Я использую следующий код для извлечения растрового изображения

File f = new File(path); 
    try { 
     byte[] byteArr = FileUtils.readFileToByteArray(f); 

     Bitmap bmp; 
     bmp = BitmapFactory.decodeByteArray(byteArr, 0, byteArr.length); 
     addScrollchild(bmp); 
    } catch (Exception ex) { 

    } 

Я получаю null в bmp экземпляра.

Любая помощь будет назначена.

+0

Почему бы не сохранить изображение в каталоге '/ data/data//files /'? Тогда он не будет доступен для пользователей без очереди и не будет отображаться в галерее. – camelCaseCoder

+0

@camelCaseCoder, что я буду делать для пользователей с корневыми устройствами? – Sunny

+0

Тогда шифрование - единственный выход. – camelCaseCoder

ответ

0

Ваша логика для того, чтобы сделать ваш файл нечитаемым, является ошибочным. Если ваше требование заключается только в том, чтобы не показывать изображения в приложении галереи или других поисковых системах, просто используйте Context.MODE_PRIVATE при сохранении файлов изображений на устройстве. Я продемонстрирую простой пример для сохранения изображений в частном порядке в папке, так что они не появляются в землепроходцах файлов и т.д. на некорневое устройстве:

File dir = App.context().getDir("your_folder", Context.MODE_PRIVATE); 
if(!dir.exists()){ 

    dir.mkdir(); 

} 
File imageFile1 = new File(dir, imageName); 
// save imageFile1 path to localdatabase as imageFile1.toString(); 
savePathToDatabase(imageFile1.toString()); 
byte[] imageBytes = ... // get the image bytes here 
FileOutputStream out = null; 
    try{ 
     out = new FileOutputStream(imageFile1); 
     out.write(imageBytes); 
     } 
    catch (FileNotFoundException e){ 

      e.printStackTrace(); 
      return false; 

     } catch (IOException e){ 

      e.printStackTrace(); 
      return false; 
     } 
    finally{ 
     out.close(); 
    } 

Чтобы прочитать эти изображения:

// path which you saved to local database when saving images 

String path = getImagePathFromTable(); 
if(path==null)return null; 

    File f = new File(path); 
    if(f.exists()){ 

    // get your images here how you want them.   

    } 
+0

для неуправляемых устройств этот Context.PrivateMode работает нормально, но это не полное решение, это просто альтернативное решение, поскольку я все еще получаю null. – Sunny

+0

@ Сонни, где вы получаете «нуль»? Решение, приведенное выше, отлично работает в одном из моих проектов. –

+0

в сегменте для чтения изображений, 'Файл f = новый файл (путь); try { byte [] byteArr = FileUtils.readFileToByteArray (f); Bitmap bmp; bmp = BitmapFactory.decodeByteArray (byteArr, 0, byteArr.length); } поймать (Exception ех) { }»растровый я получаю пустой, в LogCat я имею ошибку SkImageDecoder :: Factory возвращенное нулевой – Sunny

0

От docs:

Возвращает Декодированное растровое изображение или значение null, если изображение невозможно декодировать.

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

  • Преобразование Bitmap в массив байт:

    Bitmap bmp = /*your target bitmap*/; 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
    byte[] byteArray = stream.toByteArray(); 
    
  • Запись массива байт в файл:

    FileOutputStream fos = new FileOutputStream("filename"); 
    fos.write(byteArray); 
    fos.close(); 
    
  • Читать файл и скопировать его в массив байтов: source

    import java.nio.file.Files; 
    import java.nio.file.Paths; 
    import java.nio.file.Path; 
    
    Path path = Paths.get("path/to/file"); 
    byte[] data = Files.readAllBytes(path); 
    
  • Преобразовать массив байтов в Bitmap:

    Bitmap bitmap = BitmapFactory.decodeByteArray(array, 0, array.length); 
    

PS: Ваш подход не является хорошим способом для сокрытия изображений от нежелательных доступов. Вы должны рассмотреть возможность применения шифрования/дешифрования для обеспечения безопасности.

+0

я не могу использовать шифрование/дешифрование, как я, возможно, потребуется, чтобы показать изображение в пользователь в любое время, поэтому я не могу продолжать расшифровывать в своем приложении. – Sunny

+0

java.nio.file. * Пакет отсутствует в javas-файлах android, кроме этого, я получаю байт-массив правильно, но получаю ошибку в Bitmap bitmap = BitmapFactory.decodeByteArray (array, 0, array.length); это дает мне null. – Sunny