я хочу загрузить видео в хранилище firebase внутри папки с уникальными именами? - PullRequest
0 голосов
/ 08 января 2020

Я хочу загрузить видео в хранилище Firebase внутри папки с уникальными именами.

В моем коде сейчас происходит то, что я пытаюсь записать видео, и я хочу загрузить его в Firebase Storage.

Пожалуйста, просмотрите мой код и помогите мне с соответствующим ответом

public class MainActivity extends AppCompatActivity {

    private Uri videouri;
    Button button;


    private StorageReference videoRef;
    private DatabaseReference ref;
    private static final int REQUEST_CODE = 101;
    private FirebaseAuth mAuth;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        videoRef= FirebaseStorage.getInstance().getReference("videos");
        ref = FirebaseDatabase.getInstance().getReference("videos");


      VideoView videoView=findViewById(R.id.videoView);
      button=findViewById(R.id.button3);
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              upload();
              Double abc=Math.random();
              Log.i("info", "onCreate: "+abc);
              String filename="video";
              StorageReference storageRef = FirebaseStorage.getInstance().getReference();
              videoRef =storageRef.child("/videos"+"/"+videouri+".mp4");
          }
      });
    }
    private String getFileExtension(Uri uri) {
        ContentResolver cR = getContentResolver();
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getExtensionFromMimeType(cR.getType(uri));
    }

    public void upload() {
    if (videouri != null) {
     final UploadTask uploadTask = videoRef.putFile(videouri);
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    Toast.makeText(MainActivity.this, "Success on upload", Toast.LENGTH_SHORT).show();
                }
            });
            uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                    updateProgress(taskSnapshot);
                }
            });
        } else {
            Toast.makeText(this, "Nothing to Upload", Toast.LENGTH_SHORT).show();
        }
    }

    public void updateProgress(UploadTask.TaskSnapshot taskSnapshot) {

        long fileSize = taskSnapshot.getTotalByteCount();

        long UploadBytes = taskSnapshot.getBytesTransferred();
        long progress = (100 * UploadBytes) / fileSize;
        ProgressBar progressBar = (ProgressBar) findViewById(R.id.pbar);
        progressBar.setProgress((int) progress);


    }

    public void record(View view) {


        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

        startActivityForResult(intent, REQUEST_CODE);

    }


    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode, resultCode, data);
       videouri=data.getData();
       if(resultCode==1){
       Toast.makeText(this, "Video saved to:\n"+videouri, Toast.LENGTH_LONG).show();


    }else if(resultCode==RESULT_CANCELED){
    Toast.makeText(this, "RECORDING CANCELLED.", Toast.LENGTH_SHORT).show();
    }else{
    //  Toast.makeText(this, "failed to record", Toast.LENGTH_SHORT).show();
    Toast.makeText(this, "Video saved to:\n"+videouri, Toast.LENGTH_LONG).show();
     }

    }

}

1 Ответ

0 голосов
/ 08 января 2020

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

Самый простой способ исправить это с помощью чего-то подобного :

public void upload() {
  if (videouri != null) {
    String filename = UUID.randomUUID().toString;
    videoRef = FirebaseStorage.getInstance().getReference("videos")
                              .child("videos").child(filename+".mp4");
    final UploadTask uploadTask = videoRef.putFile(videouri);
    uploadTask.addOnFailureListener(new OnFailureListener() {
      ...

Приведенное выше сгенерирует уникальное имя файла каждый раз, когда вы загружаете файл.


Альтернативой имени файла может быть его основание на текущей отметке времени:

String filename = System.currentTimeMillis().toString;

Обычно это облегчает поиск новых файлов, так как они будут внизу списка. У него есть небольшой шанс не быть уникальным, но на ранних стадиях он маловероятен.


Другая альтернатива имени файла - основывать его на выбранном файле. Но в этом случае загрузка одного и того же исходного файла приведет к перезаписи данных в том же месте на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...