2015-02-21 2 views
0

Так что я немного смущен тем, что происходит в конце этого кода (внутри processPictureWhenReady()). Прежде чем этот метод вызывается (в пределах onActivityResult()), у нас есть путь к файлу изображения ... Так что файл уже сохранен. Затем мы имеем объявление файла pictureFile, используя путь к файлу изображения (picturePath). Может кто-нибудь объяснить, почему мы должны объявить файл, используя тот же путь к файлу, несмотря на то, что файл уже существует? Пожалуйста, не просто отсылайте меня обратно на сайт разработчиков Google, поскольку я не нашел это полезным.Как работает пример камеры GDK для Android?

private static final int TAKE_PICTURE_REQUEST = 1; 

private void takePicture() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, TAKE_PICTURE_REQUEST); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) { 
     String thumbnailPath = data.getStringExtra(Intents.EXTRA_THUMBNAIL_FILE_PATH); 
     String picturePath = data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH); 

     processPictureWhenReady(picturePath); 
     // TODO: Show the thumbnail to the user while the full picture is being 
     // processed. 
    } 

    super.onActivityResult(requestCode, resultCode, data); 
} 

private void processPictureWhenReady(final String picturePath) { 
    final File pictureFile = new File(picturePath); 

    if (pictureFile.exists()) { 
     // The picture is ready; process it. 
    } else { 
     // The file does not exist yet. Before starting the file observer, you 
     // can update your UI to let the user know that the application is 
     // waiting for the picture (for example, by displaying the thumbnail 
     // image and a progress indicator). 

     final File parentDirectory = pictureFile.getParentFile(); 
     FileObserver observer = new FileObserver(parentDirectory.getPath(), 
      FileObserver.CLOSE_WRITE | FileObserver.MOVED_TO) { 
      // Protect against additional pending events after CLOSE_WRITE 
      // or MOVED_TO is handled. 
      private boolean isFileWritten; 

     @Override 
     public void onEvent(int event, String path) { 
      if (!isFileWritten) { 
       // For safety, make sure that the file that was created in 
       // the directory is actually the one that we're expecting. 
       File affectedFile = new File(parentDirectory, path); 
       isFileWritten = affectedFile.equals(pictureFile); 

       if (isFileWritten) { 
        stopWatching(); 

        // Now that the file is ready, recursively call 
        // processPictureWhenReady again (on the UI thread). 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          processPictureWhenReady(picturePath); 
         } 
        }); 
       } 
      } 
     } 
    }; 
    observer.startWatching(); 
} 
} 

ответ

1

Вы имеете в виду, я полагаю, в этой строке:

final File pictureFile = new File(picturePath); 

Что они сделали создается экземпляр объекта File из путь к файлу, где хранится этот образ. Этот объект File - это то, что им нужно для обработки на изображении. Объектом File является абстракция файла изображения в памяти, NOT фактический физический файл. Насколько я понимаю, вы, кажется, ошибаетесь.

+0

Я следил за всем, что вы сказали, помимо «абстракции файла изображения». Извините, но что вы подразумеваете под этим? – MichaelAndroidNewbie

+0

Ваш вопрос в том, что * Может кто-нибудь объяснить, почему мы должны объявить файл, используя тот же путь к файлу, несмотря на то, что файл уже существует. * Мне кажется, что вы ошибаетесь, думая, что 'pictureFile' является фактическим *файл*. Это не**. 'pictureFile' - это всего лишь экземпляр класса' File', который может использоваться для выполнения некоторых операций обработки и обработки в * фактическом * файле. Таким образом, они не создают один и тот же файл снова, они просто создают абстрактное представление его под названием «pictureFile» и используют то, что они могут программно выполнять некоторые операции с этим изображением :) –

+0

Это имеет большой смысл. Спасибо, Zygotelnit! – MichaelAndroidNewbie