Android 如何获取firebase存储的下载url并更新firestore文档?
我一直在努力从我的应用程序中获取上传到firebase存储的图像的下载url。 我想将此url发送到firestore数据库(不是实时数据库)。 我正在将itemImageUri设置为Android 如何获取firebase存储的下载url并更新firestore文档?,android,firebase,google-cloud-firestore,firebase-storage,Android,Firebase,Google Cloud Firestore,Firebase Storage,我一直在努力从我的应用程序中获取上传到firebase存储的图像的下载url。 我想将此url发送到firestore数据库(不是实时数据库)。 我正在将itemImageUri设置为uri.toString(),但在onCreate()方法中,itemImageUrl为null,并在firestore中显示为null。我不能在onSuccess方法中使用collectionreferenece addItemRef,因为它为所有字符串变量提供了错误:从内部类访问变量需要声明为final pub
uri.toString()
,但在onCreate()
方法中,itemImageUrl为null,并在firestore中显示为null。我不能在onSuccess
方法中使用collectionreferenece addItemRef
,因为它为所有字符串变量提供了错误:从内部类访问变量需要声明为final
public class AddItemActivity extends AppCompatActivity {
public class AddItemActivity extends AppCompatActivity {
public static final int PICK_IMAGE_REQUEST = 1;
public static final String TAG = "Error!";
public static final String UPLOAD_TAG = "Image uploaded";
private Uri imageUri = null;
private TextInputEditText textFieldTitle;
private TextInputEditText textFieldDesc;
private AutoCompleteTextView dropdownItemType;
private TextInputEditText textFieldAddress;
private TextInputEditText textFieldAvailability;
private MaterialButton buttonSubmitItem;
private MaterialButton buttonAddImage;
private ImageView imageViewItem;
private String itemImageUrl;
private Bitmap bitmap;
private Uri itemImageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_item);
imageViewItem = findViewById(R.id.imageView_camera);
textFieldTitle = findViewById(R.id.textField_title);
textFieldDesc = findViewById(R.id.textField_description);
dropdownItemType = findViewById(R.id.dropdown_itemType);
//Select type dropdown
String[] itemTypes = new String[] {
"Food",
"Clothing",
"Footwear"
};
ArrayAdapter<String> itemsDropdownAdpater = new ArrayAdapter<>(AddItemActivity.this, R.layout.dropdown_item_type, itemTypes);
dropdownItemType.setAdapter(itemsDropdownAdpater);
textFieldAddress = findViewById(R.id.textField_address);
textFieldAvailability = findViewById(R.id.textField_availability);
buttonAddImage = findViewById(R.id.button_addImage);
buttonSubmitItem = findViewById(R.id.button_submitItem);
buttonAddImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(AddItemActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(AddItemActivity.this, "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(AddItemActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
} else {
choseImage();
}
} else {
choseImage();
}
}
});
buttonSubmitItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
submitItem();
}
});
}
private void choseImage() {
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1, 1)
.start(AddItemActivity.this);
}
private void submitItem() {
String title = textFieldTitle.getText().toString();
String desc = textFieldDesc.getText().toString();
String type = dropdownItemType.getText().toString();
String address = textFieldAddress.getText().toString();
String availability = textFieldAvailability.getText().toString();
if (title.trim().isEmpty() ||
desc.trim().isEmpty() ||
type.trim().isEmpty() ||
availability.trim().isEmpty()) {
Toast.makeText(this, "Fields cant be empty", Toast.LENGTH_SHORT).show();
return;
}
handleUpload(bitmap);
CollectionReference addItemRef = FirebaseFirestore.getInstance()
.collection("ItemList");
addItemRef.add(new ItemListModel(title, desc, type, address, availability, itemImageUrl));
Toast.makeText(this, "Item added", Toast.LENGTH_SHORT).show();
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
imageUri = result.getUri();
imageViewItem.setImageURI(imageUri);
imageViewItem.invalidate();
BitmapDrawable drawable = (BitmapDrawable) imageViewItem.getDrawable();
bitmap = drawable.getBitmap();
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Exception error = result.getError();
}
}
}
private void handleUpload(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
final StorageReference reference = FirebaseStorage.getInstance().getReference()
.child("itemImages")
.child(System.currentTimeMillis() + ".jpeg");
reference.putBytes(baos.toByteArray())
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
getItemImageUrl(reference);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "onFailure: ", e.getCause());
}
});
}
private void getItemImageUrl(StorageReference reference) {
reference.getDownloadUrl()
.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
itemImageUrl = uri.toString();
}
});
}
}
公共类AddItemActivity扩展了AppCompatActivity{
公共类AddItemActivity扩展了AppCompatActivity{
公共静态最终整数选取图像请求=1;
公共静态最终字符串TAG=“Error!”;
公共静态最终字符串上传\u TAG=“图像上传”;
私有Uri imageUri=null;
私有文本输入文本文本字段标题;
私有文本输入文本文本字段描述;
私有AutoCompleteTextView dropdownItemType;
私有文本输入文本文本字段地址;
私有文本输入文本文本字段可用性;
私人材料按钮提交;
私人材料按钮尺寸;
私有ImageView imageViewItem;
私有字符串itemImageUrl;
私有位图;
私有Uri项ImageURI;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u add\u item);
imageViewItem=findViewById(R.id.imageView\U摄像头);
textFieldTitle=findviewbyd(R.id.textField\u title);
textFieldDesc=findviewbyd(R.id.textField\u说明);
dropdownItemType=findViewById(R.id.dropdown\u itemType);
//选择类型下拉列表
字符串[]项类型=新字符串[]{
“食物”,
“服装”,
“鞋类”
};
ArrayAdapter ItemsDropDownAdapter=新的ArrayAdapter(AddItemActivity.this,R.layout.dropdown\u item\u type,itemTypes);
setAdapter(ItemsDropDownAdapter);
textFieldAddress=findviewbyd(R.id.textField\u地址);
textFieldAvailability=findViewById(R.id.textField\u availability);
buttonAddImage=findViewById(R.id.button\u addImage);
ButtonSubmitem=findViewById(R.id.button\u submitItem);
buttonAddImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
if(ContextCompat.checkSelfPermission(AddItemActivity.this、Manifest.permission.READ\u EXTERNAL\u STORAGE)!=PackageManager.permission\u provided){
Toast.makeText(AddItemActivity.this,“权限被拒绝”,Toast.LENGTH_LONG.show();
ActivityCompat.requestPermissions(AddItemActivity.this,新字符串[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
}否则{
choseImage();
}
}否则{
choseImage();
}
}
});
ButtonsSubmitItem.setOnClickListener(新视图.OnClickListener()中){
@凌驾
公共void onClick(视图v){
次滴度();
}
});
}
私有void choseImage(){
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.setAspectRatio(1,1)
.start(AddItemActivity.this);
}
私有无效子项(){
字符串title=textfieldttitle.getText().toString();
字符串desc=textFieldDesc.getText().toString();
字符串类型=dropdownItemType.getText().toString();
字符串地址=textFieldAddress.getText().toString();
字符串可用性=textFieldAvailability.getText().toString();
if(title.trim().isEmpty())||
desc.trim().isEmpty()说明||
type.trim().isEmpty()类型||
availability.trim().isEmpty()){
Toast.makeText(此“字段不能为空”,Toast.LENGTH_SHORT).show();
返回;
}
handleUpload(位图);
CollectionReference addItemRef=FirebaseFirestore.getInstance()
.收款(“项目清单”);
addItemRef.add(新的ItemListModel(标题、描述、类型、地址、可用性、itemImageUrl));
Toast.makeText(此“项目已添加”,Toast.LENGTH_SHORT).show();
完成();
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==CropImage.CROP\u IMAGE\u ACTIVITY\u REQUEST\u CODE){
CropImage.ActivityResult结果=CropImage.getActivityResult(数据);
if(resultCode==RESULT\u OK){
imageUri=result.getUri();
setImageURI(imageUri);
imageViewItem.invalidate();
BitmapDrawable drawable=(BitmapDrawable)imageViewItem.getDrawable();
bitmap=drawable.getBitmap();
}else if(resultCode==CropImage.CROP\u IMAGE\u ACTIVITY\u RESULT\u ERROR\u CODE){
异常错误=result.getError();
}
}
}
私有void handleUpload(位图){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
压缩(bitmap.CompressFormat.JPEG,100,baos);
final StorageReference=FirebaseStorage.getInstance().getReference()
.child(“项目图像”)
.child(System.currentTimeMillis()+“.jpeg”);
reference.putBytes(baos.toByteArray())
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSn
const options = {
version: 'v2', // defaults to 'v2' if missing.
action: 'read',
expires: Date.now() + 1000 * 60 * 60, // one hour
};
let url = storage
.bucket(bucketname)
.file(filename)
.getSignedUrl(options);
private void getItemImageUrl(StorageReference reference) {
reference.getDownloadUrl()
.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
itemImageUrl = uri.toString();
... here you can write itemImageUrl to the database
}
});
}
final StorageReference fileReference = storageRef.child(System.currentTimeMillis()
+ "." + getFileExtension(uriList.get(i)));
uploadTask = fileReference.putFile(uriList.get(i));
uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful() && task.getException() != null) {
throw task.getException();
}
return fileReference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
Uri downloadUri = task.getResult();
if(downloadUri != null) {
itemImageUrl = downloadUri.toString()
// create your object
// upload your object to the database here
}
}
}
});