2017-02-21 16 views
-2

Почему он не работает? Редактирование: добавлены новые версии кода & пиловочник:Как скопировать файл JPG через Uri

private void savePhotoFromCacheToFolder(Uri uri) { 

    File goodPhoto = album.setUpPhotoFile(); //new empty JPG 
    File currentPhoto = new File(uri.getPath()); //JPG from camera in cache 

    Log.v(TAG, "\ngoodPhoto Path " + goodPhoto); 
    Log.v(TAG, "\ncurrentPhoto Path " + currentPhoto); 

    FileInputStream source = null; 
    FileOutputStream destination = null; 

    try { 
     source = new FileInputStream(currentPhoto); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Log.v(TAG, "\ncurrentPhoto not found "); 
    } 

    try { 
     destination = new FileOutputStream(goodPhoto); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     Log.v(TAG, "\ngoodPhoto not found "); 
    } 

    FileChannel sourceFileChannel = source.getChannel(); 
    FileChannel destinationFileChannel = destination.getChannel(); 

    long size = 0; 
    try { 
     size = sourceFileChannel.size(); 
     sourceFileChannel.transferTo(0, size, destinationFileChannel); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.v(TAG, "\nshit happens "); 
    } 

} 

Журналы:

V/MainActivity: goodPhoto Path /storage/emulated/0/Pictures/Good photos/IMG_20170222_113700_-913025224.jpg 
V/MainActivity: currentPhoto Path /cache/photo.jpg 
V/MainActivity: currentPhoto not found 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.nio.channels.FileChannel java.io.FileInputStream.getChannel()' on a null object reference 

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

+1

Добавить запись в ловушку, и вы увидите, что произошло – Selvin

+0

Ловля исключения и игнорирование его очень плохо. –

+0

@ Селвин, что нам нужно знать? – Nikita

ответ

0

Мы создали поток ввода и объект потока вывода. Входной поток указывает на текущий java-файл, а выходной поток указывает на Output.java. Именно для этого Output.java мы хотим передать содержимое файла. Как упоминалось ранее, объект файла связан с объектом File Channel. Таким образом, мы получаем объект File Channel как для входа и выходного потока, используя следующий код,

public copyFile(String filePath){ 


     FileInputStream source = new FileInputStream(filePath); 
     FileOutputStream destination = new FileOutputStream("Output.java"); 

     FileChannel sourceFileChannel = source.getChannel(); 
     FileChannel destinationFileChannel = destination.getChannel(); 

     long size = sourceFileChannel.size(); 
     sourceFileChannel.transferTo(0, size, destinationFileChannel); 
    } 

Сравните свой код выше кодой, есть разница методы для передачи данных и в то время не используются здесь.