在两个应用程序之间传递图像

时间:2018-05-07 11:55:27

标签: android android-intent

我有两个应用程序,即应用程序A和应用程序B.当我按下应用程序A中的按钮时,将调用应用程序B.在应用程序B中,它具有相机活动和一些其他图像处理选项,如裁剪,调整亮度和对比度。在图像处理之后,我需要将图像传递给App A.但是,图像不应该保存在SD卡中。

我尝试了什么:使用image to base64 string

第1步:我使用此代码调用了AppB

Intent i = new 
Intent("com.appb.ImageProcessingActivity");
            startActivityForResult(i, 100);

Step2:在App B中,在图像处理之后,我将图像转换为base64字符串并使用此代码将其发送回App A. (图像处理后,图像尺寸将<150kb)

Intent data = new Intent();
data.putExtra("outputImage", base64ImageString);
setResult(RESULT_OK, data);
finish();

第3步:在应用A中,我将使用此代码获取图像详细信息

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==100 && resultCode==RESULT_OK){

        String outputImage = data.getStringExtra("base64ImageString");
        byte[] decodedString = Base64.decode(outputImage, Base64.DEFAULT);
        Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
        imageView.setImageBitmap(decodedByte);

    }
}

但我无法从App A接收base64字符串形式App B.它显示以下错误(注意:我可以使用此方法发送普通字符串)

JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 1058260)

不接受此答案

在App B中,将图像保存在SD卡中并将图像路径发送到App B,然后将图像路径转换为App A中的base64,然后删除SD卡图像。

4 个答案:

答案 0 :(得分:0)

首先,它们被称为活动而非#34;应用程序&#34;。

其次,你得到了这个错误,因为图像太大而无法在这样的活动之间传递。如果仔细查看logcat,您可能会在某处找到此错误&#34; TransactionTooLargeException &#34;。

要避免它并使您的应用程序更快地工作,您应该将图像保存为外部缓存目录中的文件,并将其路径传递给第二个活动,然后加载它。并且不要担心图像只会暂时保存,因为它位于缓存目录中。

答案 1 :(得分:0)

Bundle extras = new Bundle();
extras.putParcelable("Bitmap", bmp);
intent.putExtras(extras);
startActivity(intent);

发送申请 -

Button sendImage = (Button) findViewById(R.id.button2);
        sendImage.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(
                        Intent.createChooser(intent, "Select Picture"),
                        SELECT_PICTURE);
            }
        });

    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                System.out.println("Image Path : " + selectedImagePath);
                img.setImageURI(selectedImageUri);
                sendImage(selectedImageUri);
            }
        }
    }

    void sendImage(Uri selectedImageUri) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, selectedImageUri);
        shareIntent.setType("image/*");
        startActivity(Intent.createChooser(shareIntent, "Send Image"));
    }

    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

收到申请

private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout linearlyt = new LinearLayout(this);

        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();
        TextView tv = new TextView(this);
        linearlyt .addView(tv);
        linearlyt .setOrientation(LinearLayout.VERTICAL);
        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if ("text/plain".equals(type)) {

                tv.setText(intent.getExtras().getString(Intent.EXTRA_TEXT));
                tv.append("\n" + (intent.getExtras().getString("MyKey")));

            } else if (type.startsWith("image/")) {
                if (bitmap != null) {
                    bitmap.recycle();
                }
                ImageView img = new ImageView(this);
                Bundle bundle = intent.getExtras();
                Uri uri = (Uri) bundle.get(Intent.EXTRA_STREAM);
                img.setImageURI(uri);
                linearlyt .addView(img);
        }

        } else {
            // Handle other intents, such as being started from the home screen
        }
        setContentView(linearlyt);
    }

答案 2 :(得分:0)

从Android 2时代开始,每个应用程序都有足够的RAM来存储一个摄像机图像,而不足以存储两个摄像机图像。我不认为这是可能的,你可能会在清单中尝试android:largeHeap="true",但OTOH我认为它也不会起作用。

嗯,作为最后的手段,您可以创建一个服务(在您的一个应用程序中,可能在一个单独的进程中)并向该服务发送图像字节。但你确定这值得吗?问题是系统可能会决定杀死堆中有摄像头图像的两个应用程序之一。

或者,您可以创建一个ContentProvider并将图像存储在那里。 Google为我提供了Share an image with a content provider in Android app

等网页

还有一个想法,真的很疯狂:将图像分割成可以通过Intent传递的大小的片段并将其传递给多个Intent:)

答案 3 :(得分:0)

试试这段代码:

在活动

中添加此行onActivityResult()
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
String str = data.getStringExtra("image");
filePath = Uri.parse(str);
}

使用getIntent()尝试在onActivityResult()中使用data.getStringExtra()

它可以帮助你