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

时间:2012-01-11 20:48:44

标签: android android-intent android-gallery

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

我看了一下ICS图库应用的source code,但我找不到我要找的东西。

this

6 个答案:

答案 0 :(得分: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

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

  1. 导航到图库中的图像,然后选择“设为...”。弹出ActivityChooser,然后选择“壁纸”。
  2. 此选择会触发Intent行为ATTACH_DATA和组件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);
    
  3. 这会触发另一个启动CropImage活动的Intent ...这是您使用软矩形指定裁剪区域的位置。指定裁剪时,结果将设置为RESULT_OK requestCode = CROP_DONEPhotographs活动切换这两个常量的情况,然后相应地设置壁纸(请参阅Photographs类的onActivityResult方法)。

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

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

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

    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的示例,请参阅示例代码)。

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

答案 1 :(得分:2)

我会帮助你:

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

答案 2 :(得分:1)

我没试过这个,但如果你看一下here

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

答案 3 :(得分:1)

有一个很好的库,它基于ICS的裁剪屏幕(来自图库应用程序),here

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

代码基于Android的Gallery应用程序(链接here),位于“/ com / android / camera / gallery”下,而最重要的类是“/ com / android / camera /”中的“CropImage” “。即使图书馆遗失(谷歌的代码始终可用),它也可供所有人使用,如下:

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

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

优于其他解决方案:

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

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

答案 4 :(得分:0)

做这个!

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

答案 5 :(得分:0)

尝试

    // Set Home wallpaper the image
public void setHomeWallpaper () {
                BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.getDrawable());
                Bitmap bitmap = bitmapDrawable.getBitmap();
                String bitmapPath = Images.Media.insertImage(getContentResolver(), bitmap, "", null);
                Uri bitmapUri = Uri.parse(bitmapPath);
                Intent intent = new Intent(Intent.ACTION_ATTACH_DATA).setDataAndType(bitmapUri,  "image/jpeg")
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                        .putExtra("mimeType", "image/jpeg");
                startActivity(Intent.createChooser(intent, getString(R.string.background)));
                Toast.makeText(PicassoDisplayImageAdapter.this, "قم بإختيار التطبيق المناسب لتعيين الصورة", Toast.LENGTH_SHORT).show();
}