2017-04-10 3 views
0

Ich habe ein Problem mit Firebase Storage und Realtime DB. Mein Firebase-Objekt besteht aus 4 String-Feldern, drei von ihnen stammen aus EditText-Widgets, das vierte muss die downloadURL eines Bildes sein, das ich in Firebase Storage gelegt habe, aber ich verstehe nicht, wie ich es dort ablegen soll.Wie füge downloadUrl dem fireBaseDB Objekt hinzu?

Mein aktueller Code für Daten zu FirebaseDB drängt unter:

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

      try { 
       menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), mChosenStorageRef.getDownloadUrl().toString()); 
       mChosenDBRef.push().setValue(menuItem); 
      } catch (NumberFormatException exception) { 
       Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG); 
       toast.show(); 
      } 

      name.setText(""); 
      description.setText(""); 
      price.setText(""); 

Die mChosenStorageRef.getDownloadUrl().toString() Methode gibt mir so etwas wie „[email protected]“, aber nicht die richtige URL.

Ich kann die richtige donwloadURL aus dem unten stehenden Code, ich kann nicht verstehen, wie man es in die Push-Methode oben setzen.

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


      Intent intent = new Intent(Intent.ACTION_PICK); 
      intent.setType("image/*"); 
      startActivityForResult(intent, RC_PHOTO_PICKER); 




     } 
    }); 


} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode == RC_PHOTO_PICKER) 
    { 

     Uri imageUri = data.getData(); 
     mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment()); 
     mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
       Uri downloadUri = taskSnapshot.getDownloadUrl(); 


      } 
     }); 
    } 
} 

Antwort

0

Das Problem war einfach, dann habe ich je erwartet hätte. Ich habe den URI außerhalb von onCreate in einer URI-Variablen gespeichert und später in der Upload-Methode verwendet.

Notwendigkeit, Java mehr und mehr zu studieren. Danke an alle für Aufmerksamkeit und Hilfe.

private Uri downloadURL; 

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


      try { 
       menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), downloadURL.toString()); 
       mChosenDBRef.push().setValue(menuItem); 
      } catch (NumberFormatException exception) { 
       Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG); 
       toast.show(); 
      } 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RC_PHOTO_PICKER) { 

     Uri imageUri = data.getData(); 


     mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment()); 
     mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() { 


      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 

       downloadURL = taskSnapshot.getDownloadUrl(); 
       Toast toast = Toast.makeText(MainActivity.this, "Successful", Toast.LENGTH_LONG); 
       toast.show(); 




      } 
     }); 
0

Sie erhalten nur Task<Uri> von mChosenStorageRef.getDownloadUrl()

Ich habe 2 Ideen für Sie eine downloadURL zu bekommen.

  1. Speichern taskSnapshot.getDownloadUrl() als String in eine Instanz-Variable aus putFile ‚s Rückruf dann könnten Sie einen Wert dieser Variablen überprüfen, bevor RTDB senden, wenn Sie benötigen.

    mDownloadUrl = taskSnapshot.getDownloadUrl().toString(); 
    
  2. Get downloadURL von Lagerung, auf diese Weise benötigen Sie einen Rückruf Antwort zuerst, danach erhalten Sie uri es dann auf Zeichenfolge konvertieren und zu RTDB zu senden.

    mChosenStorageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener <Uri>() { 
        @Override public void onSuccess(Uri uri) { 
         mDownloadUrl = uri.toString(); 
         // Send datas to RTDB 
        } 
    }); 
    
+0

Vielen Dank für die Antwort. Ich habe versucht, beide Wege zu beschreiben, aber ich habe keine Lösung. Der erste Weg gab mir etwas wie [email protected] Die zweite Möglichkeit besteht darin, die URL in die Datenbank zu schieben. Aber es bringt es zu einem separaten Objekt in der DB, was ich nicht brauche. Hoffe ich habe dich richtig verstanden. – Konstantin

Verwandte Themen