не могу бросить кнопку, чтобы начать метод - PullRequest
0 голосов
/ 03 июля 2019

Приветствую всех, у меня есть это упражнение для загрузки файлов PDF в хранилище Firebase вместе с сохранением данных в хранилище Firebase, но я не могу привести свою кнопку загрузки к методу UploadFile, кто-нибудь знает, как заставить это работать?

Вот строки, которые содержат ошибки ниже: -

Кнопка загрузки ---- метод UploadFile ---

import android.content.Intent;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

public class UploadActivity extends AppCompatActivity {
    private StorageReference mStorageRef;
    Button upload;
    Button select;
    int CODE=215;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload);

        mStorageRef = FirebaseStorage.getInstance().getReference();

        upload=findViewById(R.id.upload);
        select=findViewById(R.id.select);

        select.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectFile();
            }
        });

        upload.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UploadFile(   );//when i put Uri file it says Cannot resolve symbol 'file' // 
               //and when i remove Uri file from the UploadFile method below then i will get error casted on null //
            }
        } );
    }

    public void selectFile ()
    {
        Intent i = new Intent(Intent.ACTION_GET_CONTENT);
        i.setType("*/*");
        startActivityForResult(Intent.createChooser(i,"Select a file"), CODE);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        String filePath = data.getDataString();
        Uri SelectedFileLocation=Uri.parse(filePath);
        UploadFile(SelectedFileLocation);

        super.onActivityResult(requestCode, resultCode, data);
    }

    public  void UploadFile(Uri file)
    {
        Toast.makeText(this, "Please wait.. the file is uploading!", Toast.LENGTH_SHORT).show();
        //Uri file = Uri.fromFile(new File("path/to/images/rivers.jpg"));
        StorageReference riversRef = mStorageRef.child(file.getLastPathSegment());

        riversRef.putFile(file)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        Toast.makeText(UploadActivity.this, "Upload Success", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Toast.makeText(UploadActivity.this, "Upload Failed", Toast.LENGTH_SHORT).show();

                    }
                });
    }
}

1 Ответ

0 голосов
/ 03 июля 2019

Чек https://developer.android.com/guide/topics/providers/document-provider.

Изменить 2:
Вычистил ответ.

Вам не хватает данных (постоянно) из результата в методе onActivityResult. URI должен храниться в месте, где вы можете передать его onClickListener кнопки загрузки (например, поле вашего объекта UploadActivity).

У вас уже есть Uri SelectedFileLocation в вашем методе onActivityResult, и вы можете выполнить загрузку там. Зачем вам нужна еще одна кнопка?

Предполагая, что ваше ручное преобразование в URI обеспечивает то же, что и метод по умолчанию (Intent#getData), просто измените эту переменную на поле вашей UploadActivity.

Не забудьте добавить ненулевые проверки в метод UploadFile или убедиться, что вы никогда не вызываете его с недопустимыми значениями.

Может выглядеть так:

public class UploadActivity extends AppCompatActivity {

    ...

    Optional<Uri> selectedFile = Optional.empty();

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        ...

        upload.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (selectedFile.isEmpty() == false) {
                    uploadFile( selectedFile.get() );
                }
            }
        } );
    }

    ...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        ...

        if (data != null) {
            selectedFile = Optional.of(data.getData()); 
            uploadFile(selectedFile.get()); // if you still want to do it here as well
        } else {
            selectedFile = Optional.empty();
        }

        ...
    }

    ...
}

Пс .:
Также взгляните на Java Code Conventions. Методы и переменные должны начинаться со строчной буквы.

(И всегда полезно оставить @Override для всех переопределяемых вами методов)

...