[Android] Failed binder transaction

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bartos88
  • Registratie: Oktober 2006
  • Laatst online: 07-08 11:00
Hoi allemaal,

Ik heb een vaag probleem. Ik krijg een failed binder transaction error in de logcat wanneer ik de foto die de camera net gemaakt heeft wil terugsturen van de camera intent naar de intent die hem aangeroepen heeft (met activityforresult). De manier waarop ik de foto doorgeef is gewoon hoe ik hem van de camera binnen krijg, namelijk als byte[]. Het gebeurt ook alleen wanner ik een foto maak met veel licht, want dan is de byte[] blijkbaar 2x zo groot.
Begrijpt iemand hoe dit kan? want anders kan ik toch nooit een normale foto terugkrijgen van de camera? :S

Hieronder staat mijn code. Het probleem zit hem rond regel 74, daar wordt de byte[] die van de camera komt opgeslagen zodat hij in de parent intent weer uitgelezen kan worden. Hierna wordt deze intent beeindigd en gaat android weer over naar de parent intent. Bij de overgang komt de failed binder transaction error. De onactivityresult in de parent intent wordt nooit bereikt. Zien jullie het probleem? :S

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package example.imaging.ape;

import java.io.IOException;
import java.util.Iterator;
import java.util.Set;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;

public class TakePicture extends Activity implements SurfaceHolder.Callback{
    Camera mCamera;
    Boolean mPreviewRunning = false;
    int imageLayoutHeight;
    int imageLayoutWidth;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //setup camera surface
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.cameralayout);

        SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.hist_surface_camera);
        SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        Bundle extras = getIntent().getExtras();
        imageLayoutHeight = extras.getInt("layoutHeight");
        imageLayoutWidth = extras.getInt("layoutWidth");
        
        OnTouchListener touchListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent e) {

                System.out.println("MAKING PICTURE");
                mCamera.autoFocus(cb);              
                return false;
            }
        }; 

        //setup touch listener
        mSurfaceView.setOnTouchListener(touchListener);
        
    }
    
    AutoFocusCallback cb = new AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera c) {
            c.takePicture(null, null, mPictureCallback);
        }   
    };
    
    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] imageData, Camera c) {
            System.out.println("Picture taken, now returning");         
            Intent resultIntent = new Intent();
            resultIntent.putExtra("cameraImage", imageData);
            System.out.println("put Extra");
            setResult(Activity.RESULT_OK, resultIntent);
            finish();           
        }
    };
    
    //initialize camera
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open();
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        if (mPreviewRunning) {
            mCamera.stopPreview();
        }

        Camera.Parameters p = mCamera.getParameters();
        
        p.setPreviewSize(h, w);
        System.out.println("PreviewSize: " + h + "," + w);
        p.setPictureSize(h*3,w*3); // is around 1200x900
        p.set("rotation", 90);
        mCamera.setParameters(p);

        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mCamera.startPreview();
        mPreviewRunning = true;
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();
    }
    
}