如何使用 OS Lollipop 在 Java 中为 Android 裁剪图像
Posted
技术标签:
【中文标题】如何使用 OS Lollipop 在 Java 中为 Android 裁剪图像【英文标题】:How to crop image in java for android with OS Lollipop 【发布时间】:2015-03-18 02:09:25 【问题描述】:我有以下用于裁剪图像的代码。它在 android 版本 4 或 OS Kitkat 中运行良好,但在 Android 版本 5 或 OS Lollipop 上无法运行。
我已经找遍了整个世界却找不到答案……
这是我的代码:
在 OS Kitkat 中:此列表变量返回一个值。但是, 在 OS Lollipop 中:此列表变量返回一个空数组列表。
final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
List<ResolveInfo> list = getPackageManager().queryIntentActivities( intent, 0 );
PackageManager test = getPackageManager();
int size = list.size();
if (size == 0)
Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();
return;
else
intent.setData(mCapturedImageURI);
intent.putExtra("outputX", 110);
intent.putExtra("outputY", 110);
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
if (size == 1)
Intent i = new Intent(intent);
ResolveInfo res = list.get(0);
i.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
startActivityForResult(i, CROP_FROM_CAMERA);
else
for (ResolveInfo res : list)
final CropOption co = new CropOption();
co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo);
co.icon = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo);
co.appIntent= new Intent(intent);
co.appIntent.setComponent( new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
cropOptions.add(co);
CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Choose Crop App");
builder.setAdapter( adapter, new DialogInterface.OnClickListener()
public void onClick( DialogInterface dialog, int item )
startActivityForResult( cropOptions.get(item).appIntent, CROP_FROM_CAMERA);
);
builder.setOnCancelListener( new DialogInterface.OnCancelListener()
@Override
public void onCancel( DialogInterface dialog )
if (mCapturedImageURI != null )
getContentResolver().delete(mCapturedImageURI, null, null );
mCapturedImageURI = null;
);
AlertDialog alert = builder.create();
alert.show();
【问题讨论】:
请忽略PackageManager test = getPackageManager();这不包括在内..抱歉,我在发布时忘记删除它.. 您能否更详细地解释一下问题所在?你遇到了什么错误? 它不会在 logcat 中返回任何错误...它只是在列表变量 (List我已经授予了 android.permission.MANAGE_DOCUMENTS 权限。但面临同样的问题。经过大量搜索,我找到了解决方案。
暂时这里有一个解决方法:
Intent mIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(mIntent, CHOOSE_IMAGE);
这会强制打开旧的图片库而不是新的 Kitkat 文档视图。
现在,您可以通过在 onActivityResult 中调用以下命令来获取 Uri:
Uri selectedImageURI = data.getData();
希望这有助于解决您的问题。
【讨论】:
以上是关于如何使用 OS Lollipop 在 Java 中为 Android 裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章
应用程序如何检测状态栏颜色(Android 5.0 Lollipop)?
如何在带有 Android 5.0 Lollipop 的代码(不是 xml)中以编程方式使用 RippleDrawable?
即使在 Lollipop 之前,如何获取当前设备的用户列表?
如何使用为 Android 5.0 (Lollipop) 提供的新 SD 卡访问 API?
如何以编程方式在 Lollipop Android 中打开 FlashLight
java.io.IOException: 读取失败,套接字可能关闭或超时,在 Android 5.0.1 Lollipop 版本上读取 ret: -1