用于select与壁纸区域突出显示壁纸

我想知道是否有可能创build一个意图,使画廊裁剪显示壁纸突出显示。 Honeycomb中引入了此function。 要了解我所寻找的内容,请查看图像上的平板电脑(三个蓝色矩形)。

我看了一下ICS图库应用程序的源代码 ,但是找不到我要找的东西。

这个

Solutions Collecting From Web of "用于select与壁纸区域突出显示壁纸"

我想知道是否有可能创build一个意图,使画廊裁剪显示壁纸突出显示。

假设您希望您的应用在所有Android设备上正常运行,答案是否定的。 种植活动和突出的作物观点都不是公共API的一部分; 两者都是Gallery 3D应用程序的内部。 换句话说,你可以花时间在世界上试图find一个Intent行动,让这个神奇的为你工作,但事实是,有些设备根本不会支持它。 例如,许多设备(如HTC Sense和三星Galaxy)已经定制了Android版本,并拥有自己的图库应用程序。 由于这些图库应用程序是专门为devise它们的公司devise的,因此这些设备不一定会有一个CropImage类供您启动。

也就是说,为了保证您的应用程序可以在所有设备上运行,您必须将裁剪代码直接合并到您的项目中。 如果由于某种原因,你find一种方法来启动一个Intent作物的活动,你应该testing,看是否存在com.android.gallery3d包至less,并以某种方式处理它。

我已经在下面提供了一个解决方法,可以帮助您将Android代码合并到您的项目中。 我目前不能访问运行Honeycomb / ICS的平板电脑,所以我不能更具体地讨论如何让它在更新版本的Android上工作,但我想它涉及类似的分析和一些复制和粘贴来自com.android.gallery3d包。


重新使用Android 2.x上的“裁剪活动”

我在我的Nexus One上testing了这个,在刚刚popup的“crop-rectangle”软件之前,我得到了下面的logcat输出:

 I/ActivityManager( 94): Starting: Intent { act=android.intent.action.CHOOSER cmp=android/com.android.internal.app.ChooserActivity (has extras) } from pid 558 I/ActivityManager( 94): Starting: Intent { act=android.intent.action.ATTACH_DATA dat=content://media/external/images/media/648 typ=image/jpeg flg=0x3000001 cmp=com.google.android.gallery3d/com.cooliris.media.Photographs (has extras) } from pid 558 I/ActivityManager( 94): Starting: Intent { dat=content://media/external/images/media/648 cmp=com.google.android.gallery3d/com.cooliris.media.CropImage (has extras) } from pid 558 

因此,从我所知道的情况来看,执行此操作时发生的事件顺序如下所示:

  1. 您导航到图库中的图像,然后select“设置为…”。 一个ActivityChooserpopup,你select“壁纸”。
  2. 这个select用动作ATTACH_DATA和组件com.cooliris.media.Photographs激发一个Intent ,这是Android框架中的一个类,用作相机应用程序的“壁纸select器”; 它只是redirect到标准的select动作。 既然我们给了Intent一个指定要设置为墙纸的图像的URI,这个类将不可避免地执行下面的代码(参见类的onResume方法):

     Intent intent = new Intent(); intent.setClass(this, CropImage.class); intent.setData(imageToUse); formatIntent(intent); startActivityForResult(intent, CROP_DONE); 
  3. 这会触发另一个启动CropImage Activity的Intent …这是使用软矩形指定裁剪区域的地方。 当您指定裁剪时,结果被设置为RESULT_OKrequestCode = CROP_DONEPhotographs活动切换 – 对这两个常量进行切换,然后相应设置壁纸(请参阅Photographs类的onActivityResult方法)。

不幸的是,无论出于何种原因,Android团队决定从API 4(Android v1.6)开始,从SDK中删除这些function…所以如果你想发射一个Intent来执行这些确切的事件序列,它会要求你筛选com.cooliris.media包,并将相关类复制并粘贴到您的项目中。 在我以前的经验中,这样做往往比它的价值更麻烦(除非是执行一个相对简单的行动),但这绝对是可能的。

这里有一个很好的教程 ,介绍如何简化这个过程…它需要你复制和粘贴12个Java类到你的项目中,而不是整个com.cooliris.media包。 这些类一起应该足以正确CropImage活动,但是您将不得不手动设置CropImage活动的结果。

另请注意,提供的示例代码假定您想在照相机拍摄照片后立即裁剪。 例如,为了从画廊中预先select的图像启动CropImage Activity,

 Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

然后在onActivityResult中(如果requestCode == ACTIVITY_SELECT_IMAGEresultCode == RESULT_OK ),请使用onActivityResult的第三个参数(请参阅示例代码中有关如何启动Activity的示例代码)中提供的Uri数据启动CropImage Activity。

如果有的话,希望这将有助于指引你正确的方向。 让我知道它是怎么回事,如果你想要澄清什么,请留下评论。

我会帮助:

 public class CropSelectedImageActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, 1); } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { final Bundle extras = data.getExtras(); Uri photoUri = data.getData(); if (photoUri != null) { Intent intent = new Intent("com.android.camera.action.CROP"); //intent.setClassName("com.android.camera", "com.android.camera.CropImage"); intent.setData(photoUri); intent.putExtra("outputX", 96); intent.putExtra("outputY", 96); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, 1); } } } } 

取自: ImageCropper

我没有尝试过,但如果你看看这里

  Bundle newExtras = new Bundle(); // maybe that here - for more options see your source code link newExtras.putString("circleCrop", "true"); Intent cropIntent = new Intent(); // Uri would be something from MediaStore.Images.Media.EXTERNAL_CONTENT_URI cropIntent.setData(img.fullSizeImageUri()); // edit: it's inside com.android.gallery in case that is even installed. // should work if you replace that with setClassName("com.android.gallery", "com.android.camera.CropImage") cropIntent.setClass(this, CropImage.class); cropIntent.putExtras(newExtras); startActivityForResult(cropIntent, CROP_MSG); 

那么这可能适合你。

通过意图也许这样的方式:

 Intent i = new Intent(Intent.ACTION_PICK); i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivity(i); 

有一个很好的库,基于ICS的裁剪屏幕(从图库应用程序), 在这里

您可以根据需要进行修改,select要裁剪的部分。

该代码基于Android的Gallery应用(链接在这里 ),在“/ com / android / camera / gallery”下,而最重要的类是“/ com / android / camera /”中的“CropImage”。 即使图书馆将会丢失(Google的代码始终可用),也可以使用它,因此:

 git clone https://android.googlesource.com/platform/packages/apps/Gallery3D/ 

(即使这不可用,我相信会有其他人)

这里比其他解决scheme的优势:

  • 独立
  • 定制
  • 不能因ROM中的变化而崩溃。 其他解决scheme假定存在确切的类和应用程序。
  • 开源。
  • 一个真正的实现,而不是开始另一个应用程序的意图。
  • 其他解决scheme是非常不推荐的,只是因为使用了非官方的意图,正如这里所写的。 这是由一个非常有名的StackOverflow用户,称为“ CommonsWare ”,谁是非常值得尊敬的用户,你可以依靠很多Android相关的主题。

同样,最值得推荐的裁剪图像仍然是第三方库。 不使用意图解决方法。

就这样做!

 Intent intent = new Intent(Intent.ACTION_ATTACH_DATA).setDataAndType(contentUri, "image/jpeg") .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .putExtra("mimeType", "image/jpeg"); startActivity(Intent.createChooser(intent, getString(R.string.set_as))); 

其中“image / jpeg”是图片的mimeType,contentUri是图片的uri