首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用意图避免失败的绑定器事务错误

使用意图避免失败的绑定器事务错误
EN

Stack Overflow用户
提问于 2015-05-06 16:24:12
回答 1查看 1.9K关注 0票数 2

在我的from相机应用程序中,我需要将位图和Uri从一个活动转移到另一个活动。出于某种原因,我在大多数手机上得到了失败的绑定器事务错误(我在较新的手机上得到了错误,但在Nexus4和Galaxy3上没有)。即使我只是试图通过一个意图传输位图,我也会得到相同的错误(我还尝试只传输Uri并得到错误)。从我在网上读到的内容来看,错误来自于内存问题,但我不知道如何修复它。任何帮助我都会感激的。

我的第一次活动是:

代码语言:javascript
复制
...

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

}

}

第二项活动:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2015-05-06 16:33:00

这不是一个记忆问题,而是一个用你的意图传递你的图像的问题。您知道,Bundle有一个限制,它可以从一端传输多少数据到另一端,目前只有1MB。你会在所有的现代手机上出现问题,有一个像样的摄像头,因为图像超过1MB的限制,一些旧手机与低端相机将工作。你需要重新考虑你将如何转移图像。

你可以的

  • 先将其保存到文件中,然后发送到它的唯一路径(这是从图库中选择图像的方式)
  • 将其保存到SQL,并在另一端检索它。
  • 使用图像的静态变量(最简单的)创建hodler类
  • 创建应用程序的自定义类并暂时放在那里。
  • 在图像传输之前缩小和压缩图像
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30082350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档