我有一些适用于 Android 2.1 和 2.2 的拍照代码。
但是这些代码在 Android 2.3 中被破坏了。
在花了时间解决这个徒劳的问题后,我想在这里寻求帮助。
我的拍照代码流程是这样的:
创建一个Camlayer类扩展SurfaceView
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 | private void init(Context context){ // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mCamera = Camera.open(); } public CamLayer(Context context) { super(context); init(context); } public CamLayer(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { Log.i(TAG+".surfaceChanged","being called!"); Log.i(TAG+".surfaceChanged","w="+w); Log.i(TAG+".surfaceChanged","h="+h); if (isPreviewRunning) { mCamera.stopPreview(); } try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(mPreviewCallback); } catch (IOException e) { Log.e(TAG+".surfaceCreated","mCamera.setPreviewDisplay(holder);"); } Camera.Parameters p = mCamera.getParameters(); setOptimalSize(p, w, h, SIZEOFPREVIEW); setOptimalSize(p, w, h, SIZEOFPICTURE); mCamera.setParameters(p); mCamera.startPreview(); isPreviewRunning = true; } public void takePicture(){ Log.i(TAG+".takePicture","being called!"); mCamera.takePicture(null, null, mPictureCallback); Log.i(TAG+".takePicture","call ended!"); } } |
问题是在Android 2.3.3,
达尔维克线:
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 | "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x40022170 self=0xce68 | sysTid=2411 nice=0 sched=0/0 cgrp=default handle=-1345006464 at android.hardware.Camera.native_takePicture(Native Method) at android.hardware.Camera.takePicture(Camera.java:746) at android.hardware.Camera.takePicture(Camera.java:710) at oms.cj.tube.camera.CamLayer.takePicture(CamLayer.java:256) at oms.cj.tube.camera.DefineColor.takePicture(DefineColor.java:61) at oms.cj.tube.camera.DefineColor.onKeyUp(DefineColor.java:71) at android.view.KeyEvent.dispatch(KeyEvent.java:1280) at android.app.Activity.dispatchKeyEvent(Activity.java:2078) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:16 66) at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2571) at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2546) at android.view.ViewRoot.handleMessage(ViewRoot.java:1878) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:3691) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) at dalvik.system.NativeStart.main(Native Method) |
有人遇到同样的问题吗?并且知道如何解决它?
我还观察到 mCamera.takePicture(null, null, handler) 冻结。我试图在调用 takePicture() 之前清除预览处理程序:mCamera.setPreviewCallback(null),现在它可以工作了。
我今天在装有 Android 2.3.3 的三星 Exhibit 4G 上测试我们的应用程序时遇到了完全相同的问题,并使用解决方法解决了它。
我不再调用 takepicture 而是使用最后一个预览回调作为图片。
问题是预览回调使用 NV21 格式发送数据缓冲区。
所以你必须使用这个过程来转换图像:NV21 -> RGB -> 加载位图 -> 压缩为 JPEG
我们现在的代码如下所示:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @Override public synchronized void onPreviewFrame(byte[] data, Camera arg1) { if (!mTakePicture) { CameraPreview.this.invalidate(); } else { if (mTakePictureCallback != null && !mPictureTaken) { int rgb[] = new int[previewSize.width*previewSize.height]; decodeYUV420SP(rgb, data, previewSize.width, previewSize.height); Bitmap memoryImage = Bitmap.createBitmap(rgb, previewSize.width, previewSize.height, Bitmap.Config.ARGB_8888); ByteArrayOutputStream baos = new ByteArrayOutputStream(); memoryImage.compress(CompressFormat.JPEG, 100, baos); shutterSound(); setBackgroundDrawable(new BitmapDrawable(getContext().getResources(), memoryImage)); mTakePictureCallback.onPictureTaken(baos.toByteArray(), arg1); } mPictureTaken = true; camera.stopPreview(); } } }); |
decodeYUV420SP 的代码在这里 http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array 谁在科泰找到的 http://code .google.com/p/ketai/
当你拍照时,只需将 mTakePicture 变量设置为 true
我正在开发一个更好的版本,但这应该能让你继续前进。
我不确定您的代码中使用了什么 setOptimalSize 方法,但请确保您已设置相机参数
2 | mCamera.setPictureFormat(ImageFormat.JPEG); |
我在使用 GB 手机时遇到了这个问题,对我来说,这是因为我在调用 camera.takePicture() 之后立即调用了 camera.startPreview(),这导致了 Android 中的一些线程锁定。修复方法是将 camera.startPreview() 移动到传递给 camera.takePicture() 的回调中,这样它只会在图片数据进入后才被调用(下面的示例代码)。当然,这仅在您有兴趣在拍摄照片后重新开始预览时才相关。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public void myTakePicture(Camera.PictureCallback callback) { mCamera.takePicture(null, null, null, callback); mCamera.startPreview(); } // ... // The way that worked for me public void myTakePicture(final Camera.PictureCallback callback) { mCamera.takePicture(null, null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] pictureData, Camera camera) { callback.onPictureTaken(pictureData, camera); mCamera.takePicture(); } }); } |
这不仅使 ANR 在调用 takePicture 时消失,而且还修复了一些高端手机(尤其是 >=4.3 Nexus 5)上发生的 startPreview 原生崩溃。希望对您有所帮助!
问题在于下面的代码是写的。
定义了一个 PreviewCallback,
2 3 4 5 6 7 | @Override public void onPreviewFrame(byte[] data, Camera camera) { //Log.i(TAG+".mPreviewCallback.onPreviewFrame","being called!"); } }; |
mCamera.setPreviewCallback(mPreviewCallback);
这在 2.1/2.2 中有效,但在 2.3 中无效。
不确定 Android 团队是否支持这种使用相机的方式。
如果上述流程是预期的,那么 Android 团队应该解决这个问题。
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
我想通过控制台手动创建一个用户:User.find_or_create_by(email:"user@mail.com",first_name:"Stan",last_name:"Smith",password:"password",password_confirmation:"password",confirmed_at:Time.now)我在过去的项目中多次这样做,但这次没有用。它没有获取Devise密码模型属性,所以这是我得到的错误:PG::UndefinedColumn:ERROR:columnusers.passworddoesnotexist我有Rails4.1.4和Dev
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为
我有几个跳过的规范。Pending:(Failureslistedhereareexpectedanddonotaffectyoursuite'sstatus)1)...#Notyetimplemented#./spec/requests/request_spec.rb:22如何抑制未决规范的输出? 最佳答案 您可以添加以下配置选项以从运行中过滤掉所有待处理的规范:RSpec.configuredo|config|config.filter_run_excludingskip:trueend此外,here是一个更详细的抑制输出的建议