index.uts 11.5 KB
Newer Older
杜庆泉's avatar
杜庆泉 已提交
1 2 3 4 5
import Color from "android.graphics.Color";
import TextView from "android.widget.TextView";
import FrameLayout from "android.widget.FrameLayout";
import ViewGroup from "android.view.ViewGroup";
import Gravity from "android.view.Gravity";
杜庆泉's avatar
杜庆泉 已提交
6 7
import Runnable from 'java.lang.Runnable';
import MediaPlayer from 'android.media.MediaPlayer';
杜庆泉's avatar
杜庆泉 已提交
8
import Intent from 'android.content.Intent';
杜庆泉's avatar
杜庆泉 已提交
9

杜庆泉's avatar
杜庆泉 已提交
10
import logo from "../../static/logo.png";
杜庆泉's avatar
杜庆泉 已提交
11
import PackageManager from "android.content.pm.PackageManager";
杜庆泉's avatar
杜庆泉 已提交
12 13 14 15 16 17
import MediaStore from "android.provider.MediaStore";
import ActivityCompat from "androidx.core.app.ActivityCompat";
import Manifest from "android.Manifest";
import Activity from "android.app.Activity";
import Bitmap from "android.graphics.Bitmap";
import FileOutputStream from "java.io.FileOutputStream";
杜庆泉's avatar
杜庆泉 已提交
18

杜庆泉's avatar
杜庆泉 已提交
19 20 21 22 23 24

import Toast from 'android.widget.Toast';
import AlertDialog from 'android.app.AlertDialog';
import DialogInterface from 'android.content.DialogInterface';
import EditText from 'android.widget.EditText';

杜庆泉's avatar
杜庆泉 已提交
25
import {
26 27
	UTSAndroid
} from "io.dcloud.uts";
杜庆泉's avatar
杜庆泉 已提交
28
import array from 'android.R.array';
29

杜庆泉's avatar
杜庆泉 已提交
30

31

杜庆泉's avatar
杜庆泉 已提交
32 33 34
/**
 * 定时任务参数封装
 */
Y
yurj26 已提交
35
export type TimerOptions = {
36 37 38 39
	/**
	 * 定时任务开始的回调
	 * @res 回调参数
	 */
杜庆泉's avatar
杜庆泉 已提交
40
	start : (res : string) => void;
41 42 43 44
	/**
	* 定时任务执行的回调
	* @res 回调参数
	*/
杜庆泉's avatar
杜庆泉 已提交
45
	work : (res : string) => void;
杜庆泉's avatar
杜庆泉 已提交
46 47
};

Y
yurj26 已提交
48 49 50 51
export type TimerResult = {
	name : string;
	taskId ?: number;
};
杜庆泉's avatar
杜庆泉 已提交
52

杜庆泉's avatar
杜庆泉 已提交
53 54 55
/**
 * 执行延时任务
 */
Y
yurj26 已提交
56
export function doTimerTask(opts : TimerOptions): TimerResult {
杜庆泉's avatar
杜庆泉 已提交
57
	opts.start('doTimerTask start');
杜庆泉's avatar
杜庆泉 已提交
58
	setTimeout(function () {
杜庆泉's avatar
杜庆泉 已提交
59 60
		opts.work("doTimerTask work");
	}, 2000);
杜庆泉's avatar
杜庆泉 已提交
61

Y
yurj26 已提交
62 63 64 65 66
  const result: TimerResult = { 
    name: "doTimerTask" 
  }

	return result
杜庆泉's avatar
杜庆泉 已提交
67 68
}

杜庆泉's avatar
杜庆泉 已提交
69 70 71
/**
 * 执行周期任务
 */
Y
yurj26 已提交
72
export function doIntervalTask(opts : TimerOptions): TimerResult {
杜庆泉's avatar
杜庆泉 已提交
73 74

	let taskRet = setInterval(function () {
杜庆泉's avatar
杜庆泉 已提交
75 76 77
		opts.work("doIntervalTask work");
	}, 2000);
	opts.start('doIntervalTask start');
杜庆泉's avatar
杜庆泉 已提交
78

Y
yurj26 已提交
79 80 81 82 83 84
  const result: TimerResult = { 
    name: "doIntervalTask",
    taskId: taskRet
  }

	return result
杜庆泉's avatar
杜庆泉 已提交
85 86
}

杜庆泉's avatar
杜庆泉 已提交
87 88 89
/**
 * 清除周期任务
 */
Y
yurj26 已提交
90
export function clearIntervalTask(taskId : number): TimerResult {
杜庆泉's avatar
杜庆泉 已提交
91

杜庆泉's avatar
杜庆泉 已提交
92
	clearInterval(taskId);
Y
yurj26 已提交
93 94 95 96 97 98

  const result: TimerResult = { 
    name: "clearIntervalTask" 
  }

	return result
杜庆泉's avatar
杜庆泉 已提交
99 100 101
}


102 103 104 105
/**
 * 实现一个添加view的 Runnable类
 * 用法说明:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB
 */
106
class AddUIRunnable implements Runnable {
杜庆泉's avatar
杜庆泉 已提交
107

杜庆泉's avatar
杜庆泉 已提交
108
	override run() : void {
杜庆泉's avatar
杜庆泉 已提交
109

杜庆泉's avatar
杜庆泉 已提交
110 111 112 113 114 115
		let textView = new TextView(UTSAndroid.getUniActivity())
		textView.setText("HELLO WORLD");
		textView.textSize = 30.0.toFloat();
		textView.setBackgroundColor(Color.RED)
		textView.setTag("helloText")
		textView.setGravity(Gravity.CENTER)
杜庆泉's avatar
杜庆泉 已提交
116

杜庆泉's avatar
杜庆泉 已提交
117
		let decorView = UTSAndroid.getUniActivity()!.window.decorView;
杜庆泉's avatar
杜庆泉 已提交
118 119


杜庆泉's avatar
杜庆泉 已提交
120 121 122
		let frameContent = decorView.findViewById<FrameLayout>(android.R.id.content)
		let layoutParam = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		layoutParam.topMargin = 200;
杜庆泉's avatar
杜庆泉 已提交
123

杜庆泉's avatar
杜庆泉 已提交
124 125 126
		frameContent.addView(textView, layoutParam)

	}
杜庆泉's avatar
杜庆泉 已提交
127 128
};

129 130 131 132
/**
 * 实现一个移除view的 Runnable类
 * 用法说明:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#%E5%8C%BF%E5%90%8D%E5%86%85%E9%83%A8%E7%B1%BB
 */
杜庆泉's avatar
杜庆泉 已提交
133 134
class RemoveUIRunnable extends Runnable {

杜庆泉's avatar
杜庆泉 已提交
135 136 137 138
	override run() : void {

		let decorView = UTSAndroid.getUniActivity()!.getWindow().getDecorView();
		let frameContent = decorView.findViewById<FrameLayout>(android.R.id.content)
杜庆泉's avatar
杜庆泉 已提交
139

杜庆泉's avatar
杜庆泉 已提交
140 141
		let targetTV = frameContent.findViewWithTag<TextView>("helloText")
		frameContent.removeView(targetTV)
杜庆泉's avatar
杜庆泉 已提交
142

杜庆泉's avatar
杜庆泉 已提交
143
	}
杜庆泉's avatar
杜庆泉 已提交
144 145
};

146 147 148 149
/**
 * 实现添加view实例至decorview
 * 
 */
杜庆泉's avatar
杜庆泉 已提交
150
export function addViewToDecorView() {
杜庆泉's avatar
杜庆泉 已提交
151 152
	let uiRunable = new AddUIRunnable();
	UTSAndroid.getUniActivity()!.runOnUiThread(uiRunable)
杜庆泉's avatar
杜庆泉 已提交
153 154

}
155 156 157
/**
 * 实现从decorview上移除指定view
 */
杜庆泉's avatar
杜庆泉 已提交
158
export function removeViewToDecorView() {
杜庆泉's avatar
杜庆泉 已提交
159 160
	var uiRunable = new RemoveUIRunnable();
	UTSAndroid.getUniActivity()!.runOnUiThread(uiRunable)
杜庆泉's avatar
杜庆泉 已提交
161 162
}

杜庆泉's avatar
杜庆泉 已提交
163 164 165 166 167


/**
 * 引用资源路径
 */
杜庆泉's avatar
杜庆泉 已提交
168
export function getMetaConfig() : string {
杜庆泉's avatar
杜庆泉 已提交
169
	//
170
	let packageName = UTSAndroid.getAppContext()!.getPackageName();
杜庆泉's avatar
杜庆泉 已提交
171 172
	let appInfo = UTSAndroid.getAppContext()!.getPackageManager()!.getApplicationInfo(packageName, PackageManager.GET_META_DATA)

杜庆泉's avatar
杜庆泉 已提交
173 174
	let metaData = appInfo.metaData
	if (metaData == null) {
杜庆泉's avatar
杜庆泉 已提交
175
		return "";
杜庆泉's avatar
杜庆泉 已提交
176 177 178
	}
	let adId = metaData.getString("DCLOUD_READ_PHONE_STATE")
	if (adId == null) {
179 180
		// 没有数据,说明是自定义基座,则读取自定义基座的配置
		let customMetaId = metaData.getString("UTS_CUSTOM_LAUNCHER_META")
杜庆泉's avatar
杜庆泉 已提交
181
		if (customMetaId == null) {
182 183 184
			return ""
		}
		return "自定义基座[UTS_CUSTOM_LAUNCHER_META]:" + customMetaId;
杜庆泉's avatar
杜庆泉 已提交
185
	}
186
	// 标准基座
杜庆泉's avatar
杜庆泉 已提交
187
	return "标准基座[DCLOUD_READ_PHONE_STATE]:" + adId;
杜庆泉's avatar
杜庆泉 已提交
188 189 190 191
}



192 193 194
/**
 * 引用资源路径
 */
杜庆泉's avatar
杜庆泉 已提交
195 196
export function getLogoPath() : string {
	return logo;
杜庆泉's avatar
杜庆泉 已提交
197 198
}

打打卡夫卡's avatar
打打卡夫卡 已提交
199 200 201
/**
 * 音频播放器对象
 */
杜庆泉's avatar
杜庆泉 已提交
202
let globalPlayer : MediaPlayer | null = null;
203 204 205
/**
 * 播放asset资源中的音频
 */
杜庆泉's avatar
杜庆泉 已提交
206
export function playAssetAudio() {
杜庆泉's avatar
杜庆泉 已提交
207

208
	let assetManager = UTSAndroid.getAppContext()!.getAssets();
杜庆泉's avatar
杜庆泉 已提交
209
	let afd = assetManager.openFd("free.mp3");
杜庆泉's avatar
杜庆泉 已提交
210 211

	if (globalPlayer == null) {
打打卡夫卡's avatar
打打卡夫卡 已提交
212
		globalPlayer = new MediaPlayer();
杜庆泉's avatar
杜庆泉 已提交
213
		globalPlayer!.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
打打卡夫卡's avatar
打打卡夫卡 已提交
214 215 216
		globalPlayer!.prepare();
		globalPlayer!.start();
	}
杜庆泉's avatar
杜庆泉 已提交
217

杜庆泉's avatar
杜庆泉 已提交
218 219
}

杜庆泉's avatar
杜庆泉 已提交
220

打打卡夫卡's avatar
打打卡夫卡 已提交
221 222 223 224
/**
 * 停止播放asset资源中的音频
 */
export function stopAssetAudio() {
杜庆泉's avatar
杜庆泉 已提交
225 226

	if (globalPlayer != null) {
打打卡夫卡's avatar
打打卡夫卡 已提交
227 228 229
		globalPlayer!.stop();
		globalPlayer = null;
	}
杜庆泉's avatar
杜庆泉 已提交
230

打打卡夫卡's avatar
打打卡夫卡 已提交
231 232
}

杜庆泉's avatar
杜庆泉 已提交
233 234
export function goOtherActivity(imageDone : (event : string) => void) : boolean {

杜庆泉's avatar
杜庆泉 已提交
235
	// 检查相关权限是否已经具备
236
	if (ActivityCompat.checkSelfPermission(UTSAndroid.getUniActivity()!, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
杜庆泉's avatar
杜庆泉 已提交
237
		// 不具备权限,申请权限,并且告知用户监听失败
238
		ActivityCompat.requestPermissions(UTSAndroid.getUniActivity()!, arrayOf(Manifest.permission.CAMERA), 1002)
杜庆泉's avatar
杜庆泉 已提交
239

杜庆泉's avatar
杜庆泉 已提交
240 241
		return false;
	}
杜庆泉's avatar
杜庆泉 已提交
242 243 244 245

	UTSAndroid.onAppActivityResult((requestCode : Int, resultCode : Int, data ?: Intent) => {
		let eventName = "onAppActivityResult  -  requestCode:" + requestCode + " -resultCode:" + resultCode + " -data:" + JSON.stringify(data);
		console.log(eventName);
246
		if ((requestCode == 1001) && (resultCode == Activity.RESULT_OK)) {
杜庆泉's avatar
杜庆泉 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259
			if (data != null) {
				let bundle = data.getExtras();
				let mImageBitmap = bundle!.get("data") as Bitmap;
				let bitmapPath = UTSAndroid.getUniActivity()!.getExternalCacheDir()!.getPath() + "/photo.png"
				console.log(bitmapPath);
				try {
					mImageBitmap.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(bitmapPath))
				} catch (e) {
				}
				imageDone(bitmapPath);

			}
		}
260
	});
杜庆泉's avatar
杜庆泉 已提交
261

杜庆泉's avatar
杜庆泉 已提交
262 263
	let takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	//resolveActivity 返回可处理 Intent 的第一个 Activity 组件
264 265
	if (takePictureIntent.resolveActivity(UTSAndroid.getUniActivity()!.getPackageManager()) != null) {
		UTSAndroid.getUniActivity()!.startActivityForResult(takePictureIntent, 1001);
杜庆泉's avatar
杜庆泉 已提交
266
	}
杜庆泉's avatar
杜庆泉 已提交
267

杜庆泉's avatar
杜庆泉 已提交
268
	return true;
杜庆泉's avatar
杜庆泉 已提交
269

杜庆泉's avatar
杜庆泉 已提交
270
}
杜庆泉's avatar
杜庆泉 已提交
271 272


273 274 275 276
/**
 * 初始化应用生命周期监听
 * 
 */
杜庆泉's avatar
杜庆泉 已提交
277
export function initAppLifecycle(onLifecycleChange : (event : string) => void) {
杜庆泉's avatar
杜庆泉 已提交
278

杜庆泉's avatar
杜庆泉 已提交
279

280 281 282 283
	/**
	 * application 内存不足的回调函数
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onapptrimmemory
	 */
杜庆泉's avatar
杜庆泉 已提交
284
	UTSAndroid.onAppTrimMemory((level : Number) => {
285 286
		let eventName = "onAppTrimMemory - " + level;
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
287
		console.log(eventName);
288
	});
杜庆泉's avatar
杜庆泉 已提交
289

290 291 292 293
	/**
	 * application 状态改变的回调函数
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onAppConfigChange
	 */
杜庆泉's avatar
杜庆泉 已提交
294
	UTSAndroid.onAppConfigChange((ret : UTSJSONObject) => {
295 296
		let eventName = "onAppConfigChange - " + JSON.stringify(ret);
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
297
		console.log(eventName);
298
	});
杜庆泉's avatar
杜庆泉 已提交
299 300


301 302 303 304
	/**
	 * activity 销毁生命周期回调
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitydestroy
	 */
杜庆泉's avatar
杜庆泉 已提交
305
	UTSAndroid.onAppActivityDestroy(() => {
杜庆泉's avatar
杜庆泉 已提交
306
		let eventName = "onAppActivityDestroy";
杜庆泉's avatar
杜庆泉 已提交
307
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
308 309 310 311
		console.log(eventName);
	});


312 313 314 315
	/**
	 * activity 失去焦点生命周期回调
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitypause
	 */
杜庆泉's avatar
杜庆泉 已提交
316 317
	UTSAndroid.onAppActivityPause(() => {
		let eventName = "onAppActivityPause";
杜庆泉's avatar
杜庆泉 已提交
318
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
319 320
		console.log(eventName);
	});
321 322 323 324
	/**
	 * activity 得到焦点的周期回调
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivityresume
	 */
杜庆泉's avatar
杜庆泉 已提交
325
	UTSAndroid.onAppActivityResume(() => {
杜庆泉's avatar
杜庆泉 已提交
326
		let eventName = "onAppActivityResume";
杜庆泉's avatar
杜庆泉 已提交
327
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
328 329
		console.log(eventName);
	});
330 331 332 333
	/**
	 * activity 回退物理按键事件回调
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivityback
	 */
杜庆泉's avatar
杜庆泉 已提交
334
	UTSAndroid.onAppActivityBack(() => {
杜庆泉's avatar
杜庆泉 已提交
335
		let eventName = "onAppActivityBack";
杜庆泉's avatar
杜庆泉 已提交
336
		onLifecycleChange(eventName);
杜庆泉's avatar
杜庆泉 已提交
337 338
		console.log(eventName);
	});
杜庆泉's avatar
杜庆泉 已提交
339 340 341

}

342 343 344 345 346 347 348 349 350 351

/**
 * 取消注册生命周期函数
 */
export function unRegLifecycle() {


	/**
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onapptrimmemory
	 */
352
	UTSAndroid.offAppTrimMemory();
杜庆泉's avatar
杜庆泉 已提交
353

354 355 356
	/**
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onAppConfigChange
	 */
357
	UTSAndroid.offAppConfigChange();
杜庆泉's avatar
杜庆泉 已提交
358

359 360 361
	/**
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitydestroy
	 */
杜庆泉's avatar
杜庆泉 已提交
362 363
	UTSAndroid.offAppActivityDestroy();

364 365 366
	/**
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitypause
	 */
杜庆泉's avatar
杜庆泉 已提交
367 368
	UTSAndroid.offAppActivityPause();

369 370 371
	/**
	 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivityresume
	 */
杜庆泉's avatar
杜庆泉 已提交
372
	UTSAndroid.offAppActivityResume();
373 374 375
	/**
	 * activity 回退物理按键事件回调
	 */
杜庆泉's avatar
杜庆泉 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	UTSAndroid.offAppActivityBack();

}

/**
 * add since 2023-06-19 
 * 新增传参测试用例
 */
export function inputArray(input : Array<string>) : boolean {

	let inputStr = JSON.stringify(input)

	if ('["a","b","c"]' == inputStr) {
		return true
	}
	return false

}

export type ParamOptions = {
	title : string,
	array : Array<string>
}
399

杜庆泉's avatar
杜庆泉 已提交
400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
export function inputParam(option : ParamOptions) : boolean {
	let inputStr = JSON.stringify(option)
	if ('{"array":[1,2,3],"title":"hello"}' == inputStr) {
		return true
	}
	return false
}

export function returnArray() : Array<string> {
	return ['1', '2', '3']
}

export function returnParam() : ParamOptions {

	let ret : ParamOptions = {
		title: "returnParam",
		array: ['1', '2', '3']
	}
	return ret

}

export type ParamCallback = (res : ParamOptions) => void
export type ArrayCallback = (res : Array<string>) => void

export function callbackArray(callback : ArrayCallback) {
	callback(['8', '8', '8'])
}


export function callbackParam(callback : ParamCallback) {
	let ret : ParamOptions = {
		title: "callbackParam",
		array: ['4', '5', '6']
	}
	callback(ret)
杜庆泉's avatar
杜庆泉 已提交
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
}
/**
 * 打印测试方法
 */
export function logStrTest() {
	console.log("logStrTest 字符串打印测试")
}

export function logFloatTest() {
	console.log(3.1415926)
}
export function logIntTest() {
	console.log(2023)
}

export function logObjectTest(){
	let ret : ParamOptions = {
		title: "logObjectTest",
		array: ['1', '2', '3']
	}
	console.log(ret)
}


export function logFunctionTest(){
	
	let testFun = function(){
		console.log("testFun")
	}
	console.log(testFun)
}

杜庆泉's avatar
杜庆泉 已提交
468 469 470 471 472 473 474 475 476 477

export function logDateTest(){
	console.log(new Date())
}

export function logDateCombineTest(){
	console.log("现在的日期是",new Date()," 以上是日期信息")
}


杜庆泉's avatar
杜庆泉 已提交
478 479 480 481 482 483 484
/**
 * 
 */
export function quitApp(){
	UTSAndroid.quitApp()
}

杜庆泉's avatar
杜庆泉 已提交
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
export class User {  

    private name : string;  
    private age : Int;  

    constructor(hostP : string, port : Int) {  
        this.name = hostP;  
        this.age = port;  
    }  
	
	describeSelf():string{
		let text = "name = " + this.name + ";age = " + this.age
		return text
	}
}

杜庆泉's avatar
杜庆泉 已提交
501 502