2014-10-06 5 views
6

Я могу нажать кнопку, открыть приложение для камеры и успешно сфотографировать. Но затем, когда я просматриваю собственные приложения Gallery или Photos на моем телефоне, изображение там не сохраняется. Я очень новичок в Android, поэтому, скорее всего, мне не хватает чего-то важного в моем коде.Камера не сохраняет после съемки

Вопросы:

1) Где эти снимки сохраняются?

2) Могу ли я изменить приведенный ниже код как-то, чтобы сохранить вместо него внутреннее хранилище, поэтому все снимки, сделанные с моим приложением, являются частными и доступны только через мое приложение?

3) Если бы я хотел сохранить эти фотографии в объекте вместе с текстом/другим вводом, каким будет лучший способ? Должен ли я просто сохранить Uri или какой-либо идентификатор для ссылки на изображение позже или сохранить фактическое изображение BitMap?

Любая помощь с благодарностью, спасибо!

Вот мой код, чтобы сделать снимок:

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

CameraUtils класс взятый прямо из Google developer guides:

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    if (!mediaStorageDir.exists()) 
    { 
     if (!mediaStorageDir.mkdirs()) 
     { 
      return null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    else 
    { 
     return null; 
    } 

    return mediaFile; 
} 

ответ

4

1) Глядя на код, я бы ожидать картины быть сохраненный в каталоге под названием «камера», который можно найти в папке «Изображения» на вашем устройстве (внешнее хранилище). Они могут не отображаться сразу в вашей галерее, однако в более поздних версиях Android (Kitkat и, возможно, желе, хотя я не могу проверить это сейчас) вы должны открыть приложение «Фото» и найти их где-нибудь там. Если это не так, запустите приложение для проводника файлов (например, приложения - ASTRO File Manager или X-Plore) и перейдите в каталог «Картинки/камеры», где вы увидите свои изображения. В следующий раз, когда ваши СМИ будут переиндексированы (перезагрузка телефона или повторный индекс, запускаемый из других источников), вы должны увидеть эти фотографии в своих приложениях галереи/фотографии. Если вы хотите программно обновить медиа, here может помочь. Наконец, убедитесь, что у вас есть разрешение READ_EXTERNAL_STORAGE в вашем манифесте Android, как указано this (Android doc).

2) Если вы хотите, чтобы изображения были доступны только для вашего приложения, вам необходимо сохранить их во внутреннем каталоге данных вашего приложения. Взгляните на this прямо из документа Android. Обязательно используйте флаг MODE_PRIVATE.

3) Для этого вы хотите сохранить путь к файлу, доступный для вашего приложения. Либо вы можете сохранить свои пути к текстовому файлу с некоторыми другими текстовыми данными, либо использовать базу данных sqlite. Наконец, вы можете использовать ORM, например ORMLite для Android, для сохранения java-объекта, который может содержать данные для вашего изображения, и иметь некоторые поля, которые вы хотите сохранить (название, описание, путь и т. Д.). Here и here - это введение о том, как начать работу с базой данных SQLite на Android (прямо из официального документа). Если вы хотите использовать ORMLite, на их сайте имеется много информации here. Разработчик потратил много времени на ответы на вопросы StackOverflow.

На все ваши вопросы можно ответить несколькими простыми поисками Google. Они являются очень стандартными и основными вещами в Android, поэтому вы сможете найти множество информации и обучающих онлайн.

EDIT:

В ответ на ваш комментарий о втором вопросе. Это то, что я, вероятно, сделаю (или что-то подобное):

Обратите внимание, что я не тестировал это. Это от головы. Если у вас есть больше комментариев здесь!

код активность ...

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(currentActivity, CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == REQUEST_IMAGE) 
    { 
     if (resultCode == RESULT_OK) 
     { 
      String pathToInternallyStoredImage = CameraUtils.saveToInternalStorage(this, imageUri); 
      // Load the bitmap from the path and display it somewhere, or whatever 
     } 
     else if (resultCode == RESULT_CANCELED) 
     { 
      //Cancel code 
     } 
    } 
} 

CameraUtils код класс ...

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static File getOutputInternalMediaFile(Context context, int type) 
{ 
    File mediaStorageDir = new File(context.getFilesDir(), "myInternalPicturesDir"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static void createMediaStorageDir(File mediaStorageDir) // Used to be 'private void ...' 
{ 
    if (!mediaStorageDir.exists()) 
    { 
     mediaStorageDir.mkdirs(); // Used to be 'mediaStorage.mkdirs();' 
    } 
} // Was flipped the other way 

private static File createFile(int type, File mediaStorageDir) // Used to be 'private File ...' 
{ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile = null; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    return mediaFile; 
} 

public static String saveToInternalStorage(Context context, Uri tempUri) 
{ 
    InputStream in = null; 
    OutputStream out = null; 

    File sourceExternalImageFile = new File(tempUri.getPath()); 
    File destinationInternalImageFile = new File(getOutputInternalMediaFile(context).getPath()); 

    try 
    { 
     destinationInternalImageFile.createNewFile(); 

     in = new FileInputStream(sourceExternalImageFile); 
     out = new FileOutputStream(destinationInternalImageFile); 

     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) 
     { 
      out.write(buf, 0, len); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     //Handle error 
    } 
    finally 
    { 
     try { 
      if (in != null) { 
       in.close(); 
      } 
      if (out != null) { 
       in.close(); 
      } 
     } catch (IOException e) { 
      // Eh 
     } 
    } 
    return destinationInternalImageFile.getPath(); 
} 

Так что теперь у вас есть путь, указывающий на ваше внутренне сохраненное изображение, которое вы можете затем манипулируйте/загрузите с вашего onActivityResult.

+0

Спасибо за ответ! Что касается № 2, я уже видел эту часть документов, но я не уверен, как ее реализовать в моем приложении. Знаете ли вы о каких-либо примерах, которые показывают, как это сделать? Я могу найти только фрагменты кода. – pez

+0

Еще раз спасибо! Выполняя свой код на моем телефоне, он всегда замерзает в приложении камеры сразу после съемки. Используя 'Log.d', кажется, что все вызывается, а logcat не показывает никаких ошибок. Но после того, как я сделаю снимок, он не позволит мне подтвердить его с помощью галочки в приложении для родной камеры; Я могу нажать «x», чтобы снова взять снимок, или нажмите кнопки «Домой» или «Назад» на панели навигации моего телефона. – pez

+1

У вас есть три разрешения в манифесте Android? '' '' ' ' Вам действительно нужно только разрешение на запись для сохранения изображений (а также функцию камеры, которую я считаю). Но обычно чтение включено, так как вам, вероятно, понадобится. – maraci

Смежные вопросы