使用intent避免FAILED BINDER TRANSACTION错误

时间:2015-05-06 16:24:13

标签: java android android-intent bitmap uri

在我的相机应用程序中,我需要将位图和Uri从一个活动转移到另一个活动。由于某些原因,我在大多数手机上都收到了FAILED BINDER TRANSACTION错误(我在新手机上收到了错误,但没有在Nexus4和Galaxy3上收到错误)。即使我只尝试通过意图传输Bitmap(我也尝试仅转移Uri并得到错误),我也得到了同样的错误。从我在线阅读的内容来看,错误来自内存问题,但我不知道如何修复它。我会感激任何帮助。

我的第一个活动:

...

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            tv.setVisibility(View.INVISIBLE);
            btn.setVisibility(View.INVISIBLE);
            selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);

            img.setImageURI(selectedImageUri);
            ok.setVisibility(View.VISIBLE);
        }
    }
}

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);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v.getId()==btn.getId())
    {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
    }
    if(v.getId()==ok.getId())
    {
        String stringUri;
        stringUri = selectedImageUri.toString();
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent .setClass(MainActivity.this,  SecondMain.class);
        intent .putExtra("KEY", stringUri);
        startActivity(intent );
    }

}

}

第二项活动:

public static Camera isCameraAvailiable(){
    Camera object = null;
    try {
        object = Camera.open();// attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return object; // returns null if camera is unavailable
}

private Camera.PictureCallback capturedIt = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
        if(bitmap==null){
            Toast.makeText(getApplicationContext(), "not taken", Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(getApplicationContext(), "taken", Toast.LENGTH_SHORT).show();
        }

        cameraObject.release();


    }

};

 ...

    String stringUri = null;
    Bundle extras = getIntent().getExtras();
    if (extras != null && extras.containsKey("KEY")) {
        stringUri= extras.getString("KEY");
    }

    selectedImageUri = Uri.parse(extras.getString("KEY"));

    float alpha=(float)1/2;
    img.setAlpha(alpha);
    img.setImageURI(selectedImageUri);
    cameraObject = isCameraAvailiable();
    showCamera = new ShowCamera(this, cameraObject);
    frame.addView(showCamera);
}

public void snapIt(View view){
    redo.setVisibility(View.VISIBLE);
    ok.setVisibility(View.VISIBLE);
    snap.setVisibility(View.INVISIBLE);
    cameraObject.takePicture(null, null, capturedIt);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

 if(v.getId()==ok.getId())
    {
        Intent intent = new Intent(SecondMain.this, Blend.class);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[]byteArray=stream.toByteArray();
        intent.putExtra("image", byteArray);
        String stringUri;
        stringUri = selectedImageUri.toString();
        intent .putExtra("KEY", stringUri);
        startActivity(intent);

1 个答案:

答案 0 :(得分:3)

这不是记忆问题,而是根据您的意图传输图像的问题。你看,{{1}}限制了它可以从一端传输到另一端的数据量,目前它只有1MB。你会在所有带有不错相机的现代手机上出现问题,因为图像超过1MB限制,一些带有低端相机的旧手机都能正常工作。您需要重新考虑如何转移图像。

你可以

  • 首先将其保存到文件中,仅向其发送路径(这是如何从图库中选择图像的方式)
  • 将其保存到SQL并在另一端进行检索
  • 使用静态变量image(最简单的)
  • 创建一个hodler类
  • 制作一个自定义的应用程序类,并将其暂时放在那里。
  • 在转移图像之前缩小并压缩图像