autojs


相机拍照

<pre><code class="language-js">"ui"; /** *作者QQ: 1811588980 *完成时间: 2019年4月3日 下午11:00:30 *测试机型: PD1813D *Auto.js版本: Pro 7.0.0-4 *屏幕: 1080*2280 *API: 27 *备注: 。先去应用权限界面把相机权限打开。(加入了自动聚焦拍照功能) **/ var FGH = { //需要用到的Android类。 Camera: android.hardware.Camera, //AutoFocusCallback: android.hardware.Camera.AutoFocusCallback, //PictureCallback: android.hardware.Camera.PictureCallback, //ErrorCallback: android.hardware.Camera.ErrorCallback, PackageManager: android.content.pm.PackageManager, SurfaceView: android.view.SurfaceView, SurfaceHolder: android.view.SurfaceHolder, //Callback: android.view.SurfaceHolder.Callback, Bitmap: android.graphics.Bitmap, BitmapFactory: android.graphics.BitmapFactory, Matrix: android.graphics.Matrix, View: android.view.View, //OnClickListener:android.view.View.OnClickListener, Environment: android.os.Environment, //android.os.Environment.getExternalStoragePublicDirectory, }; ui.layout( &lt;vertical&gt; &lt;frame&gt; &lt;android.view.SurfaceView id="surface" w="360"h="640"/&gt; &lt;progressbar id="search" w="auto" h="auto" layout_gravity="center"/&gt; &lt;/frame&gt; &lt;button id="pz" w="*"h="*" text="拍照" layout_gravity="bottom|center_horizontal"/&gt; &lt;/vertical&gt; ); //此方法返回的是Android系统推荐的用来保存图片和视频的标准的位置。 var SaveDirPath = FGH.Environment.getExternalStoragePublicDirectory(FGH.Environment.DIRECTORY_PICTURES); log(SaveDirPath); /* 注意: Environment.getExternalStoragePublicDirectory() 在Android 2.2(API 8级)或更高版本中可用。 如果使用较早版本的Android定位设备,应改用 Environment.getExternalStorageDirectory()。 有关详细信息,请参阅保存共享文件。 */ ui.run(() =&gt; { ui.pz.setText("拍照"); ui.search.setVisibility(8); }); /** Check if this device has a camera */ function checkCameraHardware(context) { if (context.getPackageManager().hasSystemFeature(FGH.PackageManager.FEATURE_CAMERA)) { // this device has a camera return true; } else { // no camera on this device return false; } }; if (!checkCameraHardware(context)) { throw "没有摄像头"; }; toastLog("摄像头数量: " + FGH.Camera.getNumberOfCameras()); var mCamera; try { //打开第1个(默认第1个)摄像头。 mCamera = FGH.Camera.open(); } catch (e) { throw e + " 打开摄像头失败,可能没有权限请手动到应用权限里面打开"; }; //添加错误的回调。 mCamera.setErrorCallback(function(mCamera) { toastLog("有错误发生"); }); // get Camera parameters var params = mCamera.getParameters(); //toastLog(mCamera.getParameters()); var previewSizes = params.getSupportedPreviewSizes(); /* for (let i in previewSizes) { log(previewSizes[i]); }; */ var focusModes = params.getSupportedFocusModes(); /* for (let i in focusModes) { log(focusModes[i]); }; */ if (focusModes.contains(FGH.Camera.Parameters.FOCUS_MODE_AUTO)) { // Autofocus mode is supported toastLog("支持自动对焦"); // set the focus mode //params.setFocusMode(FGH.Camera.Parameters.FOCUS_MODE_AUTO); // set Camera parameters //mCamera.setParameters(params); }; if (parseInt(device.release) &gt;= 9) { //摄像头在正面还是反面?(Android9.0以上有效) // toastLog(FGH.Camera.getCameraInfo()); }; var surface = ui.surface; var holder = surface.getHolder(); // 已弃用的设置,但在3.0之前的Android版本上需要此设置 holder.setType(FGH.SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //添加控件的回调事件。回调的意思是。当什么什么情况下,怎么怎么做? holder.addCallback(new FGH.SurfaceHolder.Callback({ surfaceCreated: function(holder) { //SurfaceView&amp;SurfaceHolder的创建完成回调 try { mCamera.setPreviewDisplay(holder); mCamera.setDisplayOrientation(90); mCamera.startPreview(); /* if (focusModes.contains(FGH.Camera.Parameters.FOCUS_MODE_AUTO)) { // Autofocus mode is supported toastLog("支持自动对焦"); // set the focus mode params.setFocusMode(FGH.Camera.Parameters.FOCUS_MODE_AUTO); // set Camera parameters mCamera.setParameters(params); }; */ } catch (e) { throw e; } }, surfaceChanged: function(holder, format, width, height) { // 如果允许预览可以更改或旋转,可以在这里处理这些事件 mCamera.stopPreview(); this.surfaceCreated(holder); }, surfaceDestroyed: function(holder) { //结束。//切换到其他软件页面也会运行此回调。 }, })); events.on("exit", function() { log("结束运行"); //释放摄像头资源。 //摄像头是手机所有应用程序的共用设备。 //需要回收以便其他软件使用。 mCamera.stopPreview(); mCamera.release(); }); //预览过程中的回调。 mCamera.setOneShotPreviewCallback(new FGH.Camera.PreviewCallback({ onPreviewFrame: function(data, camera) { //data为bytes数据; //这里可以做一些二维码识别的功能。 //let bitmap=FGH.BitmapFactory.decodeByteArray(data, 0, data.length); }, })); threads.start(function() { try { console.show(); } catch (e) { toastLog(e); }; }); var mPictureCallback = new FGH.Camera.PictureCallback({ onPictureTaken: function(data, camera) { camera.startPreview(); //data为bytes数据; try { //拍出来的图片尺寸太大了,我靠。导致。保存图片用的时间太长了。 let img1=images.fromBytes(data); let img2 = images.rotate(img1, 90); img1.recycle(); let img=images.resize(img2, [ 1080,1540]); img2.recycle(); //重设图片尺寸,旋转图片。 let savePath = files.join(SaveDirPath, "/相机(拍照).png"); images.save(img, savePath, "png", 100); img.recycle(); toastLog("图片保存成功\n" + savePath); media.scanFile(savePath); app.viewFile(savePath); } catch (e) { toastLog(e); }; ui.run(() =&gt; { ui.pz.setText("拍照"); ui.search.setVisibility(8); }); }, }); var mAutoFocusCallback = new FGH.Camera.AutoFocusCallback({ onAutoFocus: function(success, camera) { // TODO Auto-generated method stub if (success) { log("聚焦成功..."); //mCamera.takePicture(null, null, mPictureCallback); //这个有拍照声音。 camera.takePicture(new FGH.Camera.ShutterCallback({ //onShutter: function() { // }, }), null, mPictureCallback); ui.run(() =&gt; { ui.pz.setText("正在保存"); ui.search.setVisibility(0); }); //camera.takePicture(myShutterCallback, null, myJpegCallback); } else { log("聚焦失败..."); } } }); ui.surface.setOnClickListener(new FGH.View.OnClickListener({ onClick: function(view) { try { //自动聚焦。 mCamera.autoFocus(new FGH.Camera.AutoFocusCallback({ onAutoFocus: function(success, camera) { if (success) { log("聚焦成功"); } else { log("聚焦成功"); }; } })); log("对焦"); } catch (e) { toastLog(e); }; }, })); //点击拍照按钮。 ui.pz.setOnClickListener(new FGH.View.OnClickListener({ onClick: function(view) { if (view.getText() == "拍照") { //自动聚焦。聚焦完成之后拍照。 mCamera.autoFocus(mAutoFocusCallback); //toastLog("点击"); }; }, })); </code></pre>

页面列表

ITEM_HTML