【autojs】Auto.js Pro安卓设备相机拍照脚本源代码

"ui";

/**
 *完成时间: 2019年4月2日 下午11:55:30
 *测试机型: PD1813D
 *Auto.js版本: Pro 7.0.0-4
 *屏幕: 1080*2280
 *API: 27
 *备注: 。
 **/

//此代码由飞云脚本圈整理提供(www.feiyunjs.com)

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,
};



ui.layout(
    <vertical>
        <frame>
            <android.view.SurfaceView id="surface"/>
            <button id="pz" w="auto"h="auto" text="拍照" layout_gravity="bottom|center_horizontal"/>
            <progressbar id="search" w="auto" h="auto" layout_gravity="center"/>
        </frame>
    </vertical>
);

ui.run(() => {
    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("有错误发生");
});

//toastLog(mCamera.getParameters());

if (parseInt(device.release) >= 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&SurfaceHolder的创建完成回调
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();
        } catch (e) {
            throw "Error setting camera preview: " + e.getMessage();
        }
    },
    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);

    },
}));




var mPictureCallback = new FGH.Camera.PictureCallback({
    onPictureTaken: function(data, camera) {
        camera.startPreview();
        //data为bytes数据;
        //toastLog("开始");
        //resource = FGH.BitmapFactory.decodeByteArray(data, 0, data.length);
        //matrix = new FGH.Matrix();
        // 拍出来的照片默认是横向的
        //matrix.setRotate(90);
        // 裁剪
        //bitmap = FGH.Bitmap.createBitmap(resource, startX, startY, newWidth, newHeight, matrix, false); 
        //log(saveimg("./IMG.png", resource));
        //resource.recycle();
        let img = images.fromBytes(data);
        //保存图片用的时间太长了。
        images.save(img, "./myImg.png", "png", 100);
        img.recycle();
        //mCamera.stopPreview();
        toastLog("图片保存成功");
        //camera.startPreview();
        ui.run(() => {
            ui.pz.setText("拍照");
            ui.search.setVisibility(8);
        });

    },
});

//点击拍照按钮。
ui.pz.setOnClickListener(new FGH.View.OnClickListener({
    onClick: function(view) {
        if (view.getText() == "拍照") {
            mCamera.takePicture(null, null, mPictureCallback);
            //mCamera.stopPreview();

            /*
            //这个有拍照声音。
            mCamera.takePicture(new FGH.Camera.ShutterCallback({
                //onShutter: function() {
                //    },
            }), null, mPictureCallback);
            */
            //mCamera.startPreview();
            //toastLog("点击");
            ui.run(() => {
                view.setText("正在保存");
                ui.search.setVisibility(0);
            });
        };
    },
}));


//存画
function saveimg(path, bitmap) {
    path = files.path(path);
    log(path);
    try {
        var file = new java.io.File(path);
        var fileOutput = new java.io.FileOutputStream(file);
        bitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, fileOutput);
        return true;
    } catch (e) {
        return false;
    }
}

说明

本文提供的代码仅供参考。
可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作。
与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

开发文档

Auto.js Pro开发文档优化版
文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。
模板、样式、generator来自Node.js。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

相关教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

你可能感兴趣的:(脚本源码)