首页 > 解决方案 > 在共享首选项中选择、裁剪和保存图像

问题描述

此代码允许用户在他的画廊中选择一个图像并将其裁剪以将其放入图像视图中。但是每次我离开应用程序并再次打开它时,图像不再存在,所以我想将 uri 保存为用户在共享首选项中裁剪的图像,以便它是持久的。

请喜欢实施 cele!

选择图片:

permissionsCheck();
    Intent intent = new Intent();

    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);

    startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_FILE);

裁剪图像:

private void doCrop() {
    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 );

    int size = list.size();
    if (size == 0) {
        Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();

        return;
    } else {
        intent.setData(mImageCaptureUri);

        intent.putExtra("outputX", 100);
        intent.putExtra("outputY", 100);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", false);
        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 (mImageCaptureUri != null ) {
                        getContentResolver().delete(mImageCaptureUri, null, null );
                        mImageCaptureUri = null;
                    }
                }
            } );

            AlertDialog alert = builder.create();

            alert.show();
        }
    }
}

活动结果:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK) return;

    switch (requestCode) {
        case PICK_IMAGE:
            mImageCaptureUri = data.getData();
            doCrop();
            break;
        case CROP_FROM_CAMERA:
            Bundle extras = data.getExtras();
            if (extras != null) {
                Bitmap photo = extras.getParcelable("data");
                imageView.setImageBitmap(photo);
                String root = Environment.getExternalStorageDirectory().toString();
                File myDir = new File(root + "/saved_images");
                myDir.mkdirs();
                Random generator = new Random();
                int n = 100000;
                n = generator.nextInt(n);
                String fname = "Image-"+ n +".jpg";
                File file = new File (myDir, fname);
                if (file.exists ()) file.delete ();
                try {
                    FileOutputStream out = new FileOutputStream(file);
                    photo.compress(Bitmap.CompressFormat.JPEG, 90, out);
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString("image", String.valueOf(mImageCaptureUri));
                editor.commit();

                imageView.setImageURI(mImageCaptureUri);
                imageView.invalidate();
            }
            File f = new File(mImageCaptureUri.getPath());
            if (f.exists()) f.delete();
            break;

    }
}

标签: androidsharedpreferences

解决方案


请不要将图像保存到 中Preferences,这不是大数据块的存储,请将裁剪后的图像作为 .jpg 或 .png 图像保存到您的数据文件夹中,并将该裁剪后的图像文件的 URI 或路径存储您的喜好。

然后,您将能够检查路径是否存储在首选项中,并在应用程序启动时加载裁剪的图像。


好的,我再次检查了您的源代码。在onActivityResult()你有一个变量mImageCaptureUri- 将此变量保存到Preferences. 当您重新启动应用程序时,使用该变量访问图像并以与裁剪原始图像相同的方式再次裁剪它。


推荐阅读