#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