I'm trying to record video using the cwac-camera android library. I know that the library only supports recording in landscape, but I can't seem to get it to stop throwing the UnsupportedOperationException: Video recording supported only in landscape
. I've tried using CameraView's lockToLandscape()
method, and forced the screen orientation manually using androids setDisplayOrientation
(both in code an in xml configuration), but regardless the CameraInfo
tells me that the orientation is 90
. And CameraView's getDisplayOrientation()
returns -1
. Here is my Activity and Fragment:
There is some oddness resulting from being inside a cordova plugin (I can't use R).
public class RecordActivity extends Activity implements CameraHostProvider {
public static final String TAG = "ApparatusRecordActivity";
private VideoRecordingFragment current=null;
private boolean recording_state = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
String package_name = getApplication().getPackageName();
int layoutid = getApplication().getResources().getIdentifier("apparatus_activity_main", "layout", package_name);
int containerid = getApplication().getResources().getIdentifier("container", "id", package_name);
Log.d(TAG,"layout id: " + layoutid);
Log.d(TAG,"container id: " + containerid);
setContentView(layoutid);
current = new VideoRecordingFragment();
getFragmentManager().beginTransaction().add(containerid, current, "video_camera_fragment").commit();
SimpleCameraHost host = getCameraHost();
current.setHost(host);
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(host.getCameraId(),info);
Log.d(TAG,"Orientation rotation: " + info.orientation);
}
@Override
public SimpleCameraHost getCameraHost() {
return (new SimpleCameraHost.Builder(this)
.recordingHint(CameraHost.RecordingHint.VIDEO_ONLY)
//.useFrontFacingCamera(true)
.videoDirectory(new File("/sdcard"))
.build());
}
public void record(View v) {
try {
if (recording_state == false) {
recording_state = true;
Log.d(TAG,"Start recording");
current.record();
current.getButton().setText("Stop");
} else {
recording_state = false;
Log.d(TAG,"Stop recording");
current.stopRecording();
current.getButton().setText("Record");
}
} catch (Exception e) {
// Print stack trace and try again.
Log.e(TAG,Log.getStackTraceString(e));
}
}
}
And here is the VideoRecordingFragment that it calls:
public class VideoRecordingFragment extends CameraFragment {
public static final String TAG = "ApparatusVideoRecordingFragment";
public String package_name;
public int camera_layout_id;
public int camera_component_id;
public CameraView camera_view;
public View content;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
package_name = getActivity().getApplication().getPackageName();
camera_layout_id = getActivity().getApplication().getResources().getIdentifier("apparatus_camera", "layout", package_name);
Log.d(TAG,"camera_layout_id: " + camera_layout_id);
content = inflater.inflate(camera_layout_id, container, false);
camera_component_id = getActivity().getApplication().getResources().getIdentifier("camera", "id", package_name);
Log.d(TAG,"camera_component_id: " + camera_component_id);
CameraView camera_view = (CameraView) content.findViewById(camera_component_id);
//camera_view.lockToLandscape(true);
Log.d(TAG,"camera_view orientation: " + camera_view.getDisplayOrientation());
setCameraView(camera_view);
return(content);
}
public int getIdentifier(String asset, String type) {
return getActivity().getApplication().getResources().getIdentifier(asset,type,package_name);
}
public Button getButton() {
return ((Button)content.findViewById(getIdentifier("record_button","id")));
}
}