用于选择墙纸突出显示墙纸的意图

问题描述 投票:18回答:6

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

我看过ICS画廊应用的source code,但找不到所需的内容。

“

android android-intent android-gallery
6个回答
8
投票

我想知道是否有可能创建一个 画廊裁剪器显示墙纸突出显示。

假设您希望您的应用在所有Android设备上都能正常运行,答案是否定的。裁剪活动和突出显示的裁剪视图都不是公共API的一部分;两者都在Gallery 3D应用程序内部。换句话说,您可能会花费所有时间在世界各地尝试寻找Intent操作,以使其神奇地为您工作,但事实是某些设备根本不支持它。例如,许多设备(例如HTC Sense和Samsung Galaxy)已定制了具有自己的图库应用程序的Android版本。由于这些Gallery应用程序特定于设计它们的公司,因此这些设备不必具有CropImage类供您启动。

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

我在下面提供了一种变通办法,它可以帮助您将Android代码合并到您的项目中。我目前无法访问运行Honeycomb / ICS的平板电脑,因此我无法更具体地说明如何使其在较新版本的Android上运行,但是我认为它涉及类似的分析以及一些复制和粘贴操作从com.android.gallery3d包中。


在Android 2.x上重用“作物活动”

我在Nexus One上进行了测试,就在弹出柔软的“裁剪矩形”之前,我得到了以下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. 您导航到图库中的图像,然后选择“设置为...”。弹出ActivityChooser,然后选择“墙纸”。
  2. 此选择会触发带有动作Intent和组件ATTACH_DATAcom.cooliris.media.Photographs,这是Android框架中的类,用作相机应用程序的“墙纸选取器”;它只是重定向到标准选择操作。由于我们给com.cooliris.media.Photographs一个URI,该URI指定要设置为墙纸的图像,因此该类将不可避免地执行以下代码(请参见该类的Intent方法):

    onResume
  3. 这将触发另一个Intent intent = new Intent(); intent.setClass(this, CropImage.class); intent.setData(imageToUse); formatIntent(intent); startActivityForResult(intent, CROP_DONE); ,该C0启动Intent活动...在这里,您可以使用软矩形指定裁剪区域。指定作物时,将结果与CropImage设置为CropImageRESULT_OKActivity切换这两个常数的大小写,然后相应地设置墙纸(请参见requestCode = CROP_DONE类的Photographs方法)。

[不幸的是,出于任何原因,Android团队决定从API 4(Android v1.6)开始从SDK中删除这些功能...因此,如果您想触发Photographs来执行这些确切的事件序列,将需要您筛选onActivityResult包,并将相关的类复制并粘贴到您的项目中。根据我过去的经验,执行此操作通常比其应有的麻烦多(除非执行相对简单的操作),但绝对有可能。

这里是关于如何简化流程的Intent ...它需要您将com.cooliris.media复制并粘贴到项目中,而不是整个com.cooliris.media包中。这些类在一起应该足以正确启动nice tutorial活动,但是您将必须根据12 Java classes活动的结果手动设置墙纸。

还请注意,提供的示例代码假设您要在相机拍摄照片后立即进行裁剪。例如,为了从图库中预先选择的图像开始com.cooliris.media活动,您可以致电,

CropImage

然后在CropImage中(如果是CropImageIntent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, ACTIVITY_SELECT_IMAGE); ),使用在onActivityResult的第三个参数中给出的Uri数据启动requestCode == ACTIVITY_SELECT_IMAGE活动(有关如何操作的示例,请参见示例代码启动活动)。

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


2
投票

我有帮助:

resultCode == RESULT_OK

摘自:CropImage


1
投票

我还没有尝试过,但是如果您看看onActivityResult

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

1
投票

只需执行此操作!

here

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


1
投票

[基于ICS的裁剪屏幕(来自Gallery应用程序) 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); ,有一个不错的库。

您可以根据需要对其进行修改,以选择要裁剪的部分。

该代码基于Android的Gallery应用程序(链接Intent i = new Intent(Intent.ACTION_PICK); i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivity(i); ),位于“ / com / android / camera / gallery”下,而最重要的类是“ / com / android / camera /”中的“ CropImage”。即使缺少该库(Google的代码始终可用),它也可用于所有人,例如:

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)));

(即使无法使用,我相信还会有其他)

[这里其他解决方案的优点:

  • 独立
  • 可定制
  • 由于ROM中的更改而无法崩溃。其他解决方案假定存在确切的类和应用。
  • 开源。
  • 一个真正的实现,并且没有启动另一个应用程序的意图。
  • 其他解决方案是极不推荐的,只是因为使用了非官方的意图,如书面here所示。这是由一个非常知名的StackOverflow用户“ here”编写的,他是一个非常受人尊敬的用户,您可以在许多与Android相关的主题中使用它。

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


0
投票

尝试此

git clone https://android.googlesource.com/platform/packages/apps/Gallery3D/
© www.soinside.com 2019 - 2024. All rights reserved.