2016-12-29 27 views
1

Ich arbeite an einer einfachen Blog-App, mit der der Benutzer Fotos aus der Telefongalerie und Beschreibungen auf den Firebase-Server hochladen kann. Ich versuche, mein aktuelles Projekt zu ändern, damit der Benutzer ein Foto von der Kamera aufnehmen und auf den Firebase-Server hochladen kann.Bild von der Kamera aufnehmen und zu Firebase hochladen

Momentan kann ich das Bild, das ich in imagebutton erfasst habe, anzeigen, allerdings kann ich mein Bild nicht auf dem Firebase Server veröffentlichen (Der "post posten" Button reagiert nicht auf meine onclick Funktion).

Ich vermute, dass ein Fehler in meiner startPosting() -Funktion ist oder ich das Bild nicht korrekt codiert habe? Bitte helfen Sie.

package simpleblog2.emily.example.com.simpleblog2; 

import android.app.ProgressDialog; 
import android.content.ContentProvider; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.media.Image; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.google.android.gms.tasks.OnSuccessListener; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.storage.FirebaseStorage; 
import com.google.firebase.storage.StorageReference; 
import com.google.firebase.storage.UploadTask; 
import com.squareup.picasso.Picasso; 

import com.theartofdev.edmodo.cropper.CropImage; 

import java.io.File; 


public class PostActivity extends AppCompatActivity { 

    private ImageButton mSelectImage; 
    private EditText mPostTitle; 
    private EditText mPostDesc; 
    private Button mSubmitBtn; 
    private ProgressDialog mProgress; 
    private DatabaseReference mDatabase; 

    private Uri mImageUri = null; 

    private static final int GALLERY_REQUEST = 1; 

    private static final int CAMERA_REQUEST_CODE = 1; 

    private StorageReference mStorage; 

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

     mStorage = FirebaseStorage.getInstance().getReference(); 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog"); 

     mSelectImage = (ImageButton) findViewById(R.id.imageSelect); 
     mPostTitle = (EditText) findViewById(R.id.titleField); 
     mPostDesc = (EditText) findViewById(R.id.descField); 
     mSubmitBtn = (Button) findViewById(R.id.submitBtn); 

     mProgress = new ProgressDialog(this); 

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

       Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(intent1, CAMERA_REQUEST_CODE); 
       intent1.setType("image/*"); 

       /* 
       Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); 
       galleryIntent.setType("image/*"); 
       startActivityForResult(galleryIntent, GALLERY_REQUEST); 
       */ 
      } 
     }); 

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

    private void startPosting() { 

     mProgress.setMessage("Posting to blog..."); 


     final String title_val = mPostTitle.getText().toString().trim(); 
     final String desc_val = mPostDesc.getText().toString().trim(); 
     if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && mImageUri != null) { 

      mProgress.show(); 
      StorageReference filepath = mStorage.child("Blog_Images").child(mImageUri.getLastPathSegment()); 

      filepath.putFile(mImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        Uri downloadUrl = taskSnapshot.getDownloadUrl(); 

        DatabaseReference newPost = mDatabase.push(); 
        newPost.child("title").setValue(title_val); 
        newPost.child("desc").setValue(desc_val); 
        newPost.child("image").setValue(downloadUrl.toString()); 


        mProgress.dismiss(); 
        startActivity(new Intent(PostActivity.this, MainActivity.class)); 
       } 
      }); 
     } 
    } 

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




     // if(requestCode == GALLERY_REQUEST && resultCode == RESULT_OK){ 
     if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) { 

     /* mImageUri = data.getData(); 
      mSelectImage.setImageURI(mImageUri); 

      CropImage.activity(mImageUri) 
        .setGuidelines(CropImageView.Guidelines.ON) 

        .start(this); 

*/ 

      Bitmap mImageUri = (Bitmap) data.getExtras().get("data"); 
      mSelectImage.setImageBitmap(mImageUri); 
     } 


     if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { 
      CropImage.ActivityResult result = CropImage.getActivityResult(data); 
      if (resultCode == RESULT_OK) { 
       Uri resultUri = result.getUri(); 
       mSelectImage.setImageURI(resultUri); 
      } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { 
       Exception error = result.getError(); 
      } 
     } 


    } 



} 
+0

@DaminiMehra Ihre Antwort ist eine neue Funktion, so dass die Funktion meines startPosting ist() Funktion zu ersetzen? Was habe ich an meinen Codes falsch gemacht? –

Antwort

1

ich eine Lösung auf meine Frage gefunden haben, wurde mir klar, dass ich meine erfassten Daten bekommen kann die Funktion von data.getData() verwenden, anstatt die Bitmap-Funktion:

mImageUri = data.getData(); 
      mSelectImage.setImageURI(mImageUri); 

auch hatte, erkannte ich, bisher nicht, dass mein ‚Ernte‘ Funktion nicht, weil ich von fehle funktionieren könnte:

mImageUri = resultUri; 

Ich erkannte, dass es ein Problem gibt, dass, wenn ich nicht mein aufgenommenes Bild beschneiden würde, die Basis nicht mit der hohen Auflösung umgehen könnte (oder Speichergröße? und es wird sehr langsam geladen/Bild wurde nicht angezeigt), Dies kann durch die "Cropping" -Funktion aufgelöst werden.

Der endgültige Code ist unten angegeben: Vielen Dank für Ihre Hilfe.

package simpleblog2.emily.example.com.simpleblog2; 

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.media.Image; 
import android.net.Uri; 

import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.text.TextUtils; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.Toast; 


import com.google.android.gms.tasks.OnSuccessListener; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.google.firebase.storage.FirebaseStorage; 

import com.google.firebase.storage.StorageReference; 
import com.google.firebase.storage.UploadTask; 


import com.theartofdev.edmodo.cropper.CropImage; 
import com.theartofdev.edmodo.cropper.CropImageView; 


public class PostActivity extends AppCompatActivity { 

    private ImageButton mSelectImage; 
    private EditText mPostTitle; 
    private EditText mPostDesc; 
    private Button mSubmitBtn; 
    private ProgressDialog mProgress; 
    private DatabaseReference mDatabase; 

    private Uri mImageUri = null; 

    private static final int GALLERY_REQUEST =1; 

    private static final int CAMERA_REQUEST_CODE=1; 

    private StorageReference mStorage; 

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

     mStorage = FirebaseStorage.getInstance().getReference(); 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Blog"); 

     mSelectImage = (ImageButton) findViewById(R.id.imageSelect); 
     mPostTitle = (EditText) findViewById(R.id.titleField); 
     mPostDesc = (EditText) findViewById(R.id.descField); 
     mSubmitBtn = (Button) findViewById(R.id.submitBtn); 

     mProgress = new ProgressDialog(this); 

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

       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

       if (intent.resolveActivity(getPackageManager()) != null) { 
        startActivityForResult(intent, CAMERA_REQUEST_CODE); 
       } 
       //startActivityForResult(intent,CAMERA_REQUEST_CODE); 


/* 
       Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT); 
       galleryIntent.setType("image/*"); 
       startActivityForResult(galleryIntent, GALLERY_REQUEST); 

       */ 

      } 
     }); 

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



    private void startPosting(){ 

     mProgress.setMessage("Posting to blog..."); 


     final String title_val = mPostTitle.getText().toString().trim(); 
     final String desc_val = mPostDesc.getText().toString().trim(); 
     if(!TextUtils.isEmpty(title_val)&&!TextUtils.isEmpty(desc_val) && mImageUri != null){ 

      mProgress.show(); 
      StorageReference filepath = mStorage.child("Blog_Images").child(mImageUri.getLastPathSegment()); 

      filepath.putFile(mImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        Uri downloadUrl =taskSnapshot.getDownloadUrl(); 

        DatabaseReference newPost = mDatabase.push(); 
        newPost.child("title").setValue(title_val); 
        newPost.child("desc").setValue(desc_val); 
        newPost.child("image").setValue(downloadUrl.toString()); 


        mProgress.dismiss(); 
        startActivity(new Intent(PostActivity.this,MainActivity.class)); 
       } 
      }); 
     } 
    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // if(requestCode == GALLERY_REQUEST && resultCode == RESULT_OK){ 
     if(requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK){ 




     mImageUri = data.getData(); 
      mSelectImage.setImageURI(mImageUri); 

      CropImage.activity(mImageUri) 
        .setGuidelines(CropImageView.Guidelines.ON) 
        .setAspectRatio(1,1) 
        .start(this); 




     /* Bitmap mImageUri1 = (Bitmap) data.getExtras().get("data"); 
     mSelectImage.setImageBitmap(mImageUri1); 

      Toast.makeText(this, "Image saved to:\n" + 
        data.getExtras().get("data"), Toast.LENGTH_LONG).show(); 


*/ 



     } 

     if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { 
      CropImage.ActivityResult result = CropImage.getActivityResult(data); 
      if (resultCode == RESULT_OK) { 
       Uri resultUri = result.getUri(); 

       mSelectImage.setImageURI(resultUri); 
       mImageUri = resultUri; 

      } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { 
       Exception error = result.getError(); 
      } 
     } 


    } 




} 
0

Vorher war es, wenn auth! = Null, aber ich änderte es, wenn es wahr ist, also wird das if immer wahr bewerten.

private void uploadFile() { 
    //if there is a file to upload 
    if (filePath != null) { 
     //displaying a progress dialog while upload is going on 
     final ProgressDialog progressDialog = new ProgressDialog(this); 
     progressDialog.setTitle("Uploading"); 
     progressDialog.show(); 

     StorageReference riversRef = storageReference.child("Blog_Images.jpg"); 
     riversRef.putFile(filePath) 
       .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
         //if the upload is successfull 
         //and displaying a success toast 
         Toast.makeText(getApplicationContext(), "File Uploaded ", Toast.LENGTH_LONG).show(); 
        } 
       }) 
       .addOnFailureListener(new OnFailureListener() { 
        @Override 
        public void onFailure(@NonNull Exception exception) { 
         //if the upload is not successfull 
         //hiding the progress dialog 
         progressDialog.dismiss(); 

         //and displaying error message 
         Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show(); 
        } 
       }) 
       .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { 
         //calculating progress percentage 
         double progress = (100.0 * taskSnapshot.getBytesTransferred())/taskSnapshot.getTotalByteCount(); 

         //displaying percentage in progress dialog 
         progressDialog.setMessage("Uploaded " + ((int) progress) + "%..."); 
        } 
       }); 
    } 
    //if there is not any file 
    else { 
     //you can display an error toast 
    } 
} 
0

Ihr Klassenfeld mImageUri wird nie initialisiert. Sie legen die empfangene Bitmap im lokalen Feld ab und werden als Klassenfeld bezeichnet.

Bitmap mImageUri = (Bitmap) data.getExtras().get("data"); 
mSelectImage.setImageBitmap(mImageUri); 

Daher ist die Bedingung nie wahr.

if (!TextUtils.isEmpty(title_val) && !TextUtils.isEmpty(desc_val) && mImageUri != null) 
+0

Ich initialisiere mit privatem Uri mImageUri = null; aber es gibt mir immer noch den gleichen Fehler –

+0

Genau, Sie initialisierten es mit null, und überprüfen Sie dann, ob es null ist. Sie überschreiben niemals den Nullwert, daher ist BedingungImageUri! = Null niemals wahr. – mol

+0

was soll ich tun? Entschuldigung, ich bin noch neu in Firebase .. –

0

if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) { 
 

 
     /* mImageUri = data.getData(); 
 
      mSelectImage.setImageURI(mImageUri); 
 

 
      CropImage.activity(mImageUri) 
 
        .setGuidelines(CropImageView.Guidelines.ON) 
 

 
        .start(this); 
 

 
*/ 
 

 
      Bitmap mImageUri = (Bitmap) data.getExtras().get("data"); 
 
      mSelectImage.setImageBitmap(mImageUri); 
 
     }

Es gibt eine Chance, dass Ihr URInull ist. Ich nehme an, das ist das Problem. Es sei denn Sie tun es woanders?

Das Bild könnte geladen werden, weil die requestCode = CAMERA_REQUEST_CODE aber nicht CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE.

Ich werde unten einen Code posten, den ich gemacht habe, um zu tun, was Sie fragen, aber zuerst einige Sachen, die Sie verstehen müssen. Von Android-Version 7 mit Uri.parseFromFile (Datei) gibt einen Fehler zurück, weil Google Ihren Zugriff einschränken möchten. Von nun an, wenn Sie Datei uri erhalten möchten, sollten Sie verwenden FileProvider

  1. erklären permmisions und FileProvider in Ihrem Manifest:

 
 
//File provider declaration in manifest. 
 
     <provider 
 
      android:name="android.support.v4.content.FileProvider" 
 
      android:authorities="com.hadas.yotam.manchworkers.provider" 
 
      android:exported="false" 
 
      android:grantUriPermissions="true"> 
 
      <meta-data 
 
       android:name="android.support.FILE_PROVIDER_PATHS" 
 
       android:resource="@xml/provider_paths"/> 
 
     </provider>

//in new xml file define the location you need permmision to, the code below give you permmision for any external file. 
 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
 
    <external-path name="external_files" path="."/> 
 
</paths>

so jetzt, wenn Sie Upload die globale Variable Uri verwenden, wenn onActivityResault erfolgreich ist, hier ist der Code:

if(Build.VERSION.SDK_INT>=24) { 
 
          String file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/" + Calendar.getInstance().getTimeInMillis() + ".jpg"; 
 
          File file1 = new File(file); 
 
          photoURI = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file1); 
 
          intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
 
         }

Dann in Ihrem onActivityResult Sie tun überprüfen, ob Ihr photoURI = null, wenn seine wahre (seine Null) verwenden Sie photoURI = Daten.Daten bekommen();

//if phone android version greater or equal to Marshmelo      
 

 
if(Build.VERSION.SDK_INT>Build.VERSION_CODES.M){ 
 

 
//check if have permmission to write to external + permmision to camera 
 

 
        if(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED && 
 
          ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED){ 
 

 
//if its have permission then new intent to capture image 
 

 
         intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
 

 
//if android version >= 24 (Android Nugget) 
 

 
         if(Build.VERSION.SDK_INT>=24) { 
 

 
//create new String to pictures directory and set the file name to current_time.jpg 
 
          String file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/" + Calendar.getInstance().getTimeInMillis() + ".jpg"; 
 
          File file1 = new File(file); 
 

 
//set GLOBAL variable Uri from the file using FileProvider 
 

 
          photoURI = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file1); 
 

 
//add the file location the intent (the picture will be save to this file) 
 

 
          intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
 
         } 
 
          tagIntent = CAPTURE_RESAULT; 
 
//else - dont have permission, request for permission 
 
        }else{ 
 
         requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA},CAPTURE_RESAULT); 
 
        } 
 
else - 
 
       }else{ 
 
// same thing only without FileProvider (FileProvider only required since Nugget) 
 

 
         intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
 
         String file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+"/" + Calendar.getInstance().getTimeInMillis() + ".jpg"; 
 
         File file1 = new File(file); 
 
         photoURI = Uri.fromFile(file1); 
 
         intent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI); 
 
        tagIntent = CAPTURE_RESAULT; 
 
       } 
 

 
//if phone can handle the intent, start the intent for resault. 
 

 
       if(intent.resolveActivity(getPackageManager())!=null) { 
 
      startActivityForResult(intent,tagIntent); 
 
       }

+0

Ja, ich setze es auf private Uri mImageUri = null; Ist das die Ursache meines Fehlers? Wenn ja, was sollte ich ändern? –

+0

Ich habe so etwas wie das, was Sie versuchen zu erreichen, wenn ich nach Hause komme, werde ich den relevanten Teil des Codes hochladen. –

+0

Im Allgemeinen müssen Sie den Dateipfad abrufen, aber das Abrufen der URL von Daten kann null zurückgeben (abhängig von der Android-Version). Wenn Sie Version 6 oder niedriger verwenden, können Sie Folgendes verwenden: mImageUri = data.getData(); Wenn du sicherstellen willst, dass du Uri bekommst, würde ich prüfen, ob das Telefon android 6 oder höher ausführt und ob es einen zusätzlichen Speicherort hinzufügt und die uri aus der Datei holt. –

Verwandte Themen