2010-01-18 19 views
27

Hola, actualmente estoy trabajando en un fondo de pantalla en vivo y le permito al usuario seleccionar una imagen que irá detrás de mis efectos.¿Cómo seleccionar y recortar una imagen en Android?

Actualmente tengo:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      i.putExtra("crop", "true"); 
      startActivityForResult(i, 1); 

Y poco menos que:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 1) 
     if (resultCode == Activity.RESULT_OK) { 
      Uri selectedImage = data.getData(); 
      Log.d("IMAGE SEL", "" + selectedImage); 
      // TODO Do something with the select image URI 
      SharedPreferences customSharedPreference = getSharedPreferences("imagePref", Activity.MODE_PRIVATE); 
      SharedPreferences.Editor editor = customSharedPreference.edit(); 
      Log.d("HO", "" + selectedImage); 
      editor.putString("imagePref", getRealPathFromURI(selectedImage)); 
      Log.d("IMAGE SEL", getRealPathFromURI(selectedImage)); 
      editor.commit(); 
     } 
    } 

Cuando mi código es RAN, Logcat me dice que SelectedImage es nulo. Si comento hacia fuera del

i.putExtra("crop", "true"): 

Logcat no me da la excepción de puntero nulo, y soy capaz de hacer lo que quiera con la imagen. ¿Entonces, cuál es el problema aquí? ¿Alguien tiene alguna idea de cómo puedo solucionar esto? Gracias por tu tiempo.

+0

que tienen la misma pregunta, y esto ayuda a rosca, http://stackoverflow.com/questions/8238460/android-2-1-crop-image-fail – user538565

+0

otro hilo similar: http: //stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop/ – hcpl

Respuesta

45

También he enfrentado este problema. Puede probar con este código. Su trabajo bien para mí

private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg"; 

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
photoPickerIntent.setType("image/*"); 
photoPickerIntent.putExtra("crop", "true"); 
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 
photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 

private Uri getTempUri() { 
    return Uri.fromFile(getTempFile()); 
} 

private File getTempFile() { 

    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 

     File file = new File(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE); 
     try { 
      file.createNewFile(); 
     } catch (IOException e) {} 

     return file; 
    } else { 

     return null; 
    } 
} 

protected void onActivityResult(int requestCode, int resultCode, 
     Intent imageReturnedIntent) { 

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    switch (requestCode) { 
     case REQ_CODE_PICK_IMAGE: 
      if (resultCode == RESULT_OK) { 
       if (imageReturnedIntent!=null) { 

        File tempFile = getTempFile(); 

        String filePath= Environment.getExternalStorageDirectory() 
         +"/"+TEMP_PHOTO_FILE; 
        System.out.println("path "+filePath); 


        Bitmap selectedImage = BitmapFactory.decodeFile(filePath); 
        _image = (ImageView) findViewById(R.id.image); 
        _image.setImageBitmap(selectedImage); 

        if (tempFile.exists()) tempFile.delete(); 
       } 
      } 
    }  
} 
+0

hola jennifer! has probado esto en 4.1. ??? –

+2

Solo recuerde que si desea eliminar archivos probablemente necesite agregar este permiso a su manifiesto: '' – HGPB

+0

@Haraldo. No lo compré en Android 4.1. Voy a verificar y actualizar – jennifer

6

No es necesario un archivo temporal:

protected static final int REQ_CODE_PICK_IMAGE = 1; 



Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, 
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    photoPickerIntent.setType("image/*"); 
    photoPickerIntent.putExtra("crop", "true"); 
    photoPickerIntent.putExtra("return-data", true); 
    photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
    startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 


protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 

     super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

     switch (requestCode) { 
      case REQ_CODE_PICK_IMAGE: 
       if (resultCode == RESULT_OK) { 
        if (imageReturnedIntent!=null) { 
         Bundle extras = imageReturnedIntent.getExtras(); 
         Bitmap selectedBitmap = extras.getParcelable("data"); 
         imageR = (ImageView) findViewById(R.id.image); 
         imageR.setImageBitmap(selectedBitmap); 
        } 
       } 
     }  
} 
+1

¡Me salvaste el día! En 4.3- - funcionó bien. en 4.4+ puede usar la variante habitual: imageStream = getContentResolver(). openInputStream (imageuri); Bitmap bmap = BitmapFactory.decodeStream (imageStream); – kaftanati

+0

Esto no funciona cuando se selecciona la aplicación Google Fotos para elegir la imagen – Gaurav

0

Este código bueno con "principiantes" ^^

private Bitmap FixBitmap; 
Bitmap thePicBitmap; 
String ImagePath = "image_path"; 
String ImagePath_1; 
private static final String TEMP_PHOTO_FILE = "temporary_holder.jpg"; 
private static final int REQ_CODE_PICK_IMAGE = 0; 




@Override 
     public void onClick(View view) { 
      try { 




      //intent = new Intent(); 
      // intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      //intent.setAction(Intent.ACTION_GET_CONTENT); 
      photoPickerIntent.setType("image/*"); 
      photoPickerIntent.putExtra("crop", "true"); 
      photoPickerIntent.putExtra("scale", true); 
      photoPickerIntent.putExtra("aspectX", 1); 
      photoPickerIntent.putExtra("aspectY", 1); 
      // indicate output X and Y 
      photoPickerIntent.putExtra("outputX", 150); 
      photoPickerIntent.putExtra("outputY", 100); 


      photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri()); 
      photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); 
      startActivityForResult(photoPickerIntent, REQ_CODE_PICK_IMAGE); 




      } catch (Exception e) { 
       // Toast.makeText(getApplicationContext(), R.string.imageException, Toast.LENGTH_LONG).show(); 
       Log.e(e.getClass().getName(), e.getMessage(), e); 
       Toast toast = Toast.makeText(Upload_image_text.this, "This device doesn't support the crop action!", 
         Toast.LENGTH_SHORT); 
       toast.show(); 
      } 




     } 

     private Uri getTempUri() { 
      return Uri.fromFile(getTempFile()); 
      } 

     private File getTempFile() { 
      if (isSDCARDMounted()) { 

      File f = new File(Environment.getExternalStorageDirectory(),TEMP_PHOTO_FILE); 
      try { 
      f.createNewFile(); 
      } catch (IOException e) { 

      } 
      return f; 
      } else { 
      return null; 
      } 
      } 

     private boolean isSDCARDMounted(){ 
      String status = Environment.getExternalStorageState(); 
      if (status.equals(Environment.MEDIA_MOUNTED)) 
      return true; 
      return false; 
      } 
    }); 

====== =================

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 


    switch (requestCode) { 
    case REQ_CODE_PICK_IMAGE: 
     if (resultCode == RESULT_OK) { 
      if (imageReturnedIntent!=null){ 



      //  File tempFile = getTempFile(); 

       ImagePath_1 = Environment.getExternalStorageDirectory() 
      + "/temporary_holder.jpg"; 
       System.out.println("path "+ImagePath_1); 


       FixBitmap = BitmapFactory.decodeFile(ImagePath_1); 
       ShowSelectedImage = (ImageView)findViewById(R.id.imageView); 
       ShowSelectedImage.setImageBitmap(FixBitmap); 



      } 
     } 
    } 
} 

========================== =====

@Override 
     protected String doInBackground(Void... params) { 


      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 1; 
      //options.outWidth = 50; 
      //options.outHeight = 50; 
      FixBitmap = BitmapFactory.decodeFile(ImagePath_1, options); 
      //FixBitmap = BitmapFactory.decodeResource(getResources(), R.id.imageView); 

      byteArrayOutputStream = new ByteArrayOutputStream(); 
      FixBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); //compress to 50% of original image quality 
      byteArray = byteArrayOutputStream.toByteArray(); 

      ConvertImage = Base64.encodeToString(byteArray, Base64.DEFAULT); 
Cuestiones relacionadas