#java #android #firebase #firebase-storage
#java #Android #firebase #firebase-хранилище
Вопрос:
Я работаю над простым приложением firebase, в котором я загружаю информацию о пользователе в качестве регистрационных данных и загружаю видео в хранилище. Путь к видео также хранится в базе данных реального времени как вложенный дочерний элемент каждого конкретного пользователя, который работает должным образом, но я не знаю, как извлечь видео и установить в профиле пользователя другую пользовательскую информацию. Мне нужен код для извлечения видео из хранилища.
case PICK_VIDEO_REQUEST:
if (resultCode == RESULT_OK) {
selectedVideoUri = data.getData();
userUid = FirebaseAuth.getInstance().getCurrentUser().getEmail();
StorageReference storageRef = FirebaseStorage.getInstance().getReference();
filename = data.getData().getLastPathSegment();
tv_file_path.setText(filename);
videoRef = storageRef.child("/videos/" userUid "/" filename);
//TODO: save the video in the db
}
break;
`//Button upload data in firebase
btn_upload_notes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadData(selectedVideoUri);
try {
if (FirebaseAuth.getInstance().getCurrentUser().getEmail().equals(value.getT_email())) {
file_name = filename;
notes_Category = text;
lecture_topic = et_topic.getText().toString().trim();
id = mDatabase.push().getKey();
NotesModelClass notesModelClass = new NotesModelClass(id, notes_Category, lecture_topic, file_name);
mDatabase.child(value.getT_id()).child("Video Notes").child(id).setValue(notesModelClass);
return;
}
}
catch (Exception ex){
throw ex;
}
}
});
`
private void uploadData(Uri videoUri) {
if (videoUri != null) {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Uploading...");
progressDialog.show();
UploadTask uploadTask = videoRef.putFile(videoUri);
uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
if (task.isSuccessful())
progressDialog.dismiss();
Toast.makeText(MainActivity.this, "Upload Complete", Toast.LENGTH_SHORT).show();
}
}).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded " (int) progress "%");
}
});
} else {
Toast.makeText(MainActivity.this, "Nothing to upload", Toast.LENGTH_SHORT).show();
}
}
Ответ №1:
Попробуйте этот код
Повторно извлекать одно видео.
StorageReference videoRef = storageRef.child("/videos/" userUid "/" filename);
final long ONE_MEGABYTE = 1024 * 1024;
videoRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
// Transform bytes to a video, play
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
Извлекать несколько видео
StorageTask<UploadTask.TakeSnapshot> storageTask;
storageTask = yourStorageRefernce.putFile(videoUri);
storageTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return yourStorageRefernce.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
arrayList.add(downloadUri.toString());
}
}
});
Комментарии:
1. Приветствую ^_^
2. У меня есть несколько видео в каждой отдельной папке пользователя, я хочу извлечь их все сразу, чтобы добавить в arraylist, а затем дополнительно использовать их в соответствии с требованиями
3. каким должно быть значение «videoUri». если я задаю путь в ссылке на хранилище.
4. Значением videoUri является uri, который вы передаете в параметре метода.
private void uploadData(Uri videoUri) { if (videoUri != null) {
5. Я не совсем понимаю, что делать с videoUri, если я уже устанавливаю путь к «mstorageRef». Если я установлю путь к хранилищу в videosUri, то он запросит приведение к типу «UploadTask».
Ответ №2:
Помогите мне найти случайное видео в firebase
private void loadVideosFromFirebase() {
videoArrayList=new ArrayList<>();
DatabaseReference reb = FirebaseDatabase.getInstance().getReference().child("Videos");
reb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds:dataSnapshot.getChildren()) {
ModelVideo modelVideo = ds.getValue(ModelVideo.class);
videoArrayList.add(modelVideo);
}
adapterVideo = new AdapterVideo(VideosActivity.this,videoArrayList);
videosRv.setAdapter(adapterVideo);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
Комментарии:
1. Добро пожаловать в SO! Не могли бы вы, пожалуйста, объяснить свой код и почему он решает эту проблему? Спасибо!
2. можете ли вы помочь мне вывести случайное видео из firebase, исправив другой код, ModelVideo — это средство установки и получения (идентификатор строки, заголовок строки, временная метка строки, строка videoURL), RecyclerView videosRv, AdapterVideo — обработчик воспроизведения видео