用于选择壁纸区域突出显示的意图

Tho*_*mas 18 android android-intent android-gallery

我想知道是否可以创建一个Intent,使画廊裁剪器显示壁纸突出显示.Honeycomb已经引入了这个功能.要了解我正在寻找的东西,请查看图像上的平板电脑(三个蓝色矩形).

我看了一下ICS gallery应用程序的源代码,但我找不到我想要的东西.

这个

Ale*_*ood 8

我想知道是否可以创建一个Intent,使画廊裁剪器显示壁纸突出显示.

假设您希望您的应用在所有Android设备上正常运行,答案是否定的.裁剪活动和突出显示的作物视图都不是公共API的一部分; 两者都是Gallery 3D应用程序的内部.换句话说,你可以花费在世界上的所有时间试图找到一个Intent动作来让你神奇地为你工作,但事实是有些设备根本不支持它.例如,许多设备,如HTC Sense和三星Galaxy,都有定制的Android版本,有自己的图库应用程序.由于这些图库应用程序特定于设计它们的公司,因此这些设备不一定CropImage适合您启动.

话虽这么说,为了保证您的应用程序适用于所有设备,您必须将裁剪代码直接合并到您的项目中.如果由于某种原因你找到了一种使用Intent启动裁剪活动的方法,你应该测试是否com.android.gallery3d至少存在该包,并以某种方式处理它.

我在下面附带了一个可以帮助您将Android代码合并到项目中的变通方法.我目前无法访问运行Honeycomb/ICS的平板电脑,因此我不能更具体地了解如何在新版本的Android上运行它,但我想它涉及类似的分析和一些复制和粘贴从com.android.gallery3d包中.


重用Android 2.x上的"裁剪活动"

我在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
Run Code Online (Sandbox Code Playgroud)

因此,根据我的判断,执行此操作时发生的事件序列如下:

  1. 您导航到库中的图像并选择"设置为...".一个ActivityChooser弹出并选择"墙纸".
  2. 此选择会触发Intentwith action ATTACH_DATA和component com.cooliris.media.Photographs,这是Android框架中的一个类,用作相机应用程序的"壁纸选择器"; 它只是重定向到标准选择动作.由于我们给出了Intent一个指定要设置为壁纸的图像的URI,因此该类将不可避免地执行以下代码(请参阅类的onResume方法):

    Intent intent = new Intent();   
    intent.setClass(this, CropImage.class);
    intent.setData(imageToUse);
    formatIntent(intent);
    startActivityForResult(intent, CROP_DONE);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这会触发另一个Intent启动CropImageActivity ...这是您使用软矩形指定裁剪区域的位置.当您指定的作物,结果被设置为RESULT_OK使用requestCode = CROP_DONE.的Photographs活动切换的情况下在这些两个常数,然后相应地设置壁纸(见Photographs类的onActivityResult方法).

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

这是一个很好的教程,介绍如何简化流程......它要求您将12个Java类复制并粘贴到项目中,而不是整个com.cooliris.media包.这些类应足以正确启动CropImageActivity,但您必须在CropImageActivity的结果上手动设置壁纸.

另请注意,提供的示例代码假定您希望在相机拍摄照片后立即裁剪.例如,为了CropImage使用图库中预先选择的图像启动活动,您可以打电话,

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE);
Run Code Online (Sandbox Code Playgroud)

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

如果有的话,希望这有助于指明你正确的方向.如果你想让我澄清任何事情,让我知道它是怎么回事并发表评论.

  • 亚历克斯,"漂亮教程"的链接不再有效.你能更新一下吗?谢谢. (2认同)