【发布时间】:2020-04-11 01:37:54
【问题描述】:
这是我的 UploadActivity。该应用程序允许我选择一个文件,但一按下上传按钮就会崩溃。每次都会显示 OnFailedListener 的 Toast 消息。 我正在选择具有正确命名约定的正确图像文件,但仍然面临同样的问题。 我参考了文档和教程,并实现了几乎相同的方法。 我究竟做错了什么?
public class UploadActivity extends AppCompatActivity {
Button selectfile,upload;
TextView notify;
Uri imguri;
ProgressDialog progressDialog;
FirebaseStorage storage;
FirebaseDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload);
storage = FirebaseStorage.getInstance();
database = FirebaseDatabase.getInstance();
selectfile = findViewById(R.id.SelectFile);
upload = findViewById(R.id.UploadFile);
notify = findViewById(R.id.notify);
selectfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(UploadActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
selectPDF();
}
else{
ActivityCompat.requestPermissions(UploadActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},9);
}
}
});
upload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(imguri!=null){
uploadFile(imguri);
}
else{
Toast.makeText(UploadActivity.this, "Please Select a File", Toast.LENGTH_SHORT).show();
}
}
});
}
private void uploadFile(Uri imguri) {
final String filename = System.currentTimeMillis()+"";
progressDialog = new ProgressDialog(this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle("Uploading File... ");
progressDialog.setProgress(0);
progressDialog.show();
StorageReference storageReference = storage.getReference();
storageReference.child("Uploads").child(filename).putFile(imguri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Task<Uri> task = taskSnapshot.getMetadata().getReference().getDownloadUrl();
task.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String url = uri.toString();
DatabaseReference databaseReference = database.getReference();
databaseReference.child(filename).setValue(url).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
Toast.makeText(UploadActivity.this, "Successfully Uploaded", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(UploadActivity.this, "Please Try Again", Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(UploadActivity.this, "File was not uploaded, please try again!", Toast.LENGTH_SHORT).show();
}
}).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
int currentProgress = (int) (100*taskSnapshot.getBytesTransferred()/taskSnapshot.getTotalByteCount());
progressDialog.setProgress(currentProgress);
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode==9 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
selectPDF();
}
else{
Toast.makeText(this, "Please Provide External Storage Permission", Toast.LENGTH_LONG).show();
}
}
private void selectPDF() {
Intent intent = new Intent();
intent.setType("images/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,86);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 86 && resultCode == RESULT_OK && data != null) {
imguri = data.getData();
notify.setText("File Selected : "+ data.getData().getLastPathSegment());
} else {
Toast.makeText(this, "Please Select a file", Toast.LENGTH_SHORT).show();
}
}
}
【问题讨论】:
-
您在
onFailure()中遇到的错误是什么? -
应用程序崩溃并提示“文件未上传,请重试!”显示,这意味着 onFailureListener 被执行。
-
尝试记录异常信息。
Log.d("TAG", e.getException().getMessage());告诉我们打印出来的内容。 -
所以我记录了两个错误:1.) 发生了 StorageException。发生未知错误,请检查服务器响应的 HTTP 结果代码和内部异常。 2.) android.view.WindowLeaked: Activity com.example.tradeapp.UploadActivity 已经泄露了最初添加在这里的窗口 DecorView@c108806[ ]。我相信,第一个错误导致了第二个,但不确定。
-
感谢@AlexMamo。我将存储版本更改为最新版本,现在它可以正常工作了。
标签: android firebase google-cloud-firestore