How to crop a gallery image or photo taken by the camera, save and upload to an imageView

Asked

Viewed 6,022 times

7

I would like to know how to cut an image from the gallery or photo taken by the camera, save and upload to a imageView, to be able to do that for the gallery option of intent, but for the camera option it returns me a data = null below follows my code.

Activity Editarcontaactivity:

    public class EditarContaActivity extends Activity implements OnClickListener {

    private static int RESULTADO_IMAGEM_CARREGADA = 1;
    private static final String filename = "profile.jpg";
    private static final File file = new File(Environment.getExternalStorageDirectory(), filename);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_editarconta);

        imguser = (ImageView)findViewById(R.id.imgdefault_user);

        btneditar = (Button)findViewById(R.id.btneditar);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_editarconta, menu);
        return true;
    }

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

        // Detecta códigos de pedido
        if(requestCode == RESULTADO_IMAGEM_CARREGADA && resultCode == Activity.RESULT_OK) {
            Log.i("AQUI!", "Entrou no IF");
            Bitmap bitmap = null;
            if(data == null) {
                Log.i("AQUI!", "Câmera"); 
            } else {
                Log.i("AQUI!", "Imagem cortada");
                Bundle extras = data.getExtras();
                bitmap = extras.getParcelable("data");
                Log.i("AQUI!", "Bitmap recebeu a imagem");  

                FileOutputStream fos;
                try {
                    fos = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);  
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
                int largura = imguser.getWidth();
                int altura = largura;
                RelativeLayout.LayoutParams margens = (RelativeLayout.LayoutParams) imguser.getLayoutParams();
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(largura, altura);
                params.addRule(RelativeLayout.CENTER_HORIZONTAL);
                params.setMargins(0, margens.topMargin, 0, 0);
                imguser.setLayoutParams(params);
                imguser.setImageBitmap(bitmap);
            }

        }
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub

        if(v.getId() == R.id.btneditar) {
            boolean mExternalStorageAvailable = false; 
            boolean mExternalStorageWriteable = false; 
            String state = Environment.getExternalStorageState(); 
            if (Environment.MEDIA_MOUNTED.equals(state)) { 
                // Podemos ler e escrever os meios de comunicação 
                mExternalStorageAvailable = mExternalStorageWriteable = true; 
                Log.i("PERMISSÂO", "Podemos ler e escrever os meios de comunicação");
            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
                // Só podemos ler a mídia 
                mExternalStorageAvailable = true; 
                mExternalStorageWriteable = false; 
                Log.i("PERMISSÂO", "Só podemos ler a mídia");
            } else { 
                // Não podemos ler nem escrever 
                mExternalStorageAvailable = mExternalStorageWriteable = false; 
                Log.i("PERMISSÂO", "Não podemos ler nem escrever");
            }           

            Intent carregaImagem = CarregarImagem.pegaIntencao(this, file);

            startActivityForResult(carregaImagem, RESULTADO_IMAGEM_CARREGADA);
        }

    }

}

Cargo class:

    public class CarregarImagem {   

    public static Intent pegaIntencao(Context context, File file) {

        // Cria um array de Intenções de Câmera.
        final List<Intent> cameraIntencoes = new ArrayList<Intent>();
        final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        final PackageManager packageManager = context.getPackageManager();
        final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
        for (ResolveInfo res : listCam){
            final String packageName = res.activityInfo.packageName;
            final Intent intent = new Intent(captureIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            intent.setPackage(packageName);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            cameraIntencoes.add(intent);
        }

        // Cria Intenção de Galeria.
        final Intent galeriaIntencao = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        galeriaIntencao.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
        executarCorte(galeriaIntencao, 1, 1, 300, 300);

        // Seletor de opções do sistema de arquivos.
        final Intent chooserIntent = Intent.createChooser(galeriaIntencao, "Foto de Perfil");

        // Add a opção de câmera.
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntencoes.toArray(new Parcelable[]{}));      

        return chooserIntent;

    }

    public static void executarCorte(Intent cortarIntencao, int aspectX, int aspectY, int outputX, int outputY) {
        cortarIntencao.putExtra("crop", "true");            
        cortarIntencao.putExtra("aspectX", aspectX);
        cortarIntencao.putExtra("aspectY", aspectY);
        cortarIntencao.putExtra("scale", true);
        cortarIntencao.putExtra("outputX", outputX);
        cortarIntencao.putExtra("outputY", outputY);
        cortarIntencao.putExtra("return-data", true);
    }

}

I have researched everything, but I found nothing but I left a treatise on onActivityResult if case data = null, but I do not know what to put there.

1 answer

0


Well I solved the problem, but I don’t know if it works for most devices. In the Android 2.3.3 API(10) emulator, the camera changes the orientation of the screen and causes a small problem of not loading the image. As I am using the emulator just for testing I forced to change the orientation of the screen at the time it will open the hack intention with this line: setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); within the if(data == null). Of course it is not a definitive solution, so I only use it to test on the emulator. For my Android device 4.2.1 need not follow the code below hope to help someone:

Activity Editarcontaactivity:

public class EditarContaActivity extends Activity implements OnClickListener {

private static int RESULTADO_IMAGEM_CARREGADA = 1;
private static int RESULTADO_IMAGEM_CORTADA = 2;    
ImageView imguser;
Button btneditar;   
private static final String CHAVE_ARMAZENADA_URI_ARQUIVO = "output_file_uri";
private static final String filename = "perfil.jpg";

// Não é possível iniciar um arquivo estático em uma pasta interna do app
// Por ser necessário para recuperar o URI da câmera eu crio ele externo
private static final File file = new File(Environment.getExternalStorageDirectory(), filename);
private Uri outputFileUri = Uri.fromFile(file);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.activity_editarconta);

    imguser = (ImageView)findViewById(R.id.imgdefault_user);

    btneditar = (Button)findViewById(R.id.btneditar);
    btneditar.setOnClickListener(this);

}   

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_editarconta, menu);
    return true;
}

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

    // Detecta códigos de pedido
    if(resultCode == Activity.RESULT_OK) {

        if(requestCode == RESULTADO_IMAGEM_CARREGADA) {
            // Imagem foi selecionada!

            final Uri uriImagem;
            if(data == null) {
                // Imagem veio da câmera!
                uriImagem = outputFileUri;                  
            } else {
                // Imagem veio da galeria ou qualquer app do tipo!
                uriImagem = data.getData();
            }

            // Após obter o URI da imagem selecionada iniciar a intenção de corte!
            try {                   
                final Intent intencaoCortar = CarregarImagem.executarCorte(uriImagem, outputFileUri, 1, 1, 300, 300);
                startActivityForResult(intencaoCortar, RESULTADO_IMAGEM_CORTADA);
            } catch (Exception e) {
                // TODO: handle exception
                Toast.makeText(this, "Ops - Seu dispositivo não suporta a ação de cortar imagens!", Toast.LENGTH_LONG).show();
            }
        }

        if(requestCode == RESULTADO_IMAGEM_CORTADA) {
            // Imagem foi cortada!

            // Por ser uma imagem de perfil de usuário
            // Pra mim a melhor prática é salvar em uma pasta interna
            // Mas se quiser salvar em uma pasta externa
            // Salve com um novo nome diferente do nome criado em "filename"
            // Ou remova esta linha do código: "file.delete();"
            Bundle extras = data.getExtras();
            Bitmap bitmap = extras.getParcelable("data");
            final File finalfile = new File(this.getFilesDir(), filename);
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(finalfile);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                if(configurada) {
                    imguser.setImageBitmap(bitmap);
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            // Para cortar a imagem foi necessário criar um arquivo
            // Após ter cortado e salvado a imagem cortada
            // Esse arquivo não é mais necessário e podemos excluir(opcional)
            file.delete();
        }

    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Salvar os estados da aplicação atual do usuário      
    savedInstanceState.putString(CHAVE_ARMAZENADA_URI_ARQUIVO, outputFileUri.toString());

    // Sempre chamar a superclasse (classe-pai) para que ele possa salvar o estado de exibição de hierarquia
    super.onSaveInstanceState(savedInstanceState);
}

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Sempre chamar a superclasse (classe-pai) para que ele possa restaurar a hierarquia de exibição
    super.onRestoreInstanceState(savedInstanceState);

    // Restaurar estados membros da instância salvo
    final String outputFileUriStr = savedInstanceState.getString(CHAVE_ARMAZENADA_URI_ARQUIVO);
    outputFileUri = Uri.parse(outputFileUriStr);
}

public void onClick(View v) {

    if(v.getId() == R.id.btneditar) {
        boolean mExternalStorageAvailable = false; 
        boolean mExternalStorageWriteable = false; 
        String state = Environment.getExternalStorageState(); 
        if (Environment.MEDIA_MOUNTED.equals(state)) { 
            // Podemos ler e escrever os meios de comunicação 
            mExternalStorageAvailable = mExternalStorageWriteable = true; 
            Log.i("PERMISSÂO", "Podemos ler e escrever os meios de comunicação");
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
            // Só podemos ler a mídia 
            mExternalStorageAvailable = true; 
            mExternalStorageWriteable = false; 
            Log.i("PERMISSÂO", "Só podemos ler a mídia");
        } else { 
            // Outra coisa que está errada. Pode ser um de muitos outros estados, mas tudo o que precisamos 
            // Para saber é que não podemos ler nem escrever 
            mExternalStorageAvailable = mExternalStorageWriteable = false; 
            Log.i("PERMISSÂO", "Não podemos ler nem escrever");
        }

        Intent carregaImagem = CarregarImagem.pegaIntencao(this, file);

        startActivityForResult(carregaImagem, RESULTADO_IMAGEM_CARREGADA);
    }       

}   

Cargo class:

public class CarregarImagem {

private static final String filename = "perfil.jpg";

public static Intent pegaIntencao(Context context, File file) {     

    // Cria um array de Intenções de Câmera.
    final List<Intent> cameraIntencoes = new ArrayList<Intent>();
    final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final PackageManager packageManager = context.getPackageManager();
    final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
    for (ResolveInfo res : listCam){
        final String packageName = res.activityInfo.packageName;
        final Intent intent = new Intent(captureIntent);
        intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
        intent.setPackage(packageName);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
        cameraIntencoes.add(intent);
    }

    // Cria Intenção de Galeria e outros app do tipo.
    final Intent galeriaIntencao = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    galeriaIntencao.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

    // Seletor de opções do sistema de arquivos.
    final Intent chooserIntent = Intent.createChooser(galeriaIntencao, "Foto de Perfil");

    // Add a opção de câmera.
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntencoes.toArray(new Parcelable[]{}));      

    return chooserIntent;

}

public static Intent executarCorte(Uri uriEntrada, Uri uriSaida, int aspectX, int aspectY, int outputX, int outputY) {
    Intent intencaoCortar = new Intent("com.android.camera.action.CROP");
    intencaoCortar.putExtra(MediaStore.EXTRA_OUTPUT, uriSaida);
    intencaoCortar.setDataAndType(uriEntrada, "image/*");
    intencaoCortar.putExtra("crop", "true");            
    intencaoCortar.putExtra("aspectX", aspectX);
    intencaoCortar.putExtra("aspectY", aspectY);
    intencaoCortar.putExtra("scale", true);
    intencaoCortar.putExtra("outputX", outputX);
    intencaoCortar.putExtra("outputY", outputY);
    intencaoCortar.putExtra("return-data", true);
    return intencaoCortar;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.