2017-09-27 5 views
0

Je dois stocker l'image de la caméra, et la galerie vers la base de feu. Dans mon projet de téléchargement de la galerie de travail, mais quand j'essaie de télécharger à partir de la caméra rien ne se passe. Lorsque vous cliquez sur le bouton que vous avez choisi entre la galerie ou la caméra. Lorsque vous prenez une photo ou que vous choisissez une image dans la galerie, dans imageview je reçois une image. Ensuite, je clique sur enregistrer et si l'image est de la galerie, puis est sauvegardé dans le stockage, et créer un enfant dans la base de données, mais si l'image provient de la caméra, cela ne fonctionnera pas. Y a-t-il une solution à ce problème?Télécharger l'image de la caméra vers la base de feu

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    private Uri mImageUri = null; 
    private Button btn,mSubmitBtn; 
    private ImageView imageview; 
    private int GALLERY = 1, CAMERA = 2; 

    private StorageReference mStorage; 
    private DatabaseReference mDatabase; 

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

     btn = (Button) findViewById(R.id.btn); 
     mSubmitBtn = (Button)findViewById(R.id.submit); 
     imageview = (ImageView) findViewById(R.id.iv); 

     mStorage = FirebaseStorage.getInstance().getReference(); 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Upload"); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showPictureDialog(); 
      } 
     }); 

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

    } 

    private void showPictureDialog(){ 
     AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this); 
     pictureDialog.setTitle("Select Action"); 
     String[] pictureDialogItems = { 
       "Select photo from gallery", 
       "Capture photo from camera" }; 
     pictureDialog.setItems(pictureDialogItems, 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         switch (which) { 
          case 0: 
           choosePhotoFromGallary(); 
           break; 
          case 1: 
           takePhotoFromCamera(); 
           break; 
         } 
        } 
       }); 
     pictureDialog.show(); 
    } 

    public void choosePhotoFromGallary() { 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

     startActivityForResult(galleryIntent, GALLERY); 
    } 

    private void takePhotoFromCamera() { 
     Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, CAMERA); 
    } 

    //////////////////////////// 
    private void startPosting(){ 

     if (mImageUri !=null){ 

      StorageReference filepath = mStorage.child("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();//push kreira uniq random id 


        newPost.child("image").setValue(downloadUrl.toString()); 

       } 
      }); 
     } 
    } 

    //////////////////////// 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == this.RESULT_CANCELED) { 
      return; 
     } 
     if (requestCode == GALLERY) { 
      if (data != null) { 
       mImageUri = data.getData(); 
       imageview.setImageURI(mImageUri); 
      } 

     } else if (requestCode == CAMERA) { 
      Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
      imageview.setImageBitmap(thumbnail); 
      imageview.setImageURI(mImageUri); 

     } 
    } 


} 
+0

cela se passe-t-il sur naugat et au-dessus des versions android? –

+0

oui, sur la version nougat –

Répondre

0

Je face à la même question et cela se produit principalement sur KitKat et inférieure version.When l'image est cliquée que d'obtenir le fichier bitmap directement essayer de le faire comme suit,

Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes); 
     File destination = new File(Environment.getExternalStorageDirectory(), 
       System.currentTimeMillis() + ".jpg"); 
     FileOutputStream fo; 
     try { 
      destination.createNewFile(); 
      fo = new FileOutputStream(destination); 
      fo.write(bytes.toByteArray()); 
      fo.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     imageview.setImageBitmap(thumbnail); 

également dans le fichier manifeste assurez-vous que vous avez déclaré l'autorisation suivante aussi avec le READ_EXTERNAL

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

La raison de ce problème est qu'Android 4.4 (KitKat) a modifié la façon dont les autorisations sont gérées sur la carte SD. Il est donc recommandé de créer votre propre répertoire sur la carte SD pour gérer tous les fichiers que votre application doit écrire. Cela fonctionne aussi pour toutes les versions supérieures.

Espérons que cela aide.