Android 为什么图像上载在firebase存储中失败?
单击“选择图像”按钮可以选择图像,图像将显示在imageview中 并将在单击“保存图像”后上载到firebase存储。如果成功,则有关该图像的数据将上载到实时firebase数据库。但单击“保存图像”按钮后不会发生任何事情。有什么问题吗 以下是我的代码:Android 为什么图像上载在firebase存储中失败?,android,firebase-realtime-database,firebase-storage,Android,Firebase Realtime Database,Firebase Storage,单击“选择图像”按钮可以选择图像,图像将显示在imageview中 并将在单击“保存图像”后上载到firebase存储。如果成功,则有关该图像的数据将上载到实时firebase数据库。但单击“保存图像”按钮后不会发生任何事情。有什么问题吗 以下是我的代码: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button chooseButton,sa
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button chooseButton,saveButton,displayButton;
private EditText imagenameEdittext;
private ImageView imageView;
private ProgressBar progressBar;
private Uri imageUri;
private StorageReference storageReference;
private DatabaseReference databaseReference;
private StorageTask uploadTask;
private static final int IMAGE_REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseReference = FirebaseDatabase.getInstance().getReference("Upload");
storageReference = FirebaseStorage.getInstance().getReference("Upload");
chooseButton = findViewById(R.id.chooseImageButtonid);
saveButton = findViewById(R.id.saveImageButtonid);
displayButton = findViewById(R.id.displayImageButtonid);
progressBar = findViewById(R.id.progressbarid);
imageView = findViewById(R.id.imageviewid);
imagenameEdittext = findViewById(R.id.imagenameEdittextid);
chooseButton.setOnClickListener(this);
saveButton.setOnClickListener(this);
displayButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.chooseImageButtonid:
openFileChooser();
break;
case R.id.saveImageButtonid:
if(uploadTask!=null && uploadTask.isInProgress()){
Toast.makeText(this, "Uploading in progress", Toast.LENGTH_SHORT).show();
}
else{
saveData();
}
saveData();
break;
case R.id.displayImageButtonid:
break;
}
}
public void openFileChooser(){
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==IMAGE_REQUEST && resultCode==RESULT_OK && data!=null && data.getData()!=null){
imageUri = data.getData();
Picasso.get().load(imageUri).into(imageView);
}
}
public String getFileExtension(Uri imageUri){
ContentResolver contentResolver = getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(imageUri));
}
private void saveData(){
final String imageName = imagenameEdittext.getText().toString().trim();
if(imageName.isEmpty()){
imagenameEdittext.setError("Enter the image name");
imagenameEdittext.requestFocus();
return;
}
StorageReference ref = storageReference.child(System.currentTimeMillis()+"."+getFileExtension(imageUri));
ref.putFile(imageUri)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Get a URL to the uploaded content
Toast.makeText(MainActivity.this, "Image is stored Successfully", Toast.LENGTH_SHORT).show();
Upload upload = new Upload(imageName,taskSnapshot.getStorage().getDownloadUrl().toString());
String uploadId = databaseReference.push().getKey();
databaseReference.child(uploadId).setValue(upload);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle unsuccessful uploads
Toast.makeText(MainActivity.this, "Image store failed", Toast.LENGTH_SHORT).show();
}
});
}
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私有按钮选择按钮、保存按钮、显示按钮;
私有EditText imagenameEdittext;
私人影像视图;
私人ProgressBar ProgressBar;
私有Uri-imageUri;
私有存储参考存储参考;
私有数据库参考数据库参考;
私有存储任务上传任务;
私有静态最终int图像_请求=1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseReference=FirebaseDatabase.getInstance().getReference(“上载”);
storageReference=FirebaseStorage.getInstance().getReference(“上载”);
chooseButton=findviewbyd(R.id.chooseImageButtonid);
saveButton=findViewById(R.id.saveImageButtonid);
displayButton=findViewById(R.id.displayImageButtonid);
progressBar=findViewById(R.id.progressbarid);
imageView=findViewById(R.id.imageviewid);
imagenameEdittext=findViewById(R.id.imagenameEdittextid);
选择Button.setOnClickListener(此);
saveButton.setOnClickListener(这个);
displayButton.setOnClickListener(此);
}
@凌驾
公共void onClick(视图){
开关(view.getId()){
案例R.id.选择图像按钮NID:
openFileChooser();
打破
案例R.id.saveImageButtonid:
if(uploadTask!=null&&uploadTask.isInProgress()){
Toast.makeText(这是“正在上载”,Toast.LENGTH_SHORT).show();
}
否则{
saveData();
}
saveData();
打破
案例R.id.displayImageButtonid:
打破
}
}
public void openFileChooser(){
意图=新意图();
intent.setType(“image/*”);
intent.setAction(intent.ACTION\u GET\u CONTENT);
startActivityForResult(意图、图像请求);
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==IMAGE\u REQUEST&&resultCode==RESULT\u OK&&data!=null&&data.getData()!=null){
imageUri=data.getData();
Picasso.get().load(imageUri).into(imageView);
}
}
公共字符串getFileExtension(Uri imageUri){
ContentResolver ContentResolver=getContentResolver();
MimeTypeMap MimeTypeMap=MimeTypeMap.getSingleton();
返回mimeTypeMap.getextensionfrommetype(contentResolver.getType(imageUri));
}
私有void saveData(){
最终字符串imageName=imagenameEdittext.getText().toString().trim();
if(imageName.isEmpty()){
设置错误(“输入图像名称”);
imagenameEdittext.requestFocus();
返回;
}
StorageReference ref=StorageReference.child(System.currentTimeMillis()+“+”+getFileExtension(imageUri));
ref.putFile(imageUri)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
//获取上传内容的URL
Toast.makeText(MainActivity.this,“图像已成功存储”,Toast.LENGTH_SHORT.show();
Upload Upload=新上载(imageName,taskSnapshot.getStorage().getDownloadUrl().toString());
String uploadId=databaseReference.push().getKey();
databaseReference.child(uploadId).setValue(upload);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理不成功的上传
Toast.makeText(MainActivity.this,“图像存储失败”,Toast.LENGTH_SHORT.show();
}
});
}
}
请告诉我imageuri是否为空?
尝试在日志中打印imageuri以检查它是否为空。可能是运行时权限问题。从API 23开始,您需要运行时权限才能访问gallert以拾取图像。您无法像这样获取下载url=>taskSnapshot.getStorage().getDownloadUrl().toString()这不起作用:
taskSnapshot.getStorage().getDownloadUrl().toString()
获取下载url的正确方法,请参阅或尝试使用VPN
上载。您可以使用热点Sheild VPN。如果上传与VPN配合使用,那么您必须了解您所在国家的互联网服务存在问题。因为,在孟加拉国,firebase storage的本机sdk从2020年5月29日起停止工作。这是孟加拉国BTCL的一个问题。我们与它毫无关系。所以,尝试一下热点Sheild VPN.mubin986我在这方面使用了SuperVPN。但是仍然没有发生任何事情我检查了imageuri,它不是空的