1

Je développe une application et dans ce cadre j'ai besoin de recadrer une image après la capture de la caméra ou après l'avoir choisie dans la galerie. J'ai un tiroir de navigation dans mon application et à partir de laquelle l'utilisateur peut sélectionner une option pour voir son image (caméra ou galerie). Chaque fois qu'il clique sur l'une des options, un fragment sera appelé dans lequel le reste est fait (appel de la caméra, en cliquant sur l'image, obtenir les données et en définissant l'image à l'imageview). Donc, maintenant je dois ajouter la fonctionnalité de recadrage pour l'image et j'ai utilisé l'une des bibliothèques de recadrage disponibles en ligne qui peut être trouvé here. Avant de l'essayer dans mon application, j'ai créé un nouveau projet de studio Android et fait un exemple d'application dans laquelle l'utilisateur peut sélectionner la caméra en cliquant sur un bouton, puis recadrage est fait et l'image recadrée est définie sur l'image sur l'écran. Le projet peut être trouvé here. Maintenant, j'ai essayé d'appliquer la même chose dans mon application, mais cela ne fonctionne pas. Venant au code, j'ai une classe de tiroir de navigation, puis une classe de fragment. Dans mon MainDrawerActivity (brève):Android: Recadrage d'une image après la capture ou la sélection à partir de la galerie

Dans les options de menu:

if (id == R.id.nav_camera) { 
     Fragment_TouchImageView camFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment); 
     camFrag.startCamera(); 
    } 
else if (id == R.id.nav_gallery) { 
     Fragment_TouchImageView galFrag = (Fragment_TouchImageView) getSupportFragmentManager().findFragmentById(R.id.imageFragment); 
     galFrag.openGallery(); 
    } 

Maintenant, dans mon Fragment_TouchImageView.java (Fragment):

Voici le code entier:

package com.example.shravan.watershed; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import com.soundcloud.android.crop.Crop; 

import java.io.File; 

public class Fragment_TouchImageView extends Fragment { 

Uri imageUri; 
private TouchImageView myTVF; 
static final int REQUEST_IMAGE_CAPTURE = 10; 
static final int PICK_IMAGE = 100; 
private static Context context; 
private static final String TAG = "Arunachala"; 

public Fragment_TouchImageView() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_fragment__touch_image_view, container, false); 
    context= getActivity().getApplicationContext(); 
    myTVF = (TouchImageView) v.findViewById(R.id.img); 
    myTVF.setImageBitmap(null); 
    return v; 
} 

public void startCamera() { 
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(i, REQUEST_IMAGE_CAPTURE); 
} 

public void openGallery() { 
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
    startActivityForResult(gallery, PICK_IMAGE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { 
     print("Camera requested"); 
     beginCrop(data.getData()); 
     print("Crop called and came to next line"); 
    } 
    else if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK)   { 
     print("Gallery requested"); 
     beginCrop(data.getData()); 
     print("Crop called and came to next line"); 
    } 
    else if (requestCode == Crop.REQUEST_CROP) { 
     print("Crop.REQUEST_CROP called"); 
     handleCrop(resultCode, data); 
     print("handleCrop called and came to next line"); 
    } 
} 

private void beginCrop(Uri source) { 
    print("Crop has begun"); 
    Uri destination = Uri.fromFile(new File(context.getCacheDir(), "cropped")); 
    Crop.of(source, destination).asSquare().start(getActivity()); 
    print("Crop has ended"); 
} 

private void handleCrop(int resultCode, Intent result) { 
    print("Came to handleCrop"); 
    if (resultCode == Activity.RESULT_OK) { 
     print("RESULT OK"); 
     myTVF.setImageURI(Crop.getOutput(result)); 
    } else if (resultCode == Crop.RESULT_ERROR) { 
     Toast.makeText(getActivity(), Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show(); 
    } 
} 

private void print(String s){ 
    Log.d(TAG, s); 
} 
} 

Donc, j'ai donné une série d'étiquettes de connexion pour connaître le flux et voici le problème. Chaque fois que je sélectionne la caméra ou la galerie, elle s'ouvre correctement et lorsque je capture l'image, beginCrop() est appelée et lorsque je sélectionne la zone de recadrage requise et que je clique sur Terminé., Elle ne fait rien. Le flux ne va pas dans cette boucle.

Les mêmes œuvres dans un projet d'application d'échantillons différents, sans aucun problème (Il n'a pas eu de fragments)

S'il vous plaît aidez-moi comprendre cela!

+0

Je la même problème en raison de onActivityResult ne pas être appelé correctement dans le fragment. Donc, utilisez une autre bibliothèque ou changez le fragment en activité –

+0

@AntonKazakov Merci pour la réponse. Je ne peux pas transformer fragment en activité car j'ai besoin de fragment dans mon application. Pouvez-vous s'il vous plaît me dire quel était exactement votre problème? Si vous avez fait face à un problème similaire, quelle bibliothèque avez-vous utilisée? –

+0

attendez un peu malade poster une réponse –

Répondre

2

je reçois le même problème il y a quelques semaines lorsque vous utilisez la même bibliothèque de sorte que le problème est avec onActivityResult et son requestCode lors de son utilisation dans le fragment essayez donc d'appeler Crop.of cette façon:

Crop.of(cropInputUri, cropOutputUri).asSquare().start(getContext(), Fragment.this, Crop.REQUEST_CROP); 
+0

Qu'entendez-vous par là? "ACTUAL_VALUE_OF_LIBRARI_REQUEST_CODE" Où puis-je obtenir la valeur réelle? –

+0

Je veux dire voir quelle valeur vous attendez et regardez la valeur réelle. alors mettre la valeur attendue à si bloquer –

+0

Je suis tellement désolé je ne vous ai pas eu. Comment puis-je connaître la valeur du code de requête? Y a-t-il un moyen possible de le savoir? S'il vous plaît faites le moi savoir! –