一、SurfaceView容器
碰到的問(wèn)題:無(wú)法基于容器的鏡像翻轉(zhuǎn)
1.1、創(chuàng)建容器對(duì)象(index.vue 文件中)
NVLoad() : LinearLayout {
//必須實(shí)現(xiàn)(必須創(chuàng)建一個(gè)容器)
let contentLayout = new LinearLayout(this.$androidContext);
contentLayout.setOrientation(LinearLayout.VERTICAL);
// 創(chuàng)建按鈕對(duì)象
this.getCamera().forEach((button) => {
contentLayout.addView(button as Button);
})
// 創(chuàng)建surfaceView容器
surfaceView = new SurfaceView(this.$androidContext);
let layoutParams = ViewGroup.LayoutParams(
500,
600
)
contentLayout.addView(textureView, layoutParams)
return contentLayout;
}
methods: {
getCamera() : Button[] {
const numberOfCameras = Camera.getNumberOfCameras(); // 獲取攝像頭個(gè)數(shù)
const cameraList : Button[] = [];
for (let i = 0; i < numberOfCameras; i++) { // 從創(chuàng)建對(duì)應(yīng)的按鈕
let button = new Button(this.$androidContext)
button.setText(`攝像頭${i}`);
button.setTag("centerButton");
button.setOnClickListener(new ButtonClickListsner(i));
cameraList.push(button);
};
return cameraList;
}
}
1.2、創(chuàng)建點(diǎn)擊事件
class ButtonClickListsner extends View.OnClickListener {
cameraId = 0
constructor(id : number) {
super();
this.cameraId = id;
}
override onClick(v ?: View) {
console.log(this.cameraId)
openCamera(this.cameraId)
}
}
1.3、打開(kāi)對(duì)應(yīng)攝像頭
function openCamera(id: any) {
if (camera !== null) {
(camera as Camera).stopPreview();
(camera as Camera).release(); // 釋放攝像頭
camera = null;
}
try {
camera = Camera.open(id as Int);
(camera as Camera).setPreviewDisplay((surfaceView as SurfaceView).getHolder());
(camera as Camera).setDisplayOrientation(0); // 設(shè)置旋轉(zhuǎn)角度 0 90 180 270
(camera as Camera).startPreview(); // 啟動(dòng)預(yù)覽
} catch (e) {
console.error(e)
}
}
1.4、完整代碼
<template>
<view class="defaultStyle"></view>
</template>
<script lang="uts">
import View from 'android.view.View'
import Button from 'android.widget.Button'
import LinearLayout from 'android.widget.LinearLayout';
import Camera from "android.hardware.Camera";
import SurfaceView from 'android.view.SurfaceView';
import ViewGroup from "android.view.ViewGroup";
import Surface from "android.view.Surface";
let surfaceView : SurfaceView | null = null;
let camera : Camera | null = null;
class ButtonClickListsner extends View.OnClickListener {
cameraId = 0
constructor(id : number) {
super();
this.cameraId = id;
}
override onClick(v ?: View) {
console.log(this.cameraId)
openCamera(this.cameraId)
}
}
function openCamera(id: any) {
if (camera !== null) {
(camera as Camera).stopPreview();
(camera as Camera).release(); // 釋放攝像頭
camera = null;
}
try {
camera = Camera.open(id as Int);
(camera as Camera).setPreviewDisplay((surfaceView as SurfaceView).getHolder());
(camera as Camera).setDisplayOrientation(0); // 設(shè)置旋轉(zhuǎn)角度 0 90 180 270
(camera as Camera).startPreview(); // 啟動(dòng)預(yù)覽
} catch (e) {
console.error(e)
}
}
export default {
name: "camera-temps1",
data() {
return {}
},
NVLoad() : LinearLayout {
//必須實(shí)現(xiàn)(必須創(chuàng)建一個(gè)容器)
let contentLayout = new LinearLayout(this.$androidContext);
contentLayout.setOrientation(LinearLayout.VERTICAL);
// 創(chuàng)建按鈕對(duì)象
this.getCamera().forEach((button) => {
contentLayout.addView(button as Button);
})
// 創(chuàng)建surfaceView容器
surfaceView = new SurfaceView(this.$androidContext);
let layoutParams = ViewGroup.LayoutParams(
500,
600
)
contentLayout.addView(textureView, layoutParams)
return contentLayout;
},
methods: {
getCamera() : Button[] {
const numberOfCameras = Camera.getNumberOfCameras(); // 獲取攝像頭個(gè)數(shù)
const cameraList : Button[] = [];
for (let i = 0; i < numberOfCameras; i++) { // 從創(chuàng)建對(duì)應(yīng)的按鈕
let button = new Button(this.$androidContext)
button.setText(`攝像頭${i}`);
button.setTag("centerButton");
button.setOnClickListener(new ButtonClickListsner(i));
cameraList.push(button);
};
return cameraList;
}
}
}
}
</script>
二、TextureView(容器)
<template>
<view class="defaultStyle">
</view>
</template>
<script lang="uts">
import View from 'android.view.View'
import Button from 'android.widget.Button'
import LinearLayout from 'android.widget.LinearLayout';
import Camera from "android.hardware.Camera";
import SurfaceView from 'android.view.SurfaceView';
import ViewGroup from "android.view.ViewGroup";
import TextureView from "android.view.TextureView";
let camera : Camera | null = null;
let textureView : TextureView | null = null;
class PreviewCallback extends Camera.PreviewCallback {
constructor() { super() }
override onPreviewFrame(data : ByteArray, camera : Camera) {
console.log(data)
}
}
class ButtonClickListsner extends View.OnClickListener {
cameraId = 0
constructor(id : number) {
super();
this.cameraId = id;
}
override onClick(v ?: View) {
console.log(this.cameraId)
openCamera(this.cameraId)
}
}
function openCamera(id : any) {
if (camera !== null) {
(camera as Camera).stopPreview();
(camera as Camera).release();
camera = null;
}
try {
camera = Camera.open(id as Int);
// 設(shè)置鏡像
(textureView as TextureView).setRotationY((180 as Number).toFloat());
(camera as Camera).setPreviewTexture((textureView as TextureView).getSurfaceTexture());
// 設(shè)置旋轉(zhuǎn)方向
(camera as Camera).setDisplayOrientation(0);
(camera as Camera).startPreview();
} catch (e) {
console.error(e)
}
}
export default {
name: "camera-temps1",
data() {
return {}
},
NVLoad() : LinearLayout {
//必須實(shí)現(xiàn)
let contentLayout = new LinearLayout(this.$androidContext);
contentLayout.setOrientation(LinearLayout.VERTICAL);
// 添加按鈕
this.getCamera().forEach((button) => {
contentLayout.addView(button as Button);
})
// TextureView 中this.$androidContext 必須加 !號(hào)
textureView = new TextureView(this.$androidContext!);
let layoutParams = ViewGroup.LayoutParams(
500,
600
);
contentLayout.addView(textureView, layoutParams);
return contentLayout;
},
methods: {
getCamera() : Button[] {
const numberOfCameras = Camera.getNumberOfCameras();
const cameraList : Button[] = [];
for (let i = 0; i < numberOfCameras; i++) {
let button = new Button(this.$androidContext)
button.setText(`攝像頭${i}`);
button.setTag("centerButton");
button.setOnClickListener(new ButtonClickListsner(i))
cameraList.push(button)
}
return cameraList;
}
}
}
</script>
<style>
.defaultStyle {
width: 750rpx;
height: 240rpx;
background-color: red;
}
</style>
三、權(quán)限請(qǐng)求(index.uts)
import Manifest from "android.Manifest";
import Surface from "android.view.Surface";
import Camera from "android.hardware.Camera";
export function getquanxian() {
let permissionNeed = [Manifest.permission.CAMERA];
UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissionNeed, function (allRight : boolean, _ : string[]) {
console.log("用戶同意了權(quán)限", allRight)
}, function (_ : boolean, _ : string[]) {
console.log("用戶拒絕了部分權(quán)限:")
})
}