2010-01-18 11 views
27

Hey, je travaille actuellement sur un fond d'écran en direct et je permets à l'utilisateur de sélectionner une image qui ira derrière mes effets.Comment sélectionner et rogner une image dans Android?

Actuellement, j'ai:

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

et un peu moins 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(); 
     } 
    } 

Quand mon code est RAN, Logcat me dit que SelectedImage est nulle. Si je commente le

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

Logcat ne me donne pas l'exception de pointeur NULL, et je suis capable de faire ce que je veux avec l'image. Alors, quel est le problème ici? Est-ce que quelqu'un a une idée de comment je peux résoudre ce problème? Merci pour votre temps.

+0

J'ai la même question, et ce fil aide, http://stackoverflow.com/questions/8238460/android-2-1-crop-image-fail – user538565

+0

un autre thread similaire: http: //stackoverflow.com/questions/12758425/how-to-set-the-output-image-use-com-android-camera-action-crop/ – hcpl

Répondre

45

J'ai également fait face à ce problème. Vous pouvez essayer avec ce code. Son travail bien pour moi

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

bonjour jennifer! avez-vous testé cela en 4.1. ??? –

+2

Rappelez-vous simplement que si vous voulez supprimer des fichiers, vous devrez probablement ajouter cette autorisation à votre manifeste: '' – HGPB

+0

@Haraldo. Je n'ai pas vérifié dans Android 4.1. Je vais vérifier et mettre à jour – jennifer

6

Vous n'avez pas besoin d'un fichier Temp:

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

Vous avez sauvé ma journée! Sur 4.3- - a bien fonctionné. sur 4.4+ peut utiliser la variante habituelle: imageStream = getContentResolver(). openInputStream (imageuri); Bitmap bmap = BitmapFactory.decodeStream (imageStream); – kaftanati

+0

Cela ne fonctionne pas lorsque sélectionné Google Photos App pour choisir l'image – Gaurav

0

Ce code bien avec "débutants" ^^

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); 
Questions connexes