我想知道是否可以创建一个使画廊裁剪器显示墙纸突出显示的Intent。此功能已在Honeycomb中引入。要了解我要查找的内容,请查看图像上的平板电脑(三个蓝色矩形)。
我查看了ICS画廊应用程序的source code,但找不到所需的内容。
最佳答案
I would like to know if it's possible to create an Intent that makes the gallery cropper show wallpaper highlighting.
假设您希望自己的应用在所有Android设备上都能正常运行,那么答案是否定的。裁剪 Activity 和突出显示的裁剪 View 都不是公共(public)API的一部分;两者都在Gallery 3D应用程序内部。换句话说,您可能会花费所有时间在世界各地尝试找到
Intent
操作,以使其神奇地为您工作,但事实是某些设备根本不支持它。例如,许多设备(例如HTC Sense和Samsung Galaxy)已定制了具有自己的图库应用程序的Android版本。由于这些Gallery应用程序特定于设计它们的公司,因此这些设备不一定具有CropImage
类供您启动。话虽如此,为了确保您的应用程序可在所有设备上正常工作,您必须将裁剪代码直接合并到项目中。并且,如果由于某种原因找到了一种使用Intent启动裁剪 Activity 的方法,则应进行测试以查看
com.android.gallery3d
包是否至少存在,并以某种方式进行处理。我在下面提供了一种变通办法,它可以帮助您将Android代码合并到您的项目中。我目前无法访问运行Honeycomb/ICS的平板电脑,因此我无法更具体地说明如何使其在较新版本的Android上运行,但是我想它涉及类似的分析以及一些复制和粘贴工作来自
com.android.gallery3d
包。在Android 2.x上重用“作物 Activity ”
我在Nexus One上进行了测试,就在弹出“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
因此,据我所知,执行此操作时发生的事件顺序如下:
ActivityChooser
,然后选择“墙纸”。 Intent
和组件 ATTACH_DATA
的com.cooliris.media.Photographs
,这是Android框架中的类,用作相机应用程序的“墙纸选择器”;它只是重定向到标准的选择操作。由于我们为Intent
提供了一个URI,该URI指定了要设置为墙纸的图像,因此该类将不可避免地执行以下代码(请参见该类的onResume
方法):Intent intent = new Intent();
intent.setClass(this, CropImage.class);
intent.setData(imageToUse);
formatIntent(intent);
startActivityForResult(intent, CROP_DONE);
Intent
来启动 CropImage
Activity ...在这里,您可以使用软矩形指定裁剪区域。指定作物时,结果将设置为RESULT_OK
和requestCode = CROP_DONE
。 Photographs
Activity 切换这两个常量的大小写,然后相应地设置墙纸(请参见Photographs
类的onActivityResult
方法)。 不幸的是,无论出于何种原因,Android团队决定从API 4(Android v1.6)开始从SDK中删除这些功能...因此,如果您要触发
Intent
来执行这些确切的事件序列,则需要您筛选 com.cooliris.media
包,然后将相关的类复制并粘贴到您的项目中。根据我过去的经验,执行此操作通常比其应有的麻烦多(除非执行相对简单的操作),但绝对有可能。这是有关如何简化流程的nice tutorial ...它需要您将12 Java classes复制并粘贴到您的项目中,而不是整个
com.cooliris.media
包中。这些类在一起应该足以正确启动CropImage
Activity ,但是您必须根据CropImage
Activity 的结果手动设置墙纸。另请注意,提供的示例代码假设您要在相机拍摄照片后立即进行裁剪。例如,为了从图库中预先选择的图片开始
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_IMAGE
和resultCode == RESULT_OK
)中,使用CropImage
的第三个参数中给出的Uri数据启动onActivityResult
Activity (请参阅示例代码,以获取有关如何启动Activity的示例)。如果有的话,希望这会帮助您指出正确的方向。让我知道进展情况,如果您想让我澄清任何事情,请发表评论。
关于android - 选择墙纸并突出显示墙纸区域的 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826384/