uniapp 扫码功能

文件:pages/index/index.vue

<template>
    <view class="scan-content">
        <text class="scan-title" style="margin: 1rem 0">{{ title }}</text>
        <image class="scan-logo" src="/static/logo.png"></image>
        <view class="scan-ubutton">
            <button type="primary" :disabled="!canScan" @click="scan">开始扫码</button>
            <button type="warn" :disabled="!canRemove" @click="removeResult">清空结果</button>
        </view>
        <view class="scan-result" scroll-y="true">
            <textarea
                placeholder-style="color:#4747477a"
                placeholder="扫码结果..."
                :maxlength="-1"
                auto-height
                :value="scanResult"
            />
        </view>
    </view>
</template>

<script>
import permision from '@/common/permission.js';
export default {
    data() {
        return {
            title: '扫码功能',
            canScan: true,
            canRemove: false,
            scanResult: '',
        };
    },
    onLoad() {},
    methods: {
        async scan() {
            // #ifdef APP-PLUS
            let status = await this.checkPermission();
            if (status !== 1) return;
            // #endif
            uni.scanCode({
                success: (res) => {
                    let scanType = `条码类型:${res.scanType} (${this.getCodeType(res.scanType)})`;
                    let result = `条码内容:${res.result}`;
                    this.scanResult = scanType + '\n' + result;
                    this.canRemove = true;
                },
                fail: (err) => {
                    this.scanResult = JSON.stringify(err);
                    this.canRemove = true;
                },
            });
        },
        removeResult() {
            if (this.canRemove) {
                this.scanResult = '';
                this.canRemove = false;
            }
        },
        getCodeType(scanType) {
            switch (scanType) {
                case 'QR_CODE':
                    return 'QR二维码';
                case 'EAN_13':
                    return 'EAN条形码标准版';
                case 'EAN_8':
                    return 'ENA条形码简版';
                case 'AZTEC':
                    return 'Aztec二维码';
                case 'DATA_MATRIX':
                    return 'Data Matrix二维码';
                case 'UPC_A':
                    return 'UPC条形码标准版';
                case 'UPC_E':
                    return 'UPC条形码缩短版';
                case 'CODABAR':
                    return 'Codabar条形码';
                case 'CODE_25':
                    return '交叉25条形码';
                case 'CODE_39':
                    return 'Code39条形码';
                case 'CODE_93':
                    return 'Code93条形码';
                case 'CODE_128':
                    return 'Code128条形码';
                case 'PDF_417':
                    return 'PDF 417二维条码';
                default:
                    return '未知';
            }
        },
        // #ifdef APP-PLUS
        async checkPermission(code) {
            let status = permision.isIOS
                ? await permision.requestIOS('camera')
                : await permision.requestAndroid('android.permission.CAMERA');

            if (status === null || status === 1) {
                status = 1;
            } else {
                uni.showModal({
                    content: '需要相机权限',
                    confirmText: '设置',
                    success: function (res) {
                        if (res.confirm) {
                            permision.gotoAppSetting();
                        }
                    },
                });
            }
            return status;
        },
        // #endif
    },
};
</script>

<style>
.scan-content {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

.scan-title {
    font-size: 36rpx;
    color: #8f8f94;
}

.scan-logo {
    height: 100rpx;
    width: 100rpx;
    margin-left: auto;
    margin-right: auto;
    margin-bottom: 50rpx;
}
.scan-ubutton {
    display: flex;
}
.scan-ubutton button {
    margin: 0 0.3rem;
}

.scan-result {
    margin: 1rem 0;
    padding: 0.5rem 0.4rem;
    border: 1px solid #bde1f8;
    border-radius: 0.5rem;
    min-height: 300rpx;
    width: 80%;
    color: rgb(70, 128, 255);
}
</style>

文件:common/permission.js

/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启

var isIOS;

function album() {
    var result = 0;
    var PHPhotoLibrary = plus.ios.import('PHPhotoLibrary');
    var authStatus = PHPhotoLibrary.authorizationStatus();
    if (authStatus === 0) {
        result = null;
    } else if (authStatus == 3) {
        result = 1;
    } else {
        result = 0;
    }
    plus.ios.deleteObject(PHPhotoLibrary);
    return result;
}

function camera() {
    var result = 0;
    var AVCaptureDevice = plus.ios.import('AVCaptureDevice');
    var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
    if (authStatus === 0) {
        result = null;
    } else if (authStatus == 3) {
        result = 1;
    } else {
        result = 0;
    }
    plus.ios.deleteObject(AVCaptureDevice);
    return result;
}

function location() {
    var result = 0;
    var cllocationManger = plus.ios.import('CLLocationManager');
    var enable = cllocationManger.locationServicesEnabled();
    var status = cllocationManger.authorizationStatus();
    if (!enable) {
        result = 2;
    } else if (status === 0) {
        result = null;
    } else if (status === 3 || status === 4) {
        result = 1;
    } else {
        result = 0;
    }
    plus.ios.deleteObject(cllocationManger);
    return result;
}

function push() {
    var result = 0;
    var UIApplication = plus.ios.import('UIApplication');
    var app = UIApplication.sharedApplication();
    var enabledTypes = 0;
    if (app.currentUserNotificationSettings) {
        var settings = app.currentUserNotificationSettings();
        enabledTypes = settings.plusGetAttribute('types');
        if (enabledTypes == 0) {
            result = 0;
            console.log('推送权限没有开启');
        } else {
            result = 1;
            console.log('已经开启推送功能!');
        }
        plus.ios.deleteObject(settings);
    } else {
        enabledTypes = app.enabledRemoteNotificationTypes();
        if (enabledTypes == 0) {
            result = 3;
            console.log('推送权限没有开启!');
        } else {
            result = 4;
            console.log('已经开启推送功能!');
        }
    }
    plus.ios.deleteObject(app);
    plus.ios.deleteObject(UIApplication);
    return result;
}

function contact() {
    var result = 0;
    var CNContactStore = plus.ios.import('CNContactStore');
    var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
    if (cnAuthStatus === 0) {
        result = null;
    } else if (cnAuthStatus == 3) {
        result = 1;
    } else {
        result = 0;
    }
    plus.ios.deleteObject(CNContactStore);
    return result;
}

function record() {
    var result = null;
    var avaudiosession = plus.ios.import('AVAudioSession');
    var avaudio = avaudiosession.sharedInstance();
    var status = avaudio.recordPermission();
    console.log('permissionStatus:' + status);
    if (status === 1970168948) {
        result = null;
    } else if (status === 1735552628) {
        result = 1;
    } else {
        result = 0;
    }
    plus.ios.deleteObject(avaudiosession);
    return result;
}

function calendar() {
    var result = null;
    var EKEventStore = plus.ios.import('EKEventStore');
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
    if (ekAuthStatus == 3) {
        result = 1;
        console.log('日历权限已经开启');
    } else {
        console.log('日历权限没有开启');
    }
    plus.ios.deleteObject(EKEventStore);
    return result;
}

function memo() {
    var result = null;
    var EKEventStore = plus.ios.import('EKEventStore');
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
    if (ekAuthStatus == 3) {
        result = 1;
        console.log('备忘录权限已经开启');
    } else {
        console.log('备忘录权限没有开启');
    }
    plus.ios.deleteObject(EKEventStore);
    return result;
}

function requestIOS(permissionID) {
    return new Promise((resolve, reject) => {
        switch (permissionID) {
            case 'push':
                resolve(push());
                break;
            case 'location':
                resolve(location());
                break;
            case 'record':
                resolve(record());
                break;
            case 'camera':
                resolve(camera());
                break;
            case 'album':
                resolve(album());
                break;
            case 'contact':
                resolve(contact());
                break;
            case 'calendar':
                resolve(calendar());
                break;
            case 'memo':
                resolve(memo());
                break;
            default:
                resolve(0);
                break;
        }
    });
}

function requestAndroid(permissionID) {
    return new Promise((resolve, reject) => {
        plus.android.requestPermissions(
            [permissionID],
            function (resultObj) {
                var result = 0;
                for (var i = 0; i < resultObj.granted.length; i++) {
                    var grantedPermission = resultObj.granted[i];
                    console.log('已获取的权限:' + grantedPermission);
                    result = 1;
                }
                for (var i = 0; i < resultObj.deniedPresent.length; i++) {
                    var deniedPresentPermission = resultObj.deniedPresent[i];
                    console.log('拒绝本次申请的权限:' + deniedPresentPermission);
                    result = 0;
                }
                for (var i = 0; i < resultObj.deniedAlways.length; i++) {
                    var deniedAlwaysPermission = resultObj.deniedAlways[i];
                    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
                    result = -1;
                }
                resolve(result);
            },
            function (error) {
                console.log('result error: ' + error.message);
                resolve({
                    code: error.code,
                    message: error.message,
                });
            },
        );
    });
}

function gotoAppPermissionSetting() {
    if (permission.isIOS) {
        var UIApplication = plus.ios.import('UIApplication');
        var application2 = UIApplication.sharedApplication();
        var NSURL2 = plus.ios.import('NSURL');
        var setting2 = NSURL2.URLWithString('app-settings:');
        application2.openURL(setting2);
        plus.ios.deleteObject(setting2);
        plus.ios.deleteObject(NSURL2);
        plus.ios.deleteObject(application2);
    } else {
        var Intent = plus.android.importClass('android.content.Intent');
        var Settings = plus.android.importClass('android.provider.Settings');
        var Uri = plus.android.importClass('android.net.Uri');
        var mainActivity = plus.android.runtimeMainActivity();
        var intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        var uri = Uri.fromParts('package', mainActivity.getPackageName(), null);
        intent.setData(uri);
        mainActivity.startActivity(intent);
    }
}

const permission = {
    get isIOS() {
        return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios');
    },
    requestIOS: requestIOS,
    requestAndroid: requestAndroid,
    gotoAppSetting: gotoAppPermissionSetting,
};

export default permission;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佚名程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值