【发布时间】:2014-01-27 19:23:47
【问题描述】:
我正在尝试集成一个有点像 instagram 的 CamCoder,但是作为初学者,我尝试使用 Commonsguy lib 中的以下代码放置 Recorder Preview
MainActivity 如下
@SuppressLint("SimpleDateFormat")
public class RecorderActivity extends BaseActivity implements CamCoderView.Contract
{
//private CamCoderView ffc = null;
//private CamCoderView std = null;
private CamCoderView camcoder = null;
private boolean hasTwoCameras = (Camera.getNumberOfCameras() > 1);
private boolean singleShot = true;
private ImageButton captureBtn;
private ImageButton rotateBtn;
private ImageButton doneBtn;
private int cameraType = Camera.CameraInfo.CAMERA_FACING_BACK;
private boolean isCapturePressed = false;
private ArrayList<String> pathNames = new ArrayList<String>();
private String randomPathName;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_record_layout);
WindowManager.LayoutParams layout = getWindow().getAttributes();
layout.screenBrightness = 1F;
getWindow().setAttributes(layout);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
camcoder = CamCoderView.newInstance(false);
getFragmentManager().beginTransaction()
.replace(R.id.container, camcoder ).commit();
randomPathName = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
captureBtn = (ImageButton) findViewById(R.id.captureBtn);
doneBtn = (ImageButton) findViewById(R.id.doneBtn);
rotateBtn = (ImageButton) findViewById(R.id.rotateBtn);
if (hasTwoCameras)
rotateBtn.setEnabled(true);
rotateBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (cameraType == Camera.CameraInfo.CAMERA_FACING_BACK)
{
cameraType = Camera.CameraInfo.CAMERA_FACING_FRONT;
camcoder = CamCoderView.newInstance(true);
getFragmentManager().beginTransaction()
.replace(R.id.container, camcoder ).commit();
}
else
{
cameraType = Camera.CameraInfo.CAMERA_FACING_BACK;
camcoder = CamCoderView.newInstance(false);
getFragmentManager().beginTransaction()
.replace(R.id.container, camcoder ).commit();
}
}
});
doneBtn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
}
});
captureBtn.setOnTouchListener(new OnTouchListener()
{
@SuppressLint("SdCardPath")
@Override
public boolean onTouch(View arg0, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
if(isCapturePressed == false)
{
isCapturePressed = true;
String path = getOutputMediaFile().getAbsolutePath();
pathNames.add(path);
camcoder.startRecording(path);
}
}
else if (event.getAction() == MotionEvent.ACTION_UP)
{
isCapturePressed = false;
try {
camcoder.stopRecording();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
});
}
@SuppressLint("DefaultLocale")
@Override
public void onBackPressed()
{
super.onBackPressed();
if (pathNames != null)
{
for (int i = 0 ; i < pathNames.size(); i++)
{
File file = new File(pathNames.get(i));
if(file.exists())
{
file.delete();
}
}
}
finish();
}
@SuppressLint("SimpleDateFormat")
private File getOutputMediaFile()
{
File filesDir = getDir("users", Context.MODE_PRIVATE); //Creating an internal dir;
if(!filesDir.isDirectory())
{
if (!filesDir.mkdirs())
{
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
File mediaFile;
mediaFile = new File(filesDir.getPath() + File.separator
+ "vid_" + randomPathName + "_" + String.valueOf(pathNames.size()) +".mp4");
return mediaFile;
}
@Override
public void onDestroy()
{
super.onDestroy();
}
@Override
public boolean isSingleShotMode()
{
return(singleShot);
}
@Override
public void setSingleShotMode(boolean mode)
{
singleShot = mode;
}
@Override
public void callUIMethodForStore(Intent intent) {
}
}
CameraView如下
public class CamCoderView extends CameraFragment
{
private FrameLayout preview;
private static final String KEY_USE_FFC = "USE_FFC";
static CamCoderView newInstance(boolean useFFC)
{
CamCoderView f = new CamCoderView();
Bundle args = new Bundle();
args.putBoolean(KEY_USE_FFC, useFFC);
f.setArguments(args);
return(f);
}
@Override
public void onCreate(Bundle state)
{
super.onCreate(state);
setHost(new MyCameraHost(getActivity()));
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
{
View cameraView = super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment, container, false);
preview = (FrameLayout)view.findViewById(R.id.camera);
preview.addView(cameraView);
if(isAutoFocusAvailable())
{
autoFocus();
}
return view;
}
@Override
public void onDestroy()
{
super.onDestroy();
}
public class MyCameraHost extends SimpleCameraHost
{
boolean supportsFaces=false;
public MyCameraHost(Context _ctxt) {
super(_ctxt);
}
@Override
public boolean useFrontFacingCamera() {
return(getArguments().getBoolean(KEY_USE_FFC));
}
@Override
public boolean useSingleShotMode() {
return false;
}
@Override
public void saveImage(byte[] image)
{
}
@Override
public void autoFocusAvailable() {
}
@Override
public void autoFocusUnavailable() {
}
@Override
public void onCameraFail(CameraHost.FailureReason reason) {
super.onCameraFail(reason);
Toast.makeText(getActivity(),
"Sorry, but you cannot use the camera now!",
Toast.LENGTH_LONG).show();
}
@Override
public Parameters adjustPreviewParameters(Parameters parameters)
{
return(super.adjustPreviewParameters(parameters));
}
}
Contract getContract()
{
return((Contract)getActivity());
}
interface Contract
{
boolean isSingleShotMode();
void setSingleShotMode(boolean mode);
}
public void startRecording(String path)
{
try {
record();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在我的 HTC SENSE 上它像 Charm 一样工作,但我的 s3 根本不工作。
【问题讨论】:
-
“我哪里错了”——我无从得知。您将需要确定您是否真的在使用这个片段,并使用 Hierarchy View 等工具来确定库中的
CameraView是否真的在屏幕上。 “应该做什么样的设置”——你需要问 Instagram 这个问题。 -
@CommonsWare 是的,视图已打开,只是没有显示预览,片段工作正常。设置实际上意味着,我想如何将视频预览设置为“方形”并初始化记录器:)
-
试用演示应用程序。如果它们不起作用,那么我对您的设备的支持就会出现问题,我需要了解更多信息。这个库不支持方形预览,我也看不到它的有效用例。我不知道“初始化记录器”是什么意思,但是要开始和停止记录,您可以在片段上调用
startRecording()和stopRecording()。请参阅the "Basic Usage" instructions 的第 3b 步。 -
@CommonsWare 是的,先生,我实际上已经看到了您的演示并查看了上面的代码,它完全是您的代码的副本,我的调整很少,我改变的是,删除了 actionBar 和在主要活动上放置按钮。它在我的 HTC 上工作得非常好,但是昨天我在我的 s3 上进行测试,但仍然在 S3 上它只是显示没有相机预览,但是你的演示工作正常。请也检查图像
-
我无法进一步帮助您。您将需要确定演示和您的代码之间有什么不同,然后慢慢修改其中一个,使其看起来像另一个,直到问题发生变化。
标签: java android commonsware-cwac