{"id":21888504,"url":"https://github.com/pythoncat1024/usercamerapreview","last_synced_at":"2025-03-22T02:23:55.235Z","repository":{"id":107255635,"uuid":"142854203","full_name":"pythoncat1024/UserCameraPreview","owner":"pythoncat1024","description":"获取相机预览界面图像数据，SurfaceView 的使用，类似扫一扫的功能简单实现。","archived":false,"fork":false,"pushed_at":"2018-07-30T15:30:59.000Z","size":611,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-26T20:32:14.686Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pythoncat1024.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-30T09:26:48.000Z","updated_at":"2022-11-06T11:52:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"7c34ab1b-c42f-41f6-8ff8-885159ed0d40","html_url":"https://github.com/pythoncat1024/UserCameraPreview","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2FUserCameraPreview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2FUserCameraPreview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2FUserCameraPreview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pythoncat1024%2FUserCameraPreview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pythoncat1024","download_url":"https://codeload.github.com/pythoncat1024/UserCameraPreview/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244895505,"owners_count":20527901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-28T11:15:53.009Z","updated_at":"2025-03-22T02:23:55.225Z","avatar_url":"https://github.com/pythoncat1024.png","language":"Java","readme":"#### 获取相机预览界面图像数据的逻辑实现。（附带使用了一下`zxing`库进行图片的解析）【粗陋版*扫一扫*实现】\n\n主要逻辑：\n\n```\npublic class UseCameraActivity extends Activity {\n\n\n    private Activity get() {\n        return this;\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_asome);\n        setTitle(getClass().getSimpleName());\n        final FrameLayout frameLayout = findViewById(R.id.prev_content_layout);\n        Button btn = findViewById(R.id.start_camera_preview);\n\n        btn.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                AndPermission.with(get())\n                        .permission(Manifest.permission.CAMERA,\n                                Manifest.permission.WRITE_EXTERNAL_STORAGE\n                        )\n                        .onDenied(new Action() {\n                            @Override\n                            public void onAction(List\u003cString\u003e permissions) {\n                                LogUtils.e(\"error.....\" + permissions);\n                            }\n                        })\n                        .onGranted(new Action() {\n                            @Override\n                            public void onAction(List\u003cString\u003e permissions) {\n                                LogUtils.w(\"you can do..\");\n                                ScanView scanView = new ScanView(get());\n                                frameLayout.removeAllViews();\n                                frameLayout.addView(scanView);\n                            }\n                        }).start();\n            }\n        });\n    }\n\n\n    static class ScanView extends SurfaceView implements SurfaceHolder.Callback,\n            Camera.AutoFocusCallback {\n        private Camera mCamera;\n        private final File fileImg;\n\n        private ScanView self;\n\n        public ScanView(Context context) {\n            super(context);\n            fileImg = new File(context.getCacheDir(), \"prev_view.jpg\");\n            SurfaceHolder mHolder = getHolder();\n            self = this;\n            mHolder.addCallback(this);\n            // deprecated setting, but required on Android versions prior to 3.0\n            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);\n        }\n\n        @Override\n        public void onAutoFocus(boolean success, Camera camera) {\n            LogUtils.w(\"auto focus...\" + success);\n            if (mCamera != null) {\n                mCamera.takePicture(null, null, null, new Camera.PictureCallback() {\n                    @Override\n                    public void onPictureTaken(byte[] data, Camera camera) {\n\n                        mCamera.cancelAutoFocus();\n                        mCamera.stopPreview(); // 拿到数据就停止！！！\n                        LogUtils.w(\"========data========\");\n                        LogUtils.w(\"----------data-----------------\");\n//                        camera.startPreview();\n                        File pictureFile = fileImg;\n                        if (pictureFile == null) {\n                            LogUtils.e(\"Error creating media file, check storage permissions: \" +\n                                    null);\n                            return;\n                        }\n\n                        if (data == null) {\n                            return;\n                        }\n                        try {\n                            LogUtils.d(data);\n                            FileOutputStream fos = new FileOutputStream(pictureFile);\n                            fos.write(data);\n                            fos.close();\n                            LogUtils.e(\"save preview complete###!!!\");\n                            LogUtils.e(\"save preview complete###!!!\" + pictureFile);\n                            BitmapFactory.Options options = new BitmapFactory.Options();\n                            options.inJustDecodeBounds = true;\n                            BitmapFactory.decodeFile(pictureFile.getAbsolutePath(), options);\n                            options.inJustDecodeBounds = false;\n                            int outWidth = options.outWidth;\n                            int outHeight = options.outHeight;\n                            if (outWidth \u003e= getWidth() * 2) {\n                                options.inSampleSize = outWidth / getWidth();\n                            }\n                            if (outHeight \u003e= getHeight() * 2) {\n                                options.inSampleSize = outHeight / getHeight();\n                            }\n                            Bitmap bmp = BitmapFactory.decodeFile(pictureFile.getAbsolutePath(), options);\n                            Result result = parseInfoFromBitmap(bmp);\n                            if (result != null) {\n                                Toast.makeText(getContext(), \"INFO:\" + result.getText(), Toast.LENGTH_SHORT).show();\n                                LogUtils.w(\"解析成功：\" + result);\n                            } else {\n                                LogUtils.e(\"再次尝试中....\");\n                                mCamera.startPreview();\n                                mCamera.autoFocus(self);\n                                // todo:这里也可以做最大重试次数的限制...\n                            }\n                        } catch (Exception e) {\n                            LogUtils.e(\"Error accessing file: \" + e.getMessage());\n                        }\n                    }\n                });\n            }\n        }\n\n        public Result parseInfoFromBitmap(Bitmap bitmap) {\n            int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];\n            bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());\n            LogUtils.w(\"### pixels dest==\" + Arrays.toString(pixels));\n\n            RGBLuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(),\n                    bitmap.getHeight(), pixels);\n            GlobalHistogramBinarizer binarizer = new GlobalHistogramBinarizer(source);\n            BinaryBitmap image = new BinaryBitmap(binarizer);\n            Result result = null;\n            try {\n                result = new QRCodeReader().decode(image);\n                return result;\n            } catch (NotFoundException e) {\n                e.printStackTrace();\n                Toast.makeText(getContext(), \"非二维码图片，不能解析\", Toast.LENGTH_SHORT).show();\n            } catch (ChecksumException e) {\n                e.printStackTrace();\n            } catch (FormatException e) {\n                e.printStackTrace();\n            }\n\n            return null;\n\n        }\n\n        @Override\n        public void surfaceCreated(SurfaceHolder holder) {\n            LogUtils.e(\"x surfaceCreated.. #####\");\n            try {\n                mCamera = Camera.open();\n                mCamera.setPreviewDisplay(holder);\n                mCamera.setDisplayOrientation(90);\n                Camera.Parameters parameters = mCamera.getParameters();\n//                parameters.setPictureSize(1600, 1200);\n//                parameters.setPreviewSize(640, 480);\n                mCamera.setParameters(parameters);\n                mCamera.startPreview();\n                mCamera.autoFocus(this);\n                LogUtils.e(\"surfaceCreated.. #####\");\n\n            } catch (IOException e) {\n                LogUtils.e(\"Error setting camera preview: \" + e.getMessage());\n            }\n        }\n\n        @Override\n        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {\n\n            LogUtils.w(\"--change-\");\n        }\n\n        @Override\n        public void surfaceDestroyed(SurfaceHolder holder) {\n            LogUtils.w(\"destroy--\");\n            if (mCamera != null) {\n                mCamera.cancelAutoFocus();\n                mCamera.stopPreview();\n                mCamera.release();\n            }\n        }\n    }\n}\n\n```\n\n看起来有一点长，但是实际内容并不多。\n\n**注意：**\n\n* 实现相机预览，必须去实现一个`SurfaceView`，一个普通的`View`貌似做不到这点。\n* 要想获取相机预览数据，必须去对焦，不然不返回数据。\n\n\n没有了。另外，代码里用的`api`是`Camera`的`api`，已经过时了，虽然可以继续使用。但是官方不建议了，后续有时间会去尝试`Camera2`。\n\n---- end ---\n\n更详细的介绍：[戳一下试试...](https://blog.csdn.net/DucklikeJAVA/article/details/81288624)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoncat1024%2Fusercamerapreview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpythoncat1024%2Fusercamerapreview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpythoncat1024%2Fusercamerapreview/lists"}