Почему я получаю TransactionTooLargeException? - PullRequest
0 голосов
/ 21 марта 2020

Я работаю над проектом Android, но застрял, когда мне нужно сделать снимок из галереи. Действительно, когда я делаю первый снимок, все идет хорошо. Но, если я сделаю второй снимок, возникнет исключение «TransactionTooLargeException», и мое приложение будет аварийно завершено.

Код, использованный для запуска действия:

public void addImage(View view) {
        if(isPermissionEnable) {
            try {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, ""), ADD_IMAGE);
            } catch (Exception ex) {
                GraphicUtils.displayPopup(this, getString(R.string.warning), 
                getString(R.string.image_too_large));
            }
        }else
        {
            askPermissions();
        }

    }

Код для получения результата :

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

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case ADD_IMAGE:
                    if(getContentResolver().getType(data.getData()).contains("jpeg") || getContentResolver().getType(data.getData()).contains("jpg") || getContentResolver().getType(data.getData()).contains("png") || getContentResolver().getType(data.getData()).contains("bmp")) {

                        Uri uri = data.getData();

                        try {
                            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                            int minimumSize = (bitmap.getWidth() < bitmap.getHeight()) ? bitmap.getWidth() : bitmap.getHeight();
                            finalBitmap = ThumbnailUtils.extractThumbnail(bitmap, minimumSize, minimumSize);
                            imageView.setImageBitmap(finalBitmap);
                            button_right.setVisibility(View.VISIBLE);
                            button_left.setVisibility(View.VISIBLE);

                        } catch (Exception e) {
                            e.printStackTrace();
                            AlertDialog.Builder builder = new AlertDialog.Builder(this);
                            builder.setMessage(uri.toString());
                            builder.setTitle("Erreur");
                            AlertDialog dialog = builder.create();
                            dialog.show();
                        }
                    }
                    else{
                        AlertDialog.Builder builder = new AlertDialog.Builder(this);
                        builder.setMessage(getContentResolver().getType(data.getData()));
                        builder.setTitle("Erreur");
                        AlertDialog dialog = builder.create();
                        dialog.show();
                    }
                    break;
                default :
                    break;
            }
        }
    }

У вас есть идеи, чтобы решить мою проблему, пожалуйста?

1 Ответ

0 голосов
/ 21 марта 2020

Из документации :

Ключом к исключению TransactionTooLargeException является сохранение относительно небольших транзакций. Постарайтесь минимизировать объем памяти, необходимый для создания Parcel для аргументов и возвращаемого значения удаленного вызова процедуры. Избегайте передачи огромных массивов строк или больших растровых изображений. Если возможно, попробуйте разбить большие запросы на более мелкие части.

Я предполагаю, что вы выполняете несколько транзакций или, возможно, достаточно большую.

Попробуйте проанализировать и оценить в своем приложении, где вы можете ограничить и ограничить объем запрашиваемых данных.

Кроме того, посмотрите на этот ТА вопрос для получения дополнительной информации.

...