index.uts 11.7 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 array from 'android.R.array';
杜庆泉's avatar
杜庆泉 已提交
26
import File from 'java.io.File';
27

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

29

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

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

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

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

	return result
杜庆泉's avatar
杜庆泉 已提交
65 66
}

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

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

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

	return result
杜庆泉's avatar
杜庆泉 已提交
83 84
}

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

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

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

	return result
杜庆泉's avatar
杜庆泉 已提交
97 98 99
}


100 101 102 103
/**
 * 实现一个添加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
 */
104
class AddUIRunnable implements Runnable {
杜庆泉's avatar
杜庆泉 已提交
105

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

杜庆泉's avatar
杜庆泉 已提交
108 109 110 111 112 113
		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
杜庆泉 已提交
114

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


杜庆泉's avatar
杜庆泉 已提交
118 119 120
		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
杜庆泉 已提交
121

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

	}
杜庆泉's avatar
杜庆泉 已提交
125 126
};

127 128 129 130
/**
 * 实现一个移除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
杜庆泉 已提交
131 132
class RemoveUIRunnable extends Runnable {

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

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

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

杜庆泉's avatar
杜庆泉 已提交
141
	}
杜庆泉's avatar
杜庆泉 已提交
142 143
};

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

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

杜庆泉's avatar
杜庆泉 已提交
161 162 163 164 165


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

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



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

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

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

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

杜庆泉's avatar
杜庆泉 已提交
216 217
}

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

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

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

打打卡夫卡's avatar
打打卡夫卡 已提交
229 230
}

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

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

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

	UTSAndroid.onAppActivityResult((requestCode : Int, resultCode : Int, data ?: Intent) => {
		let eventName = "onAppActivityResult  -  requestCode:" + requestCode + " -resultCode:" + resultCode + " -data:" + JSON.stringify(data);
		console.log(eventName);
244
		if ((requestCode == 1001) && (resultCode == Activity.RESULT_OK)) {
杜庆泉's avatar
杜庆泉 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257
			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);

			}
		}
258
	});
杜庆泉's avatar
杜庆泉 已提交
259

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

杜庆泉's avatar
杜庆泉 已提交
266
	return true;
杜庆泉's avatar
杜庆泉 已提交
267

杜庆泉's avatar
杜庆泉 已提交
268
}
杜庆泉's avatar
杜庆泉 已提交
269 270


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

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

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

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


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


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

}

340 341 342 343 344 345 346 347 348 349

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


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

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

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

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

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

杜庆泉's avatar
杜庆泉 已提交
398 399
export function inputParam(option : ParamOptions) : boolean {
	let inputStr = JSON.stringify(option)
杜庆泉's avatar
杜庆泉 已提交
400 401
	console.log(inputStr)
	if ('{"array":["1","2","3"],"title":"hello"}' == inputStr) {
杜庆泉's avatar
杜庆泉 已提交
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
		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
杜庆泉 已提交
435 436 437 438 439 440 441 442
}
/**
 * 打印测试方法
 */
export function logStrTest() {
	console.log("logStrTest 字符串打印测试")
}

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

杜庆泉's avatar
杜庆泉 已提交
444 445 446 447 448
export function logFloatTest() {
	console.log(3.1415926)
}
export function logIntTest() {
	console.log(2023)
杜庆泉's avatar
杜庆泉 已提交
449 450
	console.log(2023.0)
	console.log(2023.002)
杜庆泉's avatar
杜庆泉 已提交
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
}

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
杜庆泉 已提交
470

杜庆泉's avatar
杜庆泉 已提交
471 472 473 474 475

export function logFileTest(){
	console.log(new File("/sdcard/temp/1.txt"))
}

杜庆泉's avatar
杜庆泉 已提交
476 477 478 479 480 481 482 483 484
export function logDateTest(){
	console.log(new Date())
}

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


杜庆泉's avatar
杜庆泉 已提交
485 486 487 488
/**
 * 
 */
export function quitApp(){
杜庆泉's avatar
杜庆泉 已提交
489
	UTSAndroid.exit()
杜庆泉's avatar
杜庆泉 已提交
490 491
}

杜庆泉's avatar
杜庆泉 已提交
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
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
杜庆泉 已提交
508 509