I'm trying to create a small application which both retrieves depth data and shows a little "preview" from my RGB camera. Here's the code of my MainScreen class:
private static final String TAG = MainScreen.class.getSimpleName();
public static TangoConfig mConfig;
public static Tango mTango;
public TangoCameraPreview preview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
preview = new TangoCameraPreview(this);
ViewGroup layout = (ViewGroup)findViewById(R.id.content_main_screen);
layout.addView(preview);
}
@Override
protected void onDestroy() {
super.onDestroy();
preview.disconnectFromTangoCamera();
mTango.disconnect();
}
@Override
protected void onPause() {
super.onPause();
preview.onPause();
synchronized (this) {
try {
mTango.disconnect();
} catch (TangoErrorException e) {
Log.e(TAG, getString(R.string.exception_tango_error), e);
}
}
}
@Override
protected void onResume() {
super.onResume();
mTango = new Tango(MainScreen.this, new Runnable() {
@Override
public void run() {
synchronized (MainScreen.this) {
try {
mConfig = setupTangoConfig(mTango);
mTango.connect(mConfig);
preview.connectToTangoCamera(mTango, TangoCameraIntrinsics.TANGO_CAMERA_COLOR);
startupTango();
} catch (TangoOutOfDateException e) {
Log.e(TAG, getString(R.string.exception_out_of_date), e);
} catch (TangoErrorException e) {
Log.e(TAG, getString(R.string.exception_tango_error), e);
} catch (TangoInvalidException e) {
Log.e(TAG, getString(R.string.exception_tango_invalid), e);
}
}
}
});
preview.onResume();
}
private TangoConfig setupTangoConfig(Tango tango) {
TangoConfig config = tango.getConfig(TangoConfig.CONFIG_TYPE_DEFAULT);
config.putBoolean(TangoConfig.KEY_BOOLEAN_LOWLATENCYIMUINTEGRATION, true);
config.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true);
config.putInt(TangoConfig.KEY_INT_DEPTH_MODE, TangoConfig.TANGO_DEPTH_MODE_POINT_CLOUD);
return config;
}
private void startupTango() {
final ArrayList<TangoCoordinateFramePair> framePairs =
new ArrayList<TangoCoordinateFramePair>();
mTango.connectListener(framePairs, new Tango.OnTangoUpdateListener() {
@Override
public void onPoseAvailable(final TangoPoseData pose) {
// We are not using TangoPoseData for this application.
}
@Override
public void onXyzIjAvailable(TangoXyzIjData xyzIj) {
// We are not using onXyzIjAvailable for this app.
}
@Override
public void onPointCloudAvailable(final TangoPointCloudData pointCloudData) {
logPointCloud(pointCloudData);
}
@Override
public void onTangoEvent(final TangoEvent event) {
// Ignoring TangoEvents.
}
@Override
public void onFrameAvailable(int cameraId) {
if(cameraId == TangoCameraIntrinsics.TANGO_CAMERA_COLOR) {
preview.onFrameAvailable();
}
}
});
}
private void logPointCloud(TangoPointCloudData pointCloudData) {
Log.i(TAG, String.format(getString(R.string.log_pointcloud_data),
pointCloudData.numPoints,
calculateAveragedDepth(pointCloudData.points, pointCloudData.numPoints)));
}
private float calculateAveragedDepth(FloatBuffer pointCloudBuffer, int numPoints) {
float totalZ = 0;
float averageZ = 0;
if (numPoints != 0) {
int numFloats = 4 * numPoints;
for (int i = 2; i < numFloats; i = i + 4) {
totalZ = totalZ + pointCloudBuffer.get(i);
}
averageZ = totalZ / numPoints;
}
return averageZ;
}
When I start this code, the TangoCameraPreview stays empty, and the onFrameAvailable()-Method is never called.
I have included Camera persmissions in my Android manifest xml, but it still isn't calling the handler.
Sadly, I haven't found any good tutorials on this topic, and since this is just a first step in my project, I don't want to write my own renderer just yet, if at all.
What could be the problem?