выберите, обрежьте и сохраните изображение в общих настройках - PullRequest
0 голосов
/ 30 июня 2018

этот код позволяет пользователю выбрать изображение в своей галерее и обрезать его, чтобы поместить его в просмотр изображений. но каждый раз, когда я покидаю приложение и открываю его снова, изображение больше не существует, поэтому я хотел бы сохранить 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;

    }
}

1 Ответ

0 голосов
/ 30 июня 2018

Пожалуйста, не сохраняйте изображение в Preferences, это не хранилище для больших блоков данных, вместо этого сохраните изображение обрезанное в папку данных в виде изображения .jpg или .png и сохраните URI или путь к этому файлу обрезанного изображения в ваших предпочтениях.

Тогда вы сможете проверить, сохранен ли путь в настройках, и загрузить обрезанное изображение при запуске приложения.


хорошо, я еще раз проверил ваш исходный код. В onActivityResult() у вас есть переменная mImageCaptureUri - сохраните эту переменную в Preferences. При перезапуске приложения используйте эту переменную для доступа к изображению и снова обрежьте его так же, как обрезали исходное изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...