我正在编写一个Android 1.5应用程序,它在启动后启动.这是一个Service,应该拍照没有预览.此应用程序将记录某些区域的光密度.我能够拍照,但照片是黑色的.
经过长时间的研究,我遇到了一个关于它的bug线程.如果您不生成预览,则图像将为黑色,因为Android相机需要预览才能设置曝光和对焦.我创建了一个SurfaceView和听众,但onSurfaceCreated()事件永远不会被解雇.
我想原因是,表面没有在视觉上创造.我还看到了静态调用相机的一些例子,MediaStore.CAPTURE_OR_SOMETHING它们拍摄照片并用两行代码保存在所需的文件夹中,但它也没有拍照.
我是否需要使用IPC并bindService()调用此功能?或者是否有另一种方法来实现这一目标?
根据Java SDK方面的Android相机文档,必须提供相机预览帧(可见和活动)表面以便访问帧数据.我已经把我遇到的一些事情联系在一起(我是新的,因此有2个超链接限制),但我在结束发布我自己的问题之前,已经查阅了大量关于各种事情的文档.
a)我明确地不想将相机预览绘制到屏幕上,如果可能的话,我只想直接从相机缓冲区获取字节数据(我可以从这里获得).
b)是的,我看到了这一点: 没有预览就从相机拍照.
然而,这决定了使用这个库的应用程序都在插入这个(貌似)任意查看到他们的应用程序布局,这必须是可见的所有的时间(他们无法切换布局,父容器的变化可视性或使用子活动)应用程序生命周期.
事实上,我的需求类似于这张海报,除了我想要连续实时的相机预览数据流,而不是保存到磁盘上的图像的捕获.因此PictureCallback,他和myCamera.takePicture电话一起为他工作.出于显而易见的原因,将连续捕获写入磁盘对我来说不是一个解决方案,因此在我的情况下不起作用.myCamera.takePicture也比获取预览帧慢得多.
c)我已经开始涉足NDK了,并且对它有了很好的感觉.然而,根据这种访问摄像机数据通过本机不支持或推荐,并且即使在那时设备兼容性也是一个巨大的麻烦.
如果这已经过时了,并且有可靠的NDK路线从Android设备获取相机数据,我找不到它们,所以如果你能指出它们会很棒.
d)我想通过像Unity这样的工具(以统一插件的形式)访问这个库,我希望能够将它编译成JAR(或原生的.so)并期望它可以工作Android应用程序以这种方式导入库,以便他们可以使用相机而无需应用程序开发人员所需的特定UI /布局配置.
我希望能够创建一个用于Android应用程序的视觉处理库,并且不希望使用库限制应用程序必须使用特定的应用程序布局并将特定视图绘制到屏幕以便使用该视觉处理结果 - 一个非常简单的例子,如果一个应用程序想要使用我的库来获得相机看到的平均颜色,并想要在屏幕上为该颜色着色图像.
无论我有什么建议,我都会对我提出的任何要点都非常有帮助.非常感谢你的时间!
这是我用来将图像保存到的代码Bitmap.这段代码是基于CyanogenMod的相机应用程序的代码,所以我认为它会正常工作,但不是.关于这个问题最重要的一点是,在Nexus 4上进行测试时,Bitmap正在为使用后置摄像头拍摄的照片正确创建,但使用前置摄像头会产生下面的内容.
我用来创建的代码Bitmap:
private class XyzPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken (byte [] data, Camera camera) {
Options options = new Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length, options);
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的Options(根本没有),但它没有帮助.它可能是由两个不同的相机返回的像素格式的东西但是当我跑的时候getSupportedPictureFormats()它们都返回ImageFormat.JPEG...
我的想法已经不多了......
我还应该提一下,data使用a直接保存FileOutputStream是创建一个合适的JPEG图像.所以问题必须与BitmapFactory我创建的方式一致Bitmap.
这是此代码生成的位图:

编辑(24.03.2013):
花了几个小时试图解决这个问题后,我仍然没有真正的解决方案.我发现的只是当我将图片尺寸(使用Camera.Parameters.setPictureSize(int width, int height))设置为我通过调用获得的前置摄像头可用的最高分辨率时才会出现问题Camera.Parameters.getSupportedPictureSizes().
导致问题的分辨率是1280x960.正如我之前提到的那样,这是最高分辨率.第二个最高的是1280x720,当我使用这个时,输出图片很好.我确实检查了相机吐出的格式,它一直是ImageFormat.JPEG所以我不认为像素格式是这里的问题...
编辑( 08.03.2013 ):致电拍摄图片:
private class XyzAutoFocusCallback …Run Code Online (Sandbox Code Playgroud) 我正在开发一个在后台运行的服务,它可以将成功的图像和数据上传到网络上.
现在我想上传相机拍摄的图像.
在Android 2.2上没有预览的情况下,是否可以在后台服务中使用相机?
我在网上发现了各种对比剂的答案......
我该怎么做?
我试图在没有预览的情况下拍摄照片,当我的应用程序开始运行时立即拍摄,然后将图片保存在根文件夹中的新文件夹 - "pictures123"中.有人可以告诉我我的代码有什么问题吗?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File directory = new File(Environment.getExternalStorageDirectory() + "/pictures123/");
if (!directory.exists()) {
directory.mkdir();
}
Camera camera = Camera.open(0);
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
camera.setParameters(parameters);
SurfaceView mview = new SurfaceView(getBaseContext());
camera.setPreviewDisplay(mview.getHolder());
camera.setPreviewDisplay(null);
camera.startPreview();
camera.takePicture(null,null,photoCallback);
camera.stopPreview();
}
Camera.PictureCallback photoCallback=new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/pictures123");
File file = new File (myDir, "pic1.jpeg");
FileOutputStream out = new FileOutputStream(file); …Run Code Online (Sandbox Code Playgroud) 如何在不预览的情况下从前置摄像头捕获图像并将其保存到SD卡.请帮我提供源代码.
如果有重复,我很抱歉,但经过一段时间的搜索,我无法找到明确的答案.没有预览就能拍摄视频吗?是否可以在不使用任何奇怪的解决方法的情况下实现此功能,并确保它应该适用于大多数设备.我的要求是制作一个间谍功能,在没有用户看到的情况下录制视频.这可行吗?如果没有 - 那么像Secret Video Recording这样的应用程序如何工作?谢谢.
android video-capture preview android-service android-camera