因此,我想使用覆盖onActivityResult从图库加载图像。将意图数据发送到另一个活动的有效方法是什么?

当前使用此代码获取图像路径,然后再将其发送到其他活动:

protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) {

        Uri selected_image = data.getData();
        if (selected_image.toString().substring(0, 21).equals("content://com.android")) {
            String[] photo_split = selected_image.toString().split("%3A");
            String imageUriBasePath = "content://media/external/images/media/" + photo_split[1];
            selected_image = Uri.parse(imageUriBasePath);

        }
        String[] file_path_column = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(selected_image, file_path_column, null, null, null);
        cursor.moveToFirst();
        int column_index = cursor.getColumnIndex(file_path_column[0]);
        image_path = cursor.getString(column_index);
        cursor.close();

        Intent intent = new Intent(MainActivity.this, ImageActivity.class);
        intent.putExtra("imagePath", image_path);
        startActivity(intent);

    }
}


问题在于此代码似乎无法很好地工作,因为从图库应用程序中选择图像后,图库会滞后几秒钟,然后再将图像加载到其他活动中。

最佳答案

试试看,以下是从相机和图库中获取图像的方法:

    ImageView photo;
    Bitmap bmp;
    static int GET_PICTURE = 1, CAMERA_PIC_REQUEST = 2;
    static String selectedImagePath = "";
 @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // TODO Auto-generated method stub
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK) {
                if (requestCode == CAMERA_PIC_REQUEST) {
                    // deleteDialog.dismiss();
                    bmp = (Bitmap) data.getExtras().get("data");
                } else if (requestCode == GET_PICTURE) {

                    if (bmp != null) {
                        bmp.recycle();

                    }
                    // deleteDialog.dismiss();
                    Uri selectedImageUri = data.getData();
                    selectedImagePath = getRealPathFromURI(selectedImageUri);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inJustDecodeBounds = true;
                    BitmapFactory.decodeFile(selectedImagePath, options);
                        options.inSampleSize = calculateInSampleSize(options, 200,
                                200);
                    options.inJustDecodeBounds = false;
                    bmp = BitmapFactory.decodeFile(selectedImagePath, options);
                }
                if (bmp != null) {
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);

                        Bitmap outputs = getRoundedBitmap(bmp,10);
                        last = Bitmap.createScaledBitmap(outputs, 200, 200, false);
                    if (last != null) {
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        last.compress(Bitmap.CompressFormat.PNG, 100, baos);
                        byte[] b = baos.toByteArray();
                        String temp = Base64.encodeToString(b, Base64.DEFAULT);

                         photo.setImageBitmap(last);
                        // userimage.setBackgroundResource(android.R.color.transparent);
                    }

                } else {
                    Toast.makeText(getBaseContext(), "Invalid image",
                            Toast.LENGTH_SHORT).show();
                }
            }
        }

    public static Bitmap getRoundedBitmap(Bitmap bitmap,int pixels) {
        final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(output);
        final int color = Color.RED;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        //canvas.drawOval(rectF, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        bitmap.recycle();
        return output;
    }
    private String getRealPathFromURI(Uri contentURI) {
        String result;
        Cursor cursor = getContentResolver().query(contentURI, null, null,
                null, null);
        if (cursor == null) {
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor
                    .getColumnIndex(MediaStore.Images.ImageColumns.DATA);

            result = cursor.getString(idx);

        }
        cursor.close();
        return result;
    }
    public static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and
            // keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }

关于java - 将onActivityResult上的数据发送到另一个 Activity 的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31656169/

10-13 04:39