android - 选择墙纸并突出显示墙纸区域的 Intent

标签 android android-intent android-gallery

我想知道是否可以创建一个使画廊裁剪器显示墙纸突出显示的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,然后选择“墙纸”。
  • 此选择将触发带有 Action 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_OKrequestCode = CROP_DONEPhotographs 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_IMAGEresultCode == RESULT_OK)中,使用CropImage的第三个参数中给出的Uri数据启动onActivityResult Activity (请参阅示例代码,以获取有关如何启动Activity的示例)。

    如果有的话,希望这会帮助您指出正确的方向。让我知道进展情况,如果您想让我澄清任何事情,请发表评论。

    关于android - 选择墙纸并突出显示墙纸区域的 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826384/

    相关文章:

    android - 当应用程序在后台运行时,Android 能否在不终止整个进程的情况下终止 Activity ?

    android - 为什么 Tab 主机在 android 中不显示图标?

    android - ActivityResultLauncher 传递自定义请求代码

    android - 启动日历 Intent 后,如何使用应用程序 "go ahead"?安卓

    android - 从图库中挑选或从相机捕获的高质量图像

    java - Android webview 中的 HTML5 音频静音

    android - 为什么 AOSP 添加新的 API 来支持库而不将它们添加到 SDK?

    android - Android图像的Intent.ACTION_VIEW

    java - 选择一张图片而不是多张时出现android错误