Намерение Android Video не сохранять видео в нужное место

#android #video #android-intent

#Android #Видео #android-намерение

Вопрос:

У меня есть этот код:

(Это код, который вызывает видео-намерение)

 Intent videoIntent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
videoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getOutputMediaFile()));
videoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT , 5);
videoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
startActivityForResult(videoIntent, VIDEO_REQUEST);
  

(Остальная часть кода)

 private static final int VIDEO_REQUEST = 2888;

public static File getOutputMediaFile(){
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), "FolderApp");
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
        //Cant create folder!!
        return null;
        }
    }
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile mediaFile = new File(mediaStorageDir.getPath()   "_VID_"   timeStamp   ".3gp");
    } else {
        return null;
    }
    return mediaFile;
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == VIDEO_REQUEST amp;amp; resultCode == Activity.RESULT_OK) {
        //OK!! but not create a video file returned in getOutputMediaFile()
    }
}
  

Видео не сохраняется в желаемом месте, аналогичная вещь я пробовал с захватом изображения, и это сработало.

Комментарии:

1. Что вы получаете обратно через getData() на Intent переданном onActivityResult() ?

2. Потому что я прочитал, что getData () работает на некоторых телефонах не во всех. В некоторых сообщениях с этого сайта (и других) предлагается использовать MediaStore. EXTRA_OUTPUT. Говорят, что getData () иногда возвращает null.

Ответ №1:

Видео не сохраняется в желаемом месте

Нет требования, чтобы приложение для камеры соблюдало правила ACTION_IMAGE_CAPTURE или ACTION_VIDEO_CAPTURE . Некоторые из них будут учитывать конкретное запрошенное местоположение вывода. Некоторые этого не сделают и вернутся туда, где они решили сохранить изображение / видео, в Uri содержащееся в результате, Intent доставленном на onActivityResult() . Некоторые из них могут быть полностью повреждены и ничего не сообщать вам о том, где было сохранено изображение / видео, даже если оно было сохранено.

Я попробовал с захватом изображения, и это сработало

Я предполагаю, что вы не пробовали это в сотнях приложений для камеры, которые предустановлены на устройствах или доступны в Play Store, Amazon AppStore для Android, BlackBerry World, Nokia X Store, Yandex Store и т.д.

Если вы хотите полагаться на сторонние приложения для камеры, вам лучше всего действовать следующим образом:

  • Укажите желаемое местоположение вывода

  • В onActivityResult() посмотрите, был ли результат записан там, где вы просили, и если да, используйте его

  • В противном случае в onActivityResult() получите Uri из Intent , и если это не так null , используйте его

  • В противном случае попросите пользователя загрузить лучшее приложение для камеры, возможно, связав их с тем, которое, как вы знаете, хорошо работает с вашим приложением

Комментарии:

1. Также может помочь запросить поставщика контента MediaStore, если результат не там, где вы ожидали его найти.

2. Спасибо @CommonsWare! вы правы.. что я сделал, так это сохранил ссылку на uri перед началом записи, и когда я получил результат Ok, просто загрузил информацию из uri. Большое спасибо!

Ответ №2:

Ваш код выглядит нормально. Может быть, вы можете попробовать:

 Environment.DIRECTORY_MOVIES
  

вместо

 Environment.DIRECTORY_PICTURES
  

для вашего местоположения видео… но это всего лишь предположение

У меня это всегда работает:

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(data == null) {
        //CANNOT GET URI
        return;
    }

    File source = new File(data.getData().getPath());
    File destination = new File(PATH_TO_YOUR_DESIRE_LOCATION,FILENAME);

    //MOVE FILE
    if(source.renameTo(destination)) {
        //success
    } else {
        //something's wrong
    }
}
  

Также, если вы установите для MediaStore.EXTRA_OUTPUT параметра значение android.provider.MediaStore.ACTION_VIDEO_CAPTURE intent, то
getData() inside onActivityResult всегда будет возвращаться null