Question

I just crop the image to get part of it. But Android set the returned image as the wallpaper. Why? I track the android code, and in Gallery3D application(com.cooliris), I found this:

    // TODO: A temporary file is NOT necessary
    // The CropImage intent should be able to set the wallpaper directly
    // without writing to a file, which we then need to read here to write
    // it again as the final wallpaper, this is silly
    mTempFile = getFileStreamPath("temp-wallpaper");
    mTempFile.getParentFile().mkdirs();

    int width = getWallpaperDesiredMinimumWidth();
    int height = getWallpaperDesiredMinimumHeight();
    intent.putExtra("outputX", width);
    intent.putExtra("outputY", height);
    intent.putExtra("aspectX", width);
    intent.putExtra("aspectY", height);
    intent.putExtra("scale", true);
    intent.putExtra("noFaceDetection", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile));
    intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.name());
    // TODO: we should have an extra called "setWallpaper" to ask CropImage
    // to set the cropped image as a wallpaper directly. This means the
    // SetWallpaperThread should be moved out of this class to CropImage

Please focus on the last lines, The TODO. It tells that the crop intent will do the setting job. Well, I don't need it at all. So, HOW TO CROP AN IMAGE WITHOUT SETTING THE WALLPAPER? Thanks!

Was it helpful?

Solution

Do this in your code (keeping in mind it won't work on all phones, like HTC because they use their own gallery/camera.

File f = new File(Environment.getExternalStorageDirectory(), "/temporary_holder.png");
f.createNewFile();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.gallery", "com.android.camera.CropImage");
intent.setType("image/*"); 
intent.setData(ImageToSetUri);   // Local URI of your image
intent.putExtra("crop", true);
intent.putExtra("outputX", width); // width/height of your image
intent.putExtra("outputY", height);
intent.putExtra("aspectX", width);
intent.putExtra("aspectY", height);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.name());
startActivityForResult(intent, 1);

then do this to retrieve the image as a bitmap, or however you want

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK)
          if (data != null) {
              Bitmap selectedImage = BitmapFactory.decodeFile(f);       
          }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top