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"; import Runnable from 'java.lang.Runnable'; import MediaPlayer from 'android.media.MediaPlayer'; import Intent from 'android.content.Intent'; import logo from "../../static/logo.png"; import PackageManager from "android.content.pm.PackageManager"; 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"; import Toast from 'android.widget.Toast'; import AlertDialog from 'android.app.AlertDialog'; import DialogInterface from 'android.content.DialogInterface'; import EditText from 'android.widget.EditText'; import R from 'io.dcloud.uni_modules.uts_advance.R'; import { onAppActivityDestroy, onAppActivityPause, onAppActivityResume, onAppActivityBack, onAppActivityResult, onAppTrimMemory, onAppConfigChange, getUniActivity, getAppContext } from "io.dcloud.uts.android"; /** * 定时任务参数封装 */ type TimerOptions = { /** * 定时任务开始的回调 * @res 回调参数 */ start: (res: string) => void; /** * 定时任务执行的回调 * @res 回调参数 */ work: (res: string) => void; }; /** * 执行延时任务 */ export function doTimerTask(opts:TimerOptions) { opts.start('doTimerTask start'); setTimeout(function() { opts.work("doTimerTask work"); }, 2000); return { name: "doTimerTask" }; } /** * 执行周期任务 */ export function doIntervalTask(opts:TimerOptions) { let taskRet = setInterval(function() { opts.work("doIntervalTask work"); }, 2000); opts.start('doIntervalTask start'); return { name: "doIntervalTask",taskId:taskRet}; } /** * 清除周期任务 */ export function clearIntervalTask(taskId:number) { clearInterval(taskId); return { name: "clearIntervalTask"}; } /** * 实现一个添加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 */ class AddUIRunnable extends Runnable { override run():void { let textView = new TextView(getUniActivity()) textView.setText("HELLO WORLD"); textView.textSize = 30.0.toFloat(); textView.setBackgroundColor(Color.RED) textView.setTag("helloText") textView.setGravity(Gravity.CENTER) let decorView = getUniActivity()!.window.decorView; let frameContent = decorView.findViewById(android.R.id.content) let layoutParam = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); layoutParam.topMargin = 200; frameContent.addView(textView,layoutParam) } }; /** * 实现一个移除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 */ class RemoveUIRunnable extends Runnable { override run():void { let decorView = getUniActivity()!.getWindow().getDecorView(); let frameContent = decorView.findViewById(android.R.id.content) let targetTV = frameContent.findViewWithTag("helloText") frameContent.removeView(targetTV) } }; /** * 实现添加view实例至decorview * */ export function addViewToDecorView() { let uiRunable = new AddUIRunnable(); getUniActivity()!.runOnUiThread(uiRunable) } /** * 实现从decorview上移除指定view */ export function removeViewToDecorView() { var uiRunable = new RemoveUIRunnable(); getUniActivity()!.runOnUiThread(uiRunable) } /** * 用户输入对话框监听器 */ class DialogListener extends DialogInterface.OnClickListener{ inputET:EditText callback:UTSCallback constructor(et:EditText,cb:UTSCallback){ super(); this.callback = cb; this.inputET = et; } override onClick(_dialog:DialogInterface,_arg1:Int ):void { //数据获取 let input = this.inputET.getText().toString() this.callback(input); Toast.makeText(getUniActivity(),input, Toast.LENGTH_LONG).show(); } } /** * Dialog ui任务封装 */ class DialogUIRunnable extends Runnable { callback:UTSCallback constructor(success:UTSCallback){ super(); this.callback = success } override run():void { let et = new EditText(getUniActivity()); et.setText("127.0.0.1"); new AlertDialog.Builder(getUniActivity()).setTitle("请输入IP地址") .setIcon(android.R.drawable.ic_dialog_info).setView(et) .setPositiveButton("确定", new DialogListener(et,this.callback)) .setNegativeButton("取消", null).show(); } }; /** * 通过对话框同步获取用户输入 */ export function getUserInput(success: (res: string) => void) { let uiRunable = new DialogUIRunnable(success); getUniActivity()!.runOnUiThread(uiRunable) } /** * 引用资源路径 */ export function getMetaConfig(): string { // let packageName = getAppContext()!.getPackageName(); let appInfo = getAppContext()!.getPackageManager()!.getApplicationInfo(packageName,PackageManager.GET_META_DATA) let metaData = appInfo.metaData if (metaData == null) { return ""; } let adId = metaData.getString("DCLOUD_READ_PHONE_STATE") if (adId == null) { // 没有数据,说明是自定义基座,则读取自定义基座的配置 let customMetaId = metaData.getString("UTS_CUSTOM_LAUNCHER_META") if(customMetaId == null){ return "" } return "自定义基座[UTS_CUSTOM_LAUNCHER_META]:" + customMetaId; } // 标准基座 return "标准基座[DCLOUD_READ_PHONE_STATE]:" + adId; } /** * 引用资源路径 */ export function getLogoPath(): string { return logo; } /** * 音频播放器对象 */ let globalPlayer:MediaPlayer| null = null; /** * 播放asset资源中的音频 */ export function playAssetAudio() { let assetManager = getAppContext()!.getAssets(); let afd = assetManager.openFd("free.mp3"); if(globalPlayer == null){ globalPlayer = new MediaPlayer(); globalPlayer!.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength()); globalPlayer!.prepare(); globalPlayer!.start(); } } /** * 停止播放asset资源中的音频 */ export function stopAssetAudio() { if(globalPlayer != null){ globalPlayer!.stop(); globalPlayer = null; } } export function goOtherActivity(imageDone: (event:string) => void):boolean { // 检查相关权限是否已经具备 if (ActivityCompat.checkSelfPermission(getUniActivity()!, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 不具备权限,申请权限,并且告知用户监听失败 ActivityCompat.requestPermissions(getUniActivity()!, arrayOf(Manifest.permission.CAMERA), 1002) return false; } onAppActivityResult((requestCode: Int, resultCode: Int, data?: Intent) => { let eventName = "onAppActivityResult - requestCode:" + requestCode + " -resultCode:"+resultCode + " -data:"+JSON.stringify(data); console.log(eventName); if ((requestCode == 1001) && (resultCode == Activity.RESULT_OK)) { if (data != null) { let bundle = data.getExtras(); let mImageBitmap = bundle!.get("data") as Bitmap; let bitmapPath = getUniActivity()!.getExternalCacheDir()!.getPath() + "/photo.png" console.log(bitmapPath); try{ mImageBitmap.compress(Bitmap.CompressFormat.PNG,100,new FileOutputStream(bitmapPath)) }catch(e){ } imageDone(bitmapPath); } } }); let takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //resolveActivity 返回可处理 Intent 的第一个 Activity 组件 if (takePictureIntent.resolveActivity(getUniActivity()!.getPackageManager()) != null) { getUniActivity()!.startActivityForResult(takePictureIntent, 1001); } return true; } /** * 初始化应用生命周期监听 * */ export function initAppLifecycle(onLifecycleChange: (event:string) => void) { /** * application 内存不足的回调函数 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onapptrimmemory */ onAppTrimMemory((level:Number) => { let eventName = "onAppTrimMemory - " + level; onLifecycleChange(eventName); console.log(eventName); }); /** * application 状态改变的回调函数 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onAppConfigChange */ onAppConfigChange((ret:UTSJSONObject) => { let eventName = "onAppConfigChange - " + JSON.stringify(ret); onLifecycleChange(eventName); console.log(eventName); }); /** * activity 销毁生命周期回调 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitydestroy */ onAppActivityDestroy(() => { let eventName = "onAppActivityDestroy"; onLifecycleChange(eventName); console.log(eventName); }); /** * activity 失去焦点生命周期回调 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivitypause */ onAppActivityPause(() => { let eventName = "onAppActivityPause" ; onLifecycleChange(eventName); console.log(eventName); }); /** * activity 得到焦点的周期回调 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivityresume */ onAppActivityResume(() => { let eventName = "onAppActivityResume"; onLifecycleChange(eventName); console.log(eventName); }); /** * activity 回退物理按键事件回调 * 说明文档:https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#onappactivityback */ onAppActivityBack(() => { let eventName = "onAppActivityBack"; onLifecycleChange(eventName); console.log(eventName); }); }