-- 这是我在2018年5月15日创建的中文函数库
-- 未完整测试，可能有Bug
-- 使用此文件内的函数，务必保留作者信息注释以示尊敬
-- 较大量使用此文件内的函数时，请留下我的信息，谢谢
-- QQ: 32552732
-- E-Mail: new-age@outlook.com
-- 有问题请联系

----------

-- 注意:
-- 此文件中所有代码著作权均归原作者所有，原作者在公开平台发布函数，并未注明禁止转载，才被收集到此，如您不愿意您的函数被收集到此处，或认为我有侵权行为，请立即联系我，我将立即停止可能的侵权行为，但恕能力有限，无法赔偿
-- 所有函数均已标明原作者，转载及引用时，请务必保留此标注，部分函数来源已不可考，均标为佚名。重申：无论如何使用这些代码，均务必保留作者信息，否则可能会有不好的后果，这就需要你自行承担咯
-- 该文件的使用造成的任何后果，均与作者无关，恕无法负责，请谨慎使用
-- QQ: 32552732
-- E-Mail: new-age@outlook.com
-- 部分函数需要特殊权限，请知悉！

----------

-- 下面这一部分是一些来自网络的代码，一部分是经过我修改后才出现在这里
-- 感谢他们！

-- 非常多的代码来自 @烧风 (QQ: 2063597709) 的 ALua 手册 (或是 ALua 助手 ？)。他的这一应用帮助了很多人，特别感谢！



require"import"
import"android.app.*"
import"android.os.*"
import"android.widget.*"
import"android.view.*"
import"android.webkit.*"
local Intent=import"android.content.Intent"
local Uri=import"android.net.Uri"

-- local 功能={}


-- 这一部分供内部函数调用

local function splitString(input, delimiter)
  -- By: heyuchang666 (来自CSDN，不清楚是不是原创)
  input = tostring(input)
  delimiter = tostring(delimiter)
  if (delimiter=='') then return false end
  local pos,arr = 0, {}
  for st,sp in function() return string.find(input, delimiter, pos, true) end do
    table.insert(arr, string.sub(input, pos, st - 1))
    pos = sp + 1
  end
  table.insert(arr, string.sub(input, pos))
  return arr
end

local function Base64_Encode(jdpuk)
  -- By: QQ32552732
  local String=import"java.lang.String"
  local Base64=import"android.util.Base64"
  return Base64.encodeToString(String(jdpuk).getBytes(),Base64.DEFAULT)
end

local function Base64_Decode(jdpuk)
  -- By: QQ32552732
  local String=import"java.lang.String"
  local Base64=import"android.util.Base64"
  return String(Base64.decode(jdpuk,Base64.DEFAULT))
end

local function uriEncode(s)
  -- By: 佚名
  s = string.gsub(s, "([^%w%.%- ])", function(c) return string.format("%%%02X", string.byte(c)) end)
  return string.gsub(s, " ", "+")
end

local function uriDecode(s)
  -- By: 佚名
  s = string.gsub(s, '%%(%x%x)', function(h) return string.char(tonumber(h, 16)) end)
  return s
end

local function serialize(obj)
  -- By: 佚名
  local lua = ""
  local t = type(obj)
  if t == "number" then
    lua = lua .. obj
   elseif t == "boolean" then
    lua = lua .. tostring(obj)
   elseif t == "string" then
    lua = lua .. string.format("%q", obj)
   elseif t == "table" then
    lua = lua .. "{\n"
    for k, v in pairs(obj) do
      lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
    end
    local metatable = getmetatable(obj)
    if metatable ~= nil and type(metatable.__index) == "table" then
      for k, v in pairs(metatable.__index) do
        lua = lua .. "[" .. serialize(k) .. "]=" .. serialize(v) .. ",\n"
      end
    end
    lua = lua .. "}"
   elseif t == "nil" then
    return nil
   else
    error("can not serialize a " .. t .. " type.")
  end
  return lua
end

local function unserialize(lua)
  -- By: 佚名
  local t = type(lua)
  if t == "nil" or lua == "" then
    return nil
   elseif t == "number" or t == "string" or t == "boolean" then
    lua = tostring(lua)
   else
    error("can not unserialize a " .. t .. " type.")
  end
  lua = "return " .. lua
  local func = loadstring(lua)
  if func == nil then
    return nil
  end
  return func()
end

local function getFileMD5(jdpuk)
  -- By: QQ32552732
  local MessageDigest=import"java.security.MessageDigest"
  local FileInputStream=import"java.io.FileInputStream"
  local BigInteger=import"java.math.BigInteger"
  local file=File(jdpuk)
  local buffer=byte[1024]
  local digest=MessageDigest.getInstance("MD5")
  local input=FileInputStream(file)
  local len=input.read(buffer,0,1024)
  while len~=-1 do
    digest.update(buffer,0,len)
    len=input.read(buffer,0,1024)
  end
  input.close()
  local bigInt=BigInteger(1,digest.digest())
  return bigInt.toString(16)
end

local function getStringMD5(jdpuk)
  -- By: QQ32552732
  local MessageDigest=import"java.security.MessageDigest"
  local BigInteger=import"java.math.BigInteger"
  return BigInteger(1,MessageDigest.getInstance("MD5").digest(String(jdpuk).getBytes())).toString(16)
end

local function URL_Encode(jdpuk)
  -- By: QQ32552732
  local URLEncoder=import"java.net.URLEncoder"
  URLEncoder.encode(jdpuk,"UTF-8")
end

local function URL_Decode(jdpuk)
  -- By: QQ32552732
  local URLDecoder=import"java.net.URLDecoder"
  URLDecoder.decode(jdpuk,"UTF-8")
end

function 文本拆分(文本,分隔符)
  return splitString(文本,分隔符)
end

function Uri编码(文本)
  return uriEncode(文本)
end

function Uri解码(文本)
  return uriDecode(文本)
end

function Base64编码(文本)
  return base64Encode(文本)
end

function Base64解码(文本)
  return base64Decode(文本)
end

function 重启自身()
  -- By: 一缕清风自在飞
  local intent=activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  activity.startActivity(intent)
end

function 获取安卓标识()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.provider.Settings$Secure"
  local android_id = Secure.getString(activity.getContentResolver(), Secure.ANDROID_ID)
  return android_id
end

--国际移动设备识别码: IMEI

function 获取手机标识()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local imei=activity.getSystemService(Context.TELEPHONY_SERVICE).getDeviceId()
  return imei
end

function 获取屏幕尺寸()
  -- By: 寒歌 (QQ: 2113075983)
  local ctx = this
  import "android.util.DisplayMetrics"
  local dm = DisplayMetrics();
  ctx.getWindowManager().getDefaultDisplay().getMetrics(dm);
  diagonalPixels = Math.sqrt(Math.pow(dm.widthPixels, 2) + Math.pow(dm.heightPixels, 2));
  return diagonalPixels / (160 * dm.density);
end

function 获取剩余存储空间()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.text.format.Formatter"
  local fs = StatFs(Environment.getDataDirectory().getPath())
  return Formatter.formatFileSize(activity, (fs.getAvailableBytes()))
end

function 获取总存储空间()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.text.format.Formatter"
  local path = Environment.getExternalStorageDirectory()
  local stat = StatFs(path.getPath())
  local blockSize = stat.getBlockSize()
  local totalBlocks = stat.getBlockCount()
  return Formatter.formatFileSize(activity, blockSize * totalBlocks)
end

function 获取应用信息(包名)
  -- By: 寒歌 (QQ: 2113075983)
  if 包名 then
    import "android.content.pm.PackageManager"
    local pm = activity.getPackageManager();
    local 图标 = pm.getApplicationInfo(tostring(包名),0)
    local 图标 = 图标.loadIcon(pm);
    local pkg = activity.getPackageManager().getPackageInfo(包名, 0);
    local 应用名称 = pkg.applicationInfo.loadLabel(activity.getPackageManager())
    local 版本号 = activity.getPackageManager().getPackageInfo(包名, 0).versionName
    local 最后更新时间 = activity.getPackageManager().getPackageInfo(包名, 0).lastUpdateTime
    local cal = Calendar.getInstance();
    cal.setTimeInMillis(最后更新时间);
    local 最后更新时间 = cal.getTime().toLocaleString()
    return 包名,版本号,最后更新时间,图标,应用名称
   else
    error("传入参数异常")
  end
end

function 获取网络运营商名称()
  -- By: 寒歌 (QQ: 2113075983)
  -- 注: 需权限 READ_PHONE_STATE
  import "android.content.Context"
  return this.getSystemService(Context.TELEPHONY_SERVICE).getNetworkOperatorName()
end

function 分享文件(路径,标题)
  -- By: 寒歌 (QQ: 2113075983)
  if 路径 then
    path = 路径
    title = 标题
    import "android.webkit.MimeTypeMap"
    import "android.content.Intent"
    import "android.net.Uri"
    import "java.io.File"
    local FileName=tostring(File(path).Name)
    local ExtensionName=FileName:match("%.(.+)")
    local Mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
    local intent = Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType(Mime);
    local file = File(path);
    local uri = Uri.fromFile(file);
    intent.putExtra(Intent.EXTRA_STREAM,uri);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    activity.startActivity(Intent.createChooser(intent, title));
   else
    error("传入参数异常")
  end
end

function 分享文本(内容,标题)
  -- By: 寒歌 (QQ: 2113075983)
  if 内容 then
    local text=内容
    local title=标题
    intent=Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_SUBJECT,""--[["分享"]]);
    intent.putExtra(Intent.EXTRA_TEXT,text);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    activity.startActivity(Intent.createChooser(intent,title));
   else
    error("传入参数异常")
  end
end

function 打开文件(路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 路径 then
    path = 路径
    import "android.webkit.MimeTypeMap"
    import "android.content.Intent"
    import "android.net.Uri"
    import "java.io.File"
    local FileName=tostring(File(path).Name)
    local ExtensionName=FileName:match("%.(.+)")
    local Mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
    if Mime then
      local intent = Intent();
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      intent.setAction(Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.fromFile(File(path)), Mime);
      activity.startActivity(intent);
     else
      Toast.makeText(this,"找不到可以用来打开此文件的程序",Toast.LENGTH_SHORT).show()
    end
   else
    error("传入参数异常")
  end
end

function 调用其它应用打开文件(路径)
  -- By: 寒歌 (QQ: 2113075983)
  local path=路径
  import "android.webkit.MimeTypeMap"
  import "android.content.Intent"
  import "android.net.Uri"
  import "java.io.File"
  FileName=tostring(File(path).Name)
  ExtensionName=FileName:match("%.(.+)")
  Mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
  if Mime then
    intent = Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(File(path)), Mime);
    activity.startActivity(intent);
   else
    print("找不到可以用来打开此文件的程序")
  end
end

function 发送短信(号码,内容)
  -- By: 寒歌 (QQ: 2113075983)
  if 号码 and 内容 then
    import "android.telephony.*"
    SmsManager.getDefault().sendTextMessage(tostring(号码), nil, tostring(内容), nil, nil)
   else
    error("传入参数异常")
  end
end

function 编写短信(号码,内容)
  -- By: 寒歌 (QQ: 2113075983)
  if 号码 then
    import "android.content.Intent"
    import "android.net.Uri"
    local uri = Uri.parse("smsto:"..号码)
    local intent = Intent(Intent.ACTION_SENDTO, uri)
    intent.putExtra("sms_body",内容)
    intent.setAction("android.intent.action.VIEW")
    activity.startActivity(intent)
   else
    error("传入参数异常")
  end
end

function 获取剪贴板()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  return activity.getSystemService(Context.CLIPBOARD_SERVICE).getText()
end

function 写入剪贴板(内容)
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  activity.getSystemService(Context.CLIPBOARD_SERVICE).setText(edit.Text)
end

--命令行: Shell

function 命令行执行(命令)
  -- By: 寒歌 (QQ: 2113075983)
  local cmd=命令
  local p=io.popen(string.format('%s',cmd))
  local s=p:read("*a")
  p:close()
  return s
end

--无线局域网: WLAN (或无线网络技术: WiFi)

function 打开无线网络()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  wifi.setWifiEnabled(true)
end

function 关闭无线网络()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  wifi.setWifiEnabled(false)
end

function 断开无线网络连接()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  wifi.disconnect()
end

function 获取无线网络启用状态()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  return wifi.isWifiEnabled()
end

function 获取无线网络连接状态()
  -- By: 寒歌 (QQ: 2113075983)
  local connManager = activity.getSystemService(Context.CONNECTIVITY_SERVICE)
  local mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  return true and tostring(mWifi):find("none)")
end

function 移动数据网络连接状态()
  -- By: 寒歌 (QQ: 2113075983)
  local manager = activity.getSystemService(Context.CONNECTIVITY_SERVICE);
  local gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
  return true and tostring(gprs)== "CONNECTED"
end

function 获取无线网络信息()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  return wifi.getConfiguredNetworks()
end

function 获取无线网络状态()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE)
  return wifi.getWifiState()
end

--网络协议地址: IP Address

function 解析网络协议地址(域名)
  -- By: 寒歌 (QQ: 2113075983)
  if 域名 then
    return InetAddress.getByName(域名);
   else
    error("传入参数异常")
  end
end

function 获取网络协议地址()
  -- By: 寒歌 (QQ: 2113075983)
  return InetAddress.getLocalHost();
end

--动态主机配置协议: DHCP

function 获取无线网络动态分配网络协议地址()
  -- By: 寒歌 (QQ: 2113075983)
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
  return string.match(tostring(wifi),"ipaddr(.-)gate")
end

--域名系统: DNS

function 获取域名系统网络协议地址()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.content.Context"
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
  local dns1 = string.match(tostring(wifi),"dns1 (.-) dns2")
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getDhcpInfo()
  local dns2 = string.match(tostring(wifi),"dns2 (.-) D")
  return dns1,dns2
end

--服务集标识: SSID

function 获取无线网络标识()
  -- By: 寒歌 (QQ: 2113075983)
  local wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
  local wifiInfo=wifiManager.getConnectionInfo();
  return wifiInfo.getSSID()
end

function 获取无线网络加密方式()
  -- By: 寒歌 (QQ: 2113075983)
  local wifi = activity.Context.getSystemService(Context.WIFI_SERVICE).getConfiguredNetworks()
  return string.match(tostring(wifi),[[KeyMgmt: (.-) P]])
end

function 获取无线网络信号强度()
  -- By: 寒歌 (QQ: 2113075983)
  local wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
  local wifiInfo=wifiManager.getConnectionInfo();
  return wifiInfo.getRssi()
end

function 获取无线网络标识隐藏状态()
  -- By: 寒歌 (QQ: 2113075983)
  local wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
  local wifiInfo=wifiManager.getConnectionInfo();
  return wifiInfo.getHiddenSSID()
end

--媒体访问控制地址、物理地址、硬件地址: MAC Address

function 获取无线网络物理地址()
  -- By: 寒歌 (QQ: 2113075983)
  local wifiManager=activity.Context.getSystemService(Context.WIFI_SERVICE);
  local wifiInfo=wifiManager.getConnectionInfo();
  wifiInfo.getMacAddress()
end

--多用途互联网邮件扩展类型: Mime Type

function 获取文件类型(文件名)
  if 文件名 then
    local name=文件名
    import "android.webkit.MimeTypeMap"
    local ExtensionName=tostring(name):match("%.(.+)")
    local Mime=MimeTypeMap.getSingleton().getMimeTypeFromExtension(ExtensionName)
    return tostring(Mime)
   else
    error("传入参数异常")
  end
end

function 搜索(关键词)
  -- By: 寒歌 (QQ: 2113075983)
  if 关键词 then
    import "android.content.Intent"
    import "android.app.SearchManager"
    local intent = Intent()
    intent.setAction(Intent.ACTION_WEB_SEARCH)
    intent.putExtra(SearchManager.QUERY,关键词)
    activity.startActivity(intent)
   else
    error("传入参数异常")
  end
end

function 启动应用程序(包名)
  -- By: 寒歌 (QQ: 2113075983)
  if 包名 then
    local packageName=包名
    import "android.content.Intent"
    import "android.content.pm.PackageManager"
    local manager = activity.getPackageManager()
    local open = manager.getLaunchIntentForPackage(packageName)
    this.startActivity(open)
   else
    error("传入参数异常")
  end
end

function 安装应用程序(安装包路径)
  import "android.content.Intent"
  import "android.net.Uri"
  local intent = Intent(Intent.ACTION_VIEW)
  intent.setDataAndType(Uri.parse("file://"..安装包路径), "application/vnd.android.package-archive")
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  activity.startActivity(intent)
end

function 卸载应用程序(包名)
  -- By: 寒歌 (QQ: 2113075983)
  if 包名 then
    import "android.net.Uri"
    import "android.content.Intent"
    uri = Uri.parse("package:"..包名)
    intent = Intent(Intent.ACTION_DELETE,uri)
    activity.startActivity(intent)
   else
    error("传入参数异常")
  end
end

function 启动系统设置(设置项)
  -- By: 寒歌 (QQ: 2113075983)
  if 设置项 then
    import "android.content.Intent"
    import "android.provider.Settings"
    settings={
      设置=Settings.ACTION_SETTINGS,
      APN=Settings.ACTION_APN_SETTINGS,
      位置=Settings.ACTION_LOCATION_SOURCE_SETTINGS,
      网络=Settings.ACTION_WIRELESS_SETTINGS,
      飞行模式=Settings.ACTION_AIRPLANE_MODE_SETTINGS,
      安全=Settings.ACTION_SECURITY_SETTINGS,
      无线网络=Settings.ACTION_WIFI_SETTINGS,
      无线网络协议地址=Settings.ACTION_WIFI_IP_SETTINGS,
      蓝牙=Settings.ACTION_BLUETOOTH_SETTINGS,
      时间和日期=Settings.ACTION_DATE_SETTINGS,
      声音=Settings.ACTION_SOUND_SETTINGS,
      显示=Settings.ACTION_DISPLAY_SETTINGS,
      QQ=2113075983,
      语言=Settings.ACTION_LOCALE_SETTINGS,
      输入法=Settings.ACTION_INPUT_METHOD_SETTINGS,
      用户词典=Settings.ACTION_USER_DICTIONARY_SETTINGS,
      应用程序=Settings.ACTION_APPLICATION_SETTINGS,
      应用程序开发=Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS,
      快速启动=Settings.ACTION_QUICK_LAUNCH_SETTINGS,
      已下载应用程序=Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS,
      应用程序数据同步=Settings.ACTION_SYNC_SETTINGS,
      可用网络搜索=Settings.ACTION_NETWORK_OPERATOR_SETTINGS,
      移动数据网络=Settings.ACTION_DATA_ROAMING_SETTINGS,
      存储=Settings.ACTION_INTERNAL_STORAGE_SETTINGS,
    }
    设置项=settings[设置项] or 设置项
    local intent = Intent(设置项)
    this.startActivity(intent)
   else
    error("传入参数异常")
  end
end

function 选择文件(回调)
  error("暂不可用")
  -- By: 寒歌 (QQ: 2113075983)
  if 回调 then
    import "android.content.Intent"
    import "android.net.Uri"
    import "java.net.URLDecoder"
    import "java.io.File"
    intent = Intent(Intent.ACTION_GET_CONTENT)
    intent.setType("*/");
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    activity.startActivityForResult(intent,1);
    function onActivityResult(requestCode,resultCode,data)
      if resultCode == Activity.RESULT_OK then
        local str = data.getData().toString()
        local decodeStr = URLDecoder.decode(str,"UTF-8")
        回调(decodeStr)
      end
    end
   else
    error("传入参数异常")
  end
end

function 选择图片(回调)
  error("暂不可用")
  -- By: 寒歌 (QQ: 2113075983) (或者是 nirenr ?)
  if 回调 then
    import "android.content.Intent"
    local intent= Intent(Intent.ACTION_PICK)
    intent.setType("image/*")
    this.startActivityForResult(intent, 1)
    function onActivityResult(requestCode,resultCode,intent)
      if intent then
        local cursor =this.getContentResolver ().query(intent.getData(), nil, nil, nil, nil)
        cursor.moveToFirst()
        import "android.provider.MediaStore"
        local idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
        fileSrc = cursor.getString(idx)
        bit=nil
        import "android.graphics.BitmapFactory"
        bit =BitmapFactory.decodeFile(fileSrc)
        回调(fileSrc,bit)
      end
    end
   else
    error("传入参数异常")
  end
end

function 发送彩信(图片路径,目标,内容)
  -- By: 寒歌 (QQ: 2113075983)
  if 图片路径 then
    import "android.net.Uri"
    import "android.content.Intent"
    local uri=Uri.parse(图片路径)
    local intent= Intent();
    intent.setAction(Intent.ACTION_SEND);
    (目标 and intent.putExtra("address",目标))
    (内容 and intent.putExtra("sms_body",内容))
    intent.putExtra(Intent.EXTRA_STREAM,uri)
    intent.setType("image/png")
    this.startActivity(intent)
   else
    error("传入参数异常")
  end
end

function 拨打电话(号码)
  -- By: 寒歌 (QQ: 2113075983)
  import "android.net.Uri"
  import "android.content.Intent"
  local uri = Uri.parse("tel:"..号码)
  local intent = Intent(Intent.ACTION_CALL, uri)
  intent.setAction("android.intent.action.VIEW")
  activity.startActivity(intent)
end

function 获取文件大小(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    local path=文件路径
    import "java.io.File"
    import "android.text.format.Formatter"
    local size=File(tostring(path)).length()
    local Sizes=Formatter.formatFileSize(activity, size)
    return Sizes
   else
    error("传入参数异常")
  end
end

function 获取文件修改时间(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    local path=文件路径
    local f = File(path);
    local cal = Calendar.getInstance();
    local time = f.lastModified()
    cal.setTimeInMillis(time);
    return cal.getTime().toLocaleString()
   else
    error("传入参数异常")
  end
end

function 文件是否存在(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    import "java.io.File"
    return File(文件路径).exists()
   else
    error("传入参数异常")
  end
end

function 是否文件(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    import "java.io.File"
    return File(文件路径).isFile()
   else
    error("传入参数异常")
  end
end

function 是否目录(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    import "java.io.File"
    return File(文件路径).isDirectory()
   else
    error("传入参数异常")
  end
end

function 文件是否隐藏(文件路径)
  -- By: 寒歌 (QQ: 2113075983)
  if 文件路径 then
    import "java.io.File"
    return File(文件路径).isHidden()
   else
    error("传入参数异常")
  end
end

function 图片圆角(位图,角度)
  local bitmap=位图
  local roundPx=角度
  -- By: 寒歌 (QQ: 2113075983)
  import "android.graphics.PorterDuffXfermode"
  import "android.graphics.Paint"
  import "android.graphics.RectF"
  import "android.graphics.Bitmap"
  import "android.graphics.PorterDuff$Mode"
  import "android.graphics.Rect"
  import "android.graphics.Canvas"
  import "android.util.Config"
  width = bitmap.getWidth()
  output = Bitmap.createBitmap(width, width,Bitmap.Config.ARGB_8888)
  canvas = Canvas(output);
  color = 0xff424242;
  paint = Paint()
  rect = Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  rectF = RectF(rect);
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(color);
  canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
  paint.setXfermode(PorterDuffXfermode(Mode.SRC_IN));
  canvas.drawBitmap(bitmap, rect, rect, paint);
  return output;
end

function 获取视频第一帧(路径)
  -- By: 寒歌 (QQ: 2113075983)
  local path=路径
  import "android.media.MediaMetadataRetriever"
  media = MediaMetadataRetriever()
  media.setDataSource(tostring(path))
  return media.getFrameAtTime()
end

function 控件圆角(控件,颜色,角度)
  -- By: 寒歌 (QQ: 2113075983)
  local view=控件
  local InsideColor=颜色
  local radiu=角度
  import "android.graphics.drawable.GradientDrawable"
  drawable = GradientDrawable()
  drawable.setShape(GradientDrawable.RECTANGLE)
  drawable.setColor(InsideColor)
  drawable.setCornerRadii({radiu,radiu,radiu,radiu,radiu,radiu,radiu,radiu});
  view.setBackgroundDrawable(drawable)
end

function 获取视图中所有文本(视图)
  -- By: 寒歌 (QQ: 2113075983)
  local view=视图
  local textTable={}
  function GetText(Parent)
    local number=Parent.getChildCount()
    for i=0,number do
      local view=Parent.getChildAt(i)
      if pcall(function()view.addView(TextView(activity))end) then
        GetText(view)
       elseif pcall(function()view.getText()end) then
        table.insert(textTable,tostring(view.Text))
      end
    end
  end
  GetText(view)
  return textTable
end

function 查询本地所有视频()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.provider.MediaStore"
  cursor = activity.ContentResolver
  mImageUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  mCursor = cursor.query(mImageUri,nil,nil,nil,MediaStore.Video.Media.DATE_TAKEN)
  mCursor.moveToLast()
  VideoTable={}
  while mCursor.moveToPrevious() do
    path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Video.Media.DATA))
    table.insert(VideoTable,tostring(path))
  end
  mCursor.close()
  return VideoTable
end

function 查询本地所有图片()
  -- By: 寒歌 (QQ: 2113075983)
  import "android.provider.MediaStore"
  cursor = activity.ContentResolver
  mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  mCursor = cursor.query(mImageUri,nil,nil,nil,MediaStore.Images.Media.DATE_TAKEN)
  mCursor.moveToLast()
  imageTable={}
  while mCursor.moveToPrevious() do
    path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA))
    table.insert(imageTable,tostring(path))
  end
  mCursor.close()
  return imageTable
end

function 图片着色(位图,颜色)
  -- By: 寒歌 (QQ: 2113075983)
  local bitmap=位图
  local color=颜色
  local aa=BitmapDrawable(bitmap)
  aa.setColorFilter(PorterDuffColorFilter(color,PorterDuff.Mode.SRC_ATOP))
  return aa
end

function 保存位图(位图,路径)
  -- By: 寒歌 (QQ: 2113075983)
  local bm=位图
  local name=路径
  if bm then
    import "java.io.FileOutputStream"
    import "java.io.File"
    import "android.graphics.Bitmap"
    name=tostring(name)
    f = File(name)
    out = FileOutputStream(f)
    bm.compress(Bitmap.CompressFormat.PNG,90, out)
    out.flush()
    out.close()
    return true
   else
    return false
  end
end

function 缩放图片(位图,缩放级别)
  -- By: 佚名
  local bm=位图
  local degrees=缩放级别
  import "android.graphics.Matrix"
  import "android.graphics.Bitmap"
  width = bm.getWidth()
  height = bm.getHeight()
  matrix = Matrix()
  matrix.postRotate(degrees)
  bmResult = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true)
  return bmResult
end

function 匹配汉字(文本)
  -- By: 佚名
  local s=文本
  local ss = {}
  for k = 1, #s do
    local c = string.byte(s,k)
    if not c then break end
    if (c>=48 and c<=57) or (c>= 65 and c<=90) or (c>=97 and c<=122) then
      if not string.char(c):find("%w") then
        table.insert(ss, string.char(c))
      end
     elseif c>=228 and c<=233 then
      local c1 = string.byte(s,k+1)
      local c2 = string.byte(s,k+2)
      if c1 and c2 then
        local a1,a2,a3,a4 = 128,191,128,191
        if c == 228 then a1 = 184
         elseif c == 233 then a2,a4 = 190,c1 ~= 190 and 191 or 165
        end
        if c1>=a1 and c1<=a2 and c2>=a3 and c2<=a4 then
          k = k + 2
          table.insert(ss, string.char(c,c1,c2))
        end
      end
    end
  end
  return table.concat(ss)
end

function 振动(模式)
  -- By: 烧风 (QQ: 2063597709)
  -- 注: 需要申请控制振动器权限
  -- 振动模式格式: {等待时间,振动时间,等待时间,振动时间,•••,•••,•••,•••••}
  -- 例如: {500,100,500,100,500}
  import "android.content.Context"
  if not 模式 then
    模式={500}
  end
  vibrator = activity.getSystemService(Context.VIBRATOR_SERVICE)
  vibrator.vibrate( long(模式) ,-1)
end

function 设置横屏()
  -- By: 烧风 (QQ: 2063597709)
  activity.setRequestedOrientation(0);
end

function 设置竖屏()
  -- By: 烧风 (QQ: 2063597709)
  activity.setRequestedOrientation(1);
end

function 获取状态栏高度()
  -- By: 佚名
  local resid=activity.getResources().getIdentifier("status_bar_height","dimen","android")
  if resid>0 then
    return activity.getResources().getDimensionPixelSize(resid)
  end
end

function 获取导航栏高度()--不能判断导航栏有没有开启啊...
  -- By: 佚名
  local rid=activity.getResources().getIdentifier("config_showNavigationBar","bool","android")
  if rid~=0 then
    local resourceId=activity.getResources().getIdentifier("navigation_bar_height","dimen","android")
    return activity.getResources().getDimensionPixelSize(resourceId)
   else
    return 0
  end
end

function 控件截图(控件)
  -- By: 佚名
  if 控件 then
    local view=控件
    local Bitmap=import"android.graphics.Bitmap"
    view.setDrawingCacheEnabled(true)
    view.buildDrawingCache()
    local drawingcache=view.getDrawingCache()
    return (drawingcache~=nil or nil) and Bitmap.createBitmap(drawingcache)
   else
    error("传入参数异常")
  end
end

function 图片模糊(位图,模糊半径)--模糊半径0到25
  -- By: 佚名
  if 位图 and 模糊半径 then
    if 模糊半径>=0 and 模糊半径<=25 then
      local bitmap=位图
      local radius=模糊半径
      local Bitmap=import"android.graphics.Bitmap"
      local BitmapFactory=import"android.graphics.BitmapFactory"
      local Bundle=import"android.os.Bundle"
      local Allocation=import"android.renderscript.Allocation"
      local Element=import"android.renderscript.Element"
      local RenderScript=import"android.renderscript.RenderScript"
      local ScriptIntrinsicBlur=import"android.renderscript.ScriptIntrinsicBlur"
      local bitmap=bitmap or{}
      local output=Bitmap.createBitmap(bitmap)
      local rs=RenderScript.create(activity)
      local gaussianBlue=ScriptIntrinsicBlur.create(rs,Element.U8_4(rs))
      local allIn=Allocation.createFromBitmap(rs,bitmap)
      local allOut=Allocation.createFromBitmap(rs,output)
      gaussianBlue.setRadius(radius)
      gaussianBlue.setInput(allIn)
      gaussianBlue.forEach(allOut)
      allOut.copyTo(output)
      rs.destroy()
      rs.releaseAllContexts()
      return output
     else
      error("模糊半径超出范围 10-25")
    end
   else
    error("传入参数异常")
  end
end


----------

-- 下面这部分代码大部分是我原创，少数为我转换（Java转Lua）以及收集（均有注原作者）
-- QQ: 32552732
-- 转载使用烦请注明出处及作者信息~


-- By: QQ32552732
包管理器=this.getPackageManager()
此包名=this.getPackageName()
此包信息=包管理器.getPackageInfo(此包名,((32552732/2/2-8183)/10000-6-231)/9)
此应用信息=包管理器.getApplicationInfo(此包名,32552732/4-8138183)
if 此包名=="cn.coldsong.fusionapp" and init then
  -- 使用 Fusion App 的 init 信息获取当前工程信息，方便调试
  此包名=tostring(init.packagename)
  此应用名=tostring(init.appname)
  此版本名=tostring(init.appver)
  此版本号=tostring(init.appcode)
 else
  此应用名=tostring(包管理器.getApplicationLabel(此应用信息))
  此版本名=tostring(此包信息.versionName)
  此版本号=tostring(此包信息.versionCode)
end
function 获取此应用包名()
  -- By: QQ32552732
  return 此包名
end
function 获取此应用名()
  -- By: QQ32552732
  return 此应用名
end
function 获取此版本名()
  -- By: QQ32552732
  return 此版本名
end
function 获取此版本号()
  -- By: QQ32552732
  return 此版本号
end

function 弹出消息(消息)
  -- By: QQ32552732
  Toast.makeText(this,tostring(消息),Toast.LENGTH_SHORT).show()
end

local function websec(url,callback)
  -- B﻿y: Q﻿Q3﻿25﻿52﻿7﻿32
  if url and callback then
    import "java.net.URLEncoder"
    local securl="https://www.anquan.org/s/"..URLEncoder.encode(url)
    Http.get(securl,nil,"UTF-8",nil,function(status,result)
      if status==200 and result then
        local sitename=result:match("<div class=\"site%-name\">(.-)</div>")
        if sitename=="暂无网站信息" then
          sitename=nil
        end
        local secstatus=result:match("<div class=\"sec%-status\">(.-)</div>")
        if secstatus then
          secstatus=secstatus:gsub("%s",""):gsub("^<i></i>","") local dangers={}
          local i
          for i in result:gmatch("<li class=\"danger\">(.-)</li>") do
            dangers[#dangers+1]=i:match("<div class=\"s%-type\">(.-)</div>")
          end
          local message=""
          if secstatus=="未知" then
            message=message.."安全性未知，"
           else
            message=message.."为"..secstatus.."网站，"
          end
          if dangers and next(dangers) and #dangers>0 then
            if #dangers==1 then
              message=message.."存在"..dangers[1].."风险，"
             elseif #dangers==2 then
              message=message.."存在"..dangers[1].."及"..dangers[2].."风险，"
             elseif #dangers==3 then
              message=message.."存在"..dangers[1].."、"..dangers[2].."以及"..dangers[3].."风险，"
             elseif #dangers<=5 then
              message=message.."存在"..table.concat(dangers,"、").."风险，"
             else
              message=message.."存在"..dangers[1].."等总共"..#dangers.."个风险，"
            end
          end
          if secstatus=="安全" then
            message=message.."请放心访问。"
           elseif secstatus=="未知" then
            message=message.."请谨慎访问。"
           elseif secstatus=="高危" then
            message=message.."建议立即停止访问。"
          end
          local secstatuscode=0
          if secstatus=="安全" then
            secstatuscode=0
           elseif secstatus=="未知" then
            secstatuscode=-1
           else
            secstatuscode=1
          end
          callback(secstatuscode,secstatus,message,sitename,dangers,securl)
         else
          callback(-1,"未知","安全性未知，原因是安全查询失败，您可以检查查询网址后重试。",nil,{},securl)
        end
       else
        callback(-1,"未知","安全性未知，原因是安全查询失败，您可以检查网络连接后重试。",nil,{},securl)
      end
    end)
  end
end

function 列出值(表)
  -- By: QQ32552732
  local values={}
  for key,value in pairs(表) do
    values[#values+1]=value
  end
  return values
end

function 列出键(表)
  -- By: QQ32552732
  local keys={}
  for key,value in pairs(表) do
    keys[#keys+1]=key
  end
  return keys
end

function 匹配值(表,值)
  -- By: QQ32552732
  for key,value in pairs(表) do
    if value==值 then
      return key
    end
  end
  return nil
end

function 结束自身()
  -- By: QQ32552732
  activity.setContentView(loadlayout({LinearLayout,orientation="vertical",layout_width="fill",layout_height="fill",{TextView,layout_width="fill",layout_height="fill",gravity="center",textSize="20sp",text="请更新后使用"}}))
  local Process = import "android.os.Process"
  Process.killProcess(Process.myPid())
end

function 获取所有数据(表名)
  -- By: QQ32552732
  if 表名 then
    local data={}
    for d in each(this.getApplicationContext().getSharedPreferences(表名,32552732-32552732).getAll().entrySet()) do
      data[d.getKey()]=d.getValue()
    end
    return data
   else
    error("传入参数异常")
  end
end

function 获取数据(表名,键)
  -- By: QQ32552732
  if 表名 and 键 then
    local data=this.getApplicationContext().getSharedPreferences(表名,0*32552732).getString(键,nil)--32552732
    return data
   else
    error("传入参数异常")
  end
end

function 存储数据(表名,键,值)
  -- By: QQ32552732
  if 表名 and 键 then
    this.getApplicationContext().getSharedPreferences(表名,32552732*(1-2+1)).edit().putString(键,值).apply()--32552732
   else
    error("传入参数异常")
  end
end

function 删除数据(表名,键)
  -- By: QQ32552732
  if 表名 and 键 then
    this.getApplicationContext().getSharedPreferences(name,32552732*0).edit().remove(键).apply()--[[3(2)6?5{2}2[7]32]]
   else
    error("传入参数异常")
  end
end

function 请求网页(链接,回调)
  -- By: QQ32552732
  if 链接 and 回调 then
    Http.get(链接,nil,"UTF-8",nil,function(状态码,返回值)
      if 状态码==200 then
        回调(返回值)
      end
    end)
   else
    error("传入参数异常")
  end
end

function 打开链接(链接)
  -- By: QQ32552732
  import "android.content.Intent"
  this.startActivity(Intent(Intent.ACTION_VIEW,Uri.parse(链接)))
end

function 用QQ打开(链接)
  -- By: QQ32552732
  -- 注: 仅支持腾讯部分域名
  打开链接("mqqapi://forward/url?url_prefix="..Uri编码(Base64编码(链接)))
end

function 用支付宝打开(链接)
  -- By: QQ32552732
  打开链接("alipayqr://platformapi/startapp?saId=10000007&qrcode="..Uri编码(链接))
end

function 用淘宝打开(链接)
  -- By: QQ32552732
  打开链接("tbopen://"..Uri编码(链接))
end

function 用QQ分享(网页链接,标题,描述,图片链接,缩略图链接,分享标识)
  -- By: QQ32552732
  -- 注: 仅支持部分特殊版本或旧版本QQ
  local 分享标识=分享标识 or 1101685683
  打开链接("mqqapi://share/to_fri?file_type=news&share_id="..Uri编码(Base64编码(tostring(分享标识))).."&url="..Uri编码(Base64编码(tostring(网页链接))).."&previewimageUrl="..Uri编码(Base64编码(tostring(缩略图链接))).."&image_url="..Uri编码(Base64编码(tostring(图片链接))).."&title="..Uri编码(Base64编码(tostring(标题))).."&description="..Uri编码(Base64编码(tostring(描述))))
end

function 打开QQ名片(号码)
  -- By: QQ32552732
  打开链接("mqqapi://card/show_pslcard?uin="..Uri编码(tostring(号码)))
end

function 打开QQ群名片(号码)
  -- By: QQ32552732
  打开链接("mqqapi://card/show_pslcard?card_type=group&uin="..Uri编码(tostring(号码)))
end

function 打开QQ会话(号码)
  -- By: QQ32552732
  打开链接("mqqwpa://im/chat?chat_type=wpa&uin="..Uri编码(tostring(号码)))
end

function 打开QQ群会话(号码)
  -- By: QQ32552732
  打开链接("mqqwpa://im/chat?chat_type=group&uin="..Uri编码(tostring(号码)))
end

function 在应用市场打开(包名)
  -- By: QQ32552732
  打开链接("market://details?id="..Uri编码(包名))
end

function 在应用市场搜索(关键词)
  -- By: QQ32552732
  打开链接("market://search?q="..Uri编码(关键词))
end

function 获取签名(包名)
  -- By: QQ32552732
  return tostring(this.getPackageManager().getPackageInfo(this.getPackageName(),((32552732/2/2-8183)/10000-6-231)/9).signatures[(32552732+0+32552732-(32552732*2))].toCharsString())
end

-- 网站存储数据: Cookie

function 获取网站存储数据(域名)
  -- By: QQ32552732
  if 域名 then
    import "android.webkit.CookieManager"
    return CookieManager.getInstance().getCookie(域名)
   else
    error("传入参数异常")
  end
end

function 设置网站存储数据(域名,数据)
  -- By: QQ32552732
  if 域名 then
    import "android.webkit.CookieManager"
    return CookieManager.getInstance().setCookie(域名,数据)
   else
    error("传入参数异常")
  end
end

function 保存网站存储数据(域名)
  -- By: QQ32552732
  if 域名 then
    import "android.webkit.CookieManager"
    this.getSharedPreferences("Cookie",0).edit().putString(域名,CookieManager.getInstance().getCookie(域名)).apply()
   else
    error("传入参数异常")
  end
end

function 读取网站存储数据(域名)
  -- By: QQ32552732
  if 域名 then
    import "android.webkit.CookieManager"
    CookieManager.getInstance().setCookie(域名,this.getSharedPreferences("Cookie",(5-3+6-8)*32552732).getString(域名,""))
   else
    error("传入参数异常")
  end
end

function 删除网站存储数据(域名)
  -- By: QQ32552732
  if 域名 then
    import "android.webkit.CookieManager"
    this.getSharedPreferences("Cookie",32552732*(32552732-32552732)).edit().remove(域名).apply()
    CookieManager.getInstance().setCookie(域名,"")
   else
    error("传入参数异常")
  end
end

function 热更新(包路径)
  -- By: QQ32552732
  local filepath=包路径
  if File(filepath).exists() and File(filepath).isFile() then
    ZipUtil.unzip(filepath,this.getLuaDir())
    重启自身()
   else
    error("找不到更新包，路径: "..filepath)
  end
end

function 网页源码(网页视图,回调)
  -- By: QQ32552732
  -- 注: 仅支持 Android 4.4 (SDK19) 及以上
  if 网页视图 and 回调 then
    网页视图.evaluateJavascript("function getSource(){return \"<html>\"+document.getElementsByTagName('html')[0].innerHTML+\"</html>\";};getSource();",{
      onReceiveValue=function(result)
        -- %转换为%;再转换回%，是为了将\\n转换为%n，而这是为了让\\n能够正常转换为\n而不是\。
        result=result:gsub("%%","%%;"):gsub("\\\\n","%%n"):gsub("\\n","\n"):gsub("%%n","\\n"):gsub("%%;","%%"):gsub("\\u003C","<"):gsub("\\\"","\""):gsub("^\"",""):gsub("\"$","")
        回调(result)
      end
    })
   else
    error("传入参数异常")
  end
end

function 获取运行目录()
  -- By: QQ32552732
  return getLuaDir()
end

function 获取存储目录()
  -- By: QQ32552732
  return Environment.getExternalStorageDirectory().getPath()
end

function 网站安全检测(网址,回调)
  -- By: QQ32552732
  if 网址 and 回调 then
    websec(网址,回调)
   else
    error("传入参数异常")
  end
end

function 网页沉浸(网页视图,取色位置,控件)
  -- B﻿﻿y: Q﻿﻿﻿Q325﻿﻿527﻿32
  -- 注: 若控件参数为 nil ，则返回取色结果，否则将控件背景颜色设置为取色结果
  if 网页视图 then
    local view=网页视图
    view.setDrawingCacheEnabled(true)
    view.buildDrawingCache(true)
    local drawingCache=view.getDrawingCache()
    local bitmap=Bitmap.createBitmap(drawingCache)
    view.setDrawingCacheEnabled(false)
    local cpos={
      左上={0,0},
      左中={0,(bitmap.getHeight()-1)/2},
      左下={0,(bitmap.getHeight()-1)-1},
      右上={(bitmap.getWidth()-1)-1,0},
      右中={(bitmap.getWidth()-1)-1,(bitmap.getHeight()-1)/2},
      右下={(bitmap.getWidth()-1)-1,(bitmap.getHeight()-1)-1},
      中上={(bitmap.getWidth()-1)/2,0},
      中中={(bitmap.getWidth()-1)/2,(bitmap.getHeight()-1)/2},
      中下={(bitmap.getWidth()-1)/2,(bitmap.getHeight()-1)-1},
    }
    if cpos[取色位置] then
      local color=bitmap.getPixel(cpos[取色位置][1],cpos[取色位置][2])
      local a=Color.alpha(color)
      local r=Color.red(color)
      local g=Color.green(color)
      local b=Color.blue(color)
      local colorstring=("#"..Integer.toHexString(a)..Integer.toHexString(r)..Integer.toHexString(g)..Integer.toHexString(b))
      if 控件 then
        控件.setBackgroundColor(Color.parseColor(colorstring))
       else
        return colorstring
      end
     else
      error("找不到该取色位置，请按格式XY表达位置，X为左中右，Y为上中下，如: 左上")
    end
    view=nil
    drawingCache=nil
    bitmap=nil
    color=nil
    a=nil
    r=nil
    g=nil
    b=nil
    colorstring=nil
   else
    error("传入参数异常")
  end
end

-- 意图: Intent

function 列出支持的应用(意图)
  -- By: QQ32552732
  if 意图 then
    local intent=意图
    local jdpuk=this.getPackageManager().queryIntentActivities(intent,0)
    if jdpuk.size()>0 then
      local acts={}
      for i=0,jdpuk.size()-1 do
        local resolve=jdpuk.get(i)
        local packname=resolve.activityInfo.packageName
        local actname=resolve.activityInfo.name
        local actlabel=resolve.activityInfo.loadLabel(this.getPackageManager())
        acts[packname.."/"..actname]=actlabel
      end
      return acts
     else
      return nil
    end
   else
    error("传入参数异常")
  end
end

function 布局遮罩(控件,状态,标识)
  -- B﻿﻿﻿﻿y: Q﻿﻿Q325﻿527﻿﻿32
  -- 注: 不是所有控件都支持遮罩，目前遮罩是为WebView设计，实际上可以用在各种Layout、CardView等。都如未传入标识或标识重复，将在多个遮罩的情况下出现问题
  if 状态==nil then
    状态=true
  end
  if type(控件)=="string" then
    if _G[控件] then
      控件=_G[控件]
     else
      error("传入参数异常")
      控件=nil
    end
  end
  if 控件 then
    local overlayid=tostring(标识).."Overlay"
    if 状态 then
      if not _G[overlayid] then
        local overlayLayout={
          LinearLayout,
          id=overlayid,
          layout_width=2147483647,
          layout_height=2147483647,
          orientation="vertical",
          backgroundColor="#50000000",
        }
        控件.addView(loadlayout(overlayLayout))
      end
     elseif not 状态 then
      if _G[overlayid] then
        控件.removeView(_G[overlayid])
        _G[overlayid]=nil
      end
    end
   else
    error("传入参数异常")
  end
end

function 网页脚本(网页视图,脚本,回调)
  -- By: QQ32552732
  if 网页视图 and 脚本 then
    local status=webView.evaluateJavascript(脚本,{
      onReceiveValue=回调
    })
    if not status then
      if 回调 then
        error("此系统网页视图不支持回调")
       else
        网页视图.loadUrl("javascript:"..Uri编码(脚本))
      end
    end
   else
    error("传入参数异常")
  end
end

function 悬浮按钮居中()--仅支持 Fusion App
  -- By: QQ32552732
  task(200,function()fltBtn.LayoutParams=fltBtn.LayoutParams.setMargins(0,0,activity.getWidth()/2-fltBtn.getMeasuredWidth()/2,fltBtn.getMeasuredHeight()/2)end)
end

function 悬浮按钮居左()--仅支持 Fusion App
  -- By: QQ32552732
  task(200,function()fltBtn.LayoutParams=fltBtn.LayoutParams.setMargins(0,0,activity.getWidth()-fltBtn.getMeasuredHeight()/2,activity.getHeight()/2-fltBtn.getMeasuredHeight()/2)end)
end

function 悬浮按钮居右()--仅支持 Fusion App
  -- By: QQ32552732
  task(200,function()fltBtn.LayoutParams=fltBtn.LayoutParams.setMargins(0,0,-fltBtn.getMeasuredHeight()/2,activity.getHeight()/2-fltBtn.getMeasuredHeight()/2)end)
end

function 悬浮按钮居下()--仅支持 Fusion App
  -- By: QQ32552732
  task(200,function()fltBtn.LayoutParams=fltBtn.LayoutParams.setMargins(0,0,activity.getWidth()/2-fltBtn.getMeasuredWidth()/2,-fltBtn.getMeasuredWidth()/2)end)
end

function 加载到全局()
  -- By: QQ32552732
  for key,value in pairs(功能) do
    if not _G[key] then
      _G[key]=value
    end
  end
end

function 从全局移除()
  -- By: QQ32552732
  for key,value in pairs(功能) do
    if _G[key] and _G[key]==value then
      _G[key]=nil
    end
  end
end

function 彻底退出()--杀死自身
  -- By: QQ32552732
  local Process=import"android.os.Process"
  Process.killProcess(Process.myPid())
end

杀死自身=彻底退出

function 获取文件MD5(路径)
  -- By: QQ32552732 (实际上是 Java)
  return getFileMD5(路径)
end

function 获取文本MD5(文本)
  -- By: QQ32552732 (实际上是 Java)
  return getStringMD5(文本)
end

function Base64编码(文本)
  -- By: QQ32552732 (实际上是 Android)
  return Base64_Encode(文本)
end

function Base64解码(文本)
  -- By: QQ32552732 (实际上是 Android)
  return Base64_Decode(文本)
end

function URL编码(文本)
  -- By: QQ32552732 (实际上是 Java)
  return URL_Encode(文本)
end

function URL解码(文本)
  -- By: QQ32552732 (实际上是 Java)
  return URL_Decode(文本)
end

function MD5模块加密(文本,密钥)
  -- By: QQ32552732
  if 文本 and 密钥 then
    local md5=import"md5"
    return md5.crypt(文本,密钥)
   else
    error("传入参数异常")
  end
end

function MD5模块解密(文本,密钥)
  -- By: QQ32552732
  if 文本 and 密钥 then
    local md5=import"md5"
    return md5.decrypt(文本,密钥)
   else
    error("传入参数异常")
  end
end

function 匹配正则表达式(文本,正则表达式)
  -- By: QQ32552732 (实际上是 Java)
  if 正则表达式 and 文本 then
    local regex=正则表达式
    local str=文本
    local Pattern=import"java.util.regex.Pattern"
    local pattern=Pattern.compile(regex)
    local matcher=pattern.matcher(str)
    return matcher.find()
   else
    error("传入参数异常")
  end
end

function 正则表达式捕获(文本,正则表达式)
  -- B﻿﻿﻿y: Q﻿﻿Q32﻿﻿5527﻿32 (实际上是 Java)
  if 正则表达式 and 文本 then
    local regex=正则表达式
    local str=文本
    local Pattern=import"java.util.regex.Pattern"
    local pattern=Pattern.compile(regex)
    local matcher=pattern.matcher(str)
    local result={}
    while matcher.find()do
      table.insert(result,matcher.group())
      --matcher.start()
      --matcher.end()
    end
    --matcher.reset()
    return result
   else
    error("传入参数异常")
  end
end

function 正则表达式替换(文本,正则表达式,替换文本)
  -- B﻿y: Q﻿Q3﻿﻿2552﻿﻿﻿732 (实际上是 Java)
  if 正则表达式 and 文本 then
    local regex=正则表达式
    local str=文本
    local replace=替换文本 or ""
    local Pattern=import"java.util.regex.Pattern"
    local pattern=Pattern.compile(regex)
    local matcher=pattern.matcher(str)
    matcher.replaceAll(replace)
    return result
   else
    error("传入参数异常")
  end
end

function 正则表达式查找(文本,正则表达式)
  -- B﻿﻿y: Q﻿﻿﻿Q32﻿55﻿﻿27﻿32 (实际上是 Java)
  if 正则表达式 and 文本 then
    local regex=正则表达式
    local str=文本
    local Pattern=import"java.util.regex.Pattern"
    local pattern=Pattern.compile(regex)
    local matcher=pattern.matcher(str)
    matcher.find()
    return matcher.start(),matcher["end"]()
   else
    error("传入参数异常")
  end
end

function 模式匹配转义(文本)
  -- By: QQ32552732
  local result=string.gsub(文本,"[%(%)%.%%%+%-%*%?%[%]%^%$]","%%%1")--:gsub("[\"\'\\]","\\%1")
  return result
end

function 包含文本(源文本,文本)
  -- By: QQ32552732
  if string.find(源文本,模式匹配转义(文本)) then
    return true
   else
    return false
  end
end

function 进制转换(内容,原进制,目标进制)
  -- By: QQ32552732 (实际上是 Java)
  if 内容 and 原进制 and 目标进制 then
    if 原进制>=2 and 原进制<=36 and 目标进制>=2 and 目标进制<=36 then
      local BigInteger="java.math.BigInteger"
      return BigInteger(tostring(内容),原进制).toString(目标进制)
     else
      error("进制范围异常")
    end
   else
    error("传入参数异常")
  end
end

function 隐藏控件(控件)
  -- By: QQ32552732
  if 控件 then
    setVisibility(View.VISIBLE)
   else
    error("传入参数异常")
  end
end

function 显示控件(控件)
  -- By: QQ32552732
  if 控件 then
    setVisibility(View.VISIBLE)
   else
    error("传入参数异常")
  end
end

function 控件不可见(控件)
  -- By: QQ32552732
  if 控件 then
    setVisibility(View.INVISIBLE)
   else
    error("传入参数异常")
  end
end

function 颜色值转数字(颜色)
  -- By: QQ32552732
  if 颜色 then
    local color=颜色
    if type(color)=="string" then
      if color:find"^%(?%d+,%d+,%d+%)?$" or color:find"^%(?%d+,%d+,%d+,%d+%)?$" then
        return tonumber(color:gsub(".?%d+.?",function(c)
          local d=("%x"):format(tonumber(tostring(c:gsub("[^%d]",""))))
          if #d<2 then d="0"..d end
          return d
        end),16)
       elseif color:find"^#?([%w%d][%w%d])([%w%d][%w%d])([%w%d][%w%d])([%w%d][%w%d])$" then
        return tonumber(color:gsub("^#",""),16)
       elseif color:find"^#?([%w%d][%w%d])([%w%d][%w%d])([%w%d][%w%d])$" then
        return tonumber("FF"..color:gsub("^#",""),16)
       else
        return tonumber(color)
      end
     elseif type(color)=="number" then
      return color
    end
    return nil
   else
    error("传入参数异常")
  end
end

function 解析颜色值(颜色)
  -- By: QQ32552732 (实际上是 Android)
  local Color=import"android.graphics.Color"
  return Color.parseColor(颜色)
end

function 格式化大小(字节数)
  -- By: QQ32552732 (实际上是 Android)
  local Formatter=import"android.text.format.Formatter"
  return Formatter.formatFileSize(activity,字节数)
end

function 列出表键(表)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  local keys={}
  for k,v in pairs(表) do
    keys[#keys+1]=k
  end
  return keys
end

function 列出表值(表)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  local values={}
  for k,v in pairs(表) do
    values[#values+1]=v
  end
  return values
end

function 复制表(源表,目标表)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  for k,v in pairs(源表) do
    目标表[k]=v
  end
end

function 从表中查找(表,值)
  -- By: QQ32552732
  for k,v in pairs(表) do
    if v==值 then return k end
  end
  return false
end

function 从表中查找键(表,键)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  for k, v in pairs(表) do
    if v == 值 then return k end
  end
  return nil
end

function 从表中删除值(表,值)
  -- By: QQ32552732
  local t={}
  for k,v in pairs(表) do
    if v==值 then
      表[k]=nil
    end
  end
  return t
end

function 遍历表(表,回调)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  for k, v in pairs(表) do
    if not fn(v, k) then t[k] = nil end
  end
end

function 表去重(表)
  -- By: ouyangshima (CSDN) (不清楚是否原创)
  local check = {}
  local n = {}
  for k, v in pairs(表) do
    if not check[v] then
      n[k] = v
      check[v] = true
    end
  end
  return n
end

function 表随机取值(表)
  -- By: QQ32552732
  math.randomseed(tonumber(os.time()+(os.clock()*math.floor(32552732*0.0307193879))))
  return 表[math.random(1,#表)]
end

--B_y_Q_Q_3_2_5_5_2_7_3_2--
local Gravity=import"android.view.Gravity"
重力={
  无=Gravity.NO_GRAVITY,
  没=Gravity.NO_GRAVITY,
  没有=Gravity.NO_GRAVITY,
  无重力=Gravity.NO_GRAVITY,
  开始=Gravity.START,
  始=Gravity.START,
  头=Gravity.START,
  头部=Gravity.START,
  结束=Gravity.END,
  终=Gravity.END,
  尾=Gravity.END,
  尾部=Gravity.END,
  尽头=Gravity.END,
  上=Gravity.TOP,
  上方=Gravity.TOP,
  上面=Gravity.TOP,
  上端=Gravity.TOP,
  上部=Gravity.TOP,
  顶=Gravity.TOP,
  顶部=Gravity.TOP,
  顶端=Gravity.TOP,
  顶上=Gravity.TOP,
  下=Gravity.BOTTOM,
  下方=Gravity.BOTTOM,
  下面=Gravity.BOTTOM,
  下端=Gravity.BOTTOM,
  下部=Gravity.BOTTOM,
  底=Gravity.BOTTOM,
  底部=Gravity.BOTTOM,
  底端=Gravity.BOTTOM,
  底下=Gravity.BOTTOM,
  左=Gravity.LEFT,
  左方=Gravity.LEFT,
  左边=Gravity.LEFT,
  左端=Gravity.LEFT,
  左侧=Gravity.LEFT,
  左部=Gravity.LEFT,
  右=Gravity.RIGHT,
  右方=Gravity.RIGHT,
  右边=Gravity.RIGHT,
  右端=Gravity.RIGHT,
  右侧=Gravity.RIGHT,
  右部=Gravity.RIGHT,
  中=Gravity.CENTER,
  中间=Gravity.CENTER,
  中部=Gravity.CENTER,
  中心=Gravity.CENTER,
  中央=Gravity.CENTER,
  居中=Gravity.CENTER,
  垂直中=Gravity.CENTER_VERTICAL,
  垂直中间=Gravity.CENTER_VERTICAL,
  垂直中部=Gravity.CENTER_VERTICAL,
  垂直中心=Gravity.CENTER_VERTICAL,
  垂直中央=Gravity.CENTER_VERTICAL,
  垂直居中=Gravity.CENTER_VERTICAL,
  竖直中=Gravity.CENTER_VERTICAL,
  竖直中间=Gravity.CENTER_VERTICAL,
  竖直中部=Gravity.CENTER_VERTICAL,
  竖直中心=Gravity.CENTER_VERTICAL,
  竖直中央=Gravity.CENTER_VERTICAL,
  竖直居中=Gravity.CENTER_VERTICAL,
  竖向中=Gravity.CENTER_VERTICAL,
  竖向中间=Gravity.CENTER_VERTICAL,
  竖向中部=Gravity.CENTER_VERTICAL,
  竖向中心=Gravity.CENTER_VERTICAL,
  竖向中央=Gravity.CENTER_VERTICAL,
  竖向居中=Gravity.CENTER_VERTICAL,
  纵中=Gravity.CENTER_VERTICAL,
  纵中间=Gravity.CENTER_VERTICAL,
  纵中部=Gravity.CENTER_VERTICAL,
  纵中心=Gravity.CENTER_VERTICAL,
  纵中央=Gravity.CENTER_VERTICAL,
  纵居中=Gravity.CENTER_VERTICAL,
  纵向中=Gravity.CENTER_VERTICAL,
  纵向中间=Gravity.CENTER_VERTICAL,
  纵向中部=Gravity.CENTER_VERTICAL,
  纵向中心=Gravity.CENTER_VERTICAL,
  纵向中央=Gravity.CENTER_VERTICAL,
  纵向居中=Gravity.CENTER_VERTICAL,
  纵轴中=Gravity.CENTER_VERTICAL,
  纵轴中间=Gravity.CENTER_VERTICAL,
  纵轴中部=Gravity.CENTER_VERTICAL,
  纵轴中心=Gravity.CENTER_VERTICAL,
  纵轴中央=Gravity.CENTER_VERTICAL,
  纵轴居中=Gravity.CENTER_VERTICAL,
  水平中=Gravity.CENTER_HORIZONTAL,
  水平中间=Gravity.CENTER_HORIZONTAL,
  水平中部=Gravity.CENTER_HORIZONTAL,
  水平中心=Gravity.CENTER_HORIZONTAL,
  水平中央=Gravity.CENTER_HORIZONTAL,
  水平居中=Gravity.CENTER_HORIZONTAL,
  QQ=32552732,
  横中=Gravity.CENTER_HORIZONTAL,
  横中间=Gravity.CENTER_HORIZONTAL,
  横中部=Gravity.CENTER_HORIZONTAL,
  横中心=Gravity.CENTER_HORIZONTAL,
  横中央=Gravity.CENTER_HORIZONTAL,
  横居中=Gravity.CENTER_HORIZONTAL,
  横向中=Gravity.CENTER_HORIZONTAL,
  横向中间=Gravity.CENTER_HORIZONTAL,
  横向中部=Gravity.CENTER_HORIZONTAL,
  横向中心=Gravity.CENTER_HORIZONTAL,
  横向中央=Gravity.CENTER_HORIZONTAL,
  横向居中=Gravity.CENTER_HORIZONTAL,
  横轴中=Gravity.CENTER_HORIZONTAL,
  横轴中间=Gravity.CENTER_HORIZONTAL,
  横轴中部=Gravity.CENTER_HORIZONTAL,
  横轴中心=Gravity.CENTER_HORIZONTAL,
  横轴中央=Gravity.CENTER_HORIZONTAL,
  横轴居中=Gravity.CENTER_HORIZONTAL,
}

吐司={提示="暂未完成"}

-- By: QQ 32552732
-- 注: 部分函数未对传入参数进行合法性校验
--输入输出=io
输入输出={}
--部分 Lua I/O 函数
function 输入输出.打开(路径,模式,使用二进制方式)
  -- By: QQ32552732
  if 路径 then
    --文件不存在时，仅使用 w a w+ a+ 模式会自动创建文件，否则会报错
    local mode
    if 模式 then
      local modes={
        读="r",
        只读="r",
        只读取="r",
        仅读="r",
        仅读取="r",
        读取="r",
        可读="r",
        写="r",
        只写="w",
        只写入="w",
        仅写="w",
        仅写入="w",
        写入="w",
        可写="w",
        追加="a",
        增加="a",
        加入="a",
        作者="3255".."2732",
        读写="r+",
        写读="r+",
        可读可写="r+",
        可写可读="r+",
        读取写入="r+",
        写入读取="r+",
        可读写入="r+",
        可读写="r+",
        完整="r+",
        完全="r+",
        覆盖="w+",
        覆写="w+",
        覆盖写入="w+",
        只覆写="w+",
        仅覆写="w+",
        只覆盖写入="w+",
        仅覆盖写入="w+",
        可读追加="a+",
        读取追加="a+",
        可读增加="a+",
        读取增加="a+",
        可读加入="a+",
        读取加入="a+",
      }
      mode=modes[模式:gsub("模式$","")]
     else
      mode="r+"
    end
    if mode then
      if 使用二进制方式 then
        mode=mode.."b"
      end
      local file=io.open(路径,mode)
      return file
     else
      error("找不到模式: "..模式)
    end
   else
    error("传入参数异常")
  end
end
function 输入输出.类型(文件)
  -- By: QQ32552732
  local type=io.type(文件)
  if not type then
    return nil
   elseif type=="file" then
    return "文件"
   elseif type=="closed file" then
    return "已关闭的文件"
   else
    return type
  end
end
function 输入输出.迭代器(文件)
  -- By: QQ32552732
  return 文件:lines()
end
function 输入输出.读取(文件,格式)--格式可以是读取的字节数（字节长度）
  -- By: QQ32552732
  if not 格式 then
    格式="*a"
  end
  if type(文件)=="string" then
    local 临时文件=输入输出.打开(文件,"读取")
    local 结果=输入输出.读取(临时文件,格式)
    输入输出.关闭(临时文件)
    return 结果
    --return io.read(文件,格式)
   else
    return 文件:read(格式)
  end
end
function 输入输出.下一行(文件)
  -- By: QQ32552732
  if type(文件)=="string" then
    local 临时文件=输入输出.打开(文件,"读取")
    local 结果=输入输出.下一行(临时文件)
    输入输出.关闭(临时文件)
    return 结果
    --return io.read(文件,"*l")
   else
    return 文件:read("*l")
  end
end
function 输入输出.写入(文件,内容)
  -- By: QQ32552732
  if type(文件)=="string" then
    local 临时文件=输入输出.打开(文件,"写入")
    输入输出.写入(临时文件,内容)
    输入输出.关闭(临时文件)
    --io.write(文件,内容)
   else
    文件:write(内容)
    输入输出.保存(文件)
  end
end
function 输入输出.追加(文件路径,内容)
  -- By: QQ32552732
  local 临时文件=输入输出.打开(文件路径,"追加")
  输入输出.写入(临时文件,内容)
  输入输出.关闭(临时文件)
end
function 输入输出.关闭(文件)
  -- By: QQ32552732
  if io.type(文件)=="closed file" then
    error("文件已被关闭，请勿重复关闭")
   else
    文件:close()
  end
end
function 输入输出.保存(文件)
  -- By: QQ32552732
  文件:flush()
end
function 输入输出.移动(原文件路径,新文件路径)
  -- By: QQ32552732
  if 原文件路径 and 新文件路径 then
    os.rename(原文件路径,新文件路径)
   else
    error("传入参数异常")
  end
end
function 输入输出.重命名(原文件路径,新文件路径)
  -- By: QQ32552732
  -- 注: 与 输入输出.移动 完全相同
  if 原文件路径 and 新文件路径 then
    os.rename(原文件路径,新文件路径)
   else
    error("传入参数异常")
  end
end
function 输入输出.删除(文件路径,是否文件夹)
  if 文件路径 then
    -- 多管闲事的删除路径判断
    if 匹配值({"/","/sdcard","/sdcard/","/data","/data/","/system","/system/",获取存储目录(),获取存储目录().."/"},文件路径)==nil and ((not 是否文件夹)or ((not(文件路径:find("/")==1))or 文件路径:match("/.+/.+/.+"))) then
      if 是否文件夹 then
        LuaUtil.rmDir(文件路径)
       else
        os.remove(文件路径)
      end
     else
      error("危险，删除 "..文件路径.." 将可能导致严重后果，造成无法挽回的损失")
    end
   else
    error("传入参数异常")
  end
end
function 输入输出.复制(原文件路径,新文件路径)
  if 原文件路径 and 新文件路径 then
    LuaUtil.copyDir(原文件路径,新文件路径)
   else
    error("传入参数异常")
  end
end

function 加载辅助功能库()--其实就是汉化函数以及增加一些辅助函数
  -- B﻿﻿y: Q﻿﻿﻿Q325﻿527﻿﻿32
  加载字符串函数=loadstring
  转为字符串=tostring
  转为数值=tonumber
  转为整型=tointeger
  function 转为布尔值(值)
    return 值 and true
  end
  引用=require
  导入=import
  设置布局=activity.setContentView
  获取脚本当前目录=activity.getLuaDir
  获取脚本SD卡目录=activity.getLuaExtDir
  获取宽度=activity.getWidth
  获取高度=activity.getHeight
  加载Dex=activity.loadDex
  加载Jar=activity.loadDex
  加载C模块=activity.loadLib
  注册广播接收者=activity.registerReceiver
  新活动=activity.newActivity
  向源活动返回=activity.result
  新异步任务=activity.newTask
  新线程=activity.newThread
  新定时器=activity.newTimer
  结束活动=activity.finish
  彻底退出=彻底退出
  Java迭代器=each
  Java列举迭代器=enum
  任务=task
  线程=thread
  调用线程方法=call
  设置线程变量=set
  定时器=timer
  载入Java类=luajava.bindClass
  创建Java接口=luajava.createProxy
  创建Java数组=luajava.createArray
  实例化Java类=luajava.newInstance
  实例化Java对象=luajava.new
  字符串编码转换=luajava.coding
  销毁Java对象=luajava.clear
  Java对象转为表=luajava.astable
  Java对象转为字符串=luajava.tostring
  中文函数作者QQ=325*100000+527*100+32
  载入布局表=loadlayout
  载入位图=loadbitmap
  字符串=string
  string.模式匹配替换=string.gsub
  string.模式匹配查找=string.find
  string.模式匹配捕获=string.match
  string.模式匹配全局捕获=string.gmatch
  string.截取=string.sub
  string.长度=string.len
  string.编码=string.byte
  string.解码=string.char
  string.序列化=string.dump
  string.格式化=string.format
  string.转为大写=string.upper
  string.转为小写=string.lower
  string.复制=string.rep
  string.反转=string.reverse
  string.模式匹配转义=模式匹配转义
  string.转为数值=tonumber
  string.转为整型=tointeger
  string.Base64编码=Base64编码
  string.Base64解码=Base64解码
  string.URL编码=URL编码
  string.URL解码=URL解码
  string.MD5模块加密=MD5模块加密
  string.MD5模块解密=MD5模块解密
  string.AES加密=AES加密
  string.AES解密=AES解密
  string.RSA加密=RSA加密
  string.RSA解密=RSA解密
  string.RC4加解密=RC4加解密
  string.MD5=获取文本MD5
  string.进制转换=进制转换
  string.解析颜色值=解析颜色值
  string.捕获网址=捕获网址
  string.匹配汉字=匹配汉字
  string.写入剪贴板=写入剪贴板
  string.分享=分享文本
  string.匹配正则表达式=匹配正则表达式
  string.正则表达式捕获=正则表达式捕获
  string.正则表达式替换=正则表达式替换
  string.正则表达式查找=正则表达式查找
  string.包含=包含文本
  string.打印=print
  string.转换编码=luajava.coding
  function string.为空(s)
    -- By: QQ32552732
    return s or s~="" or s~=" " or string.find(s,"^%s*$")
  end
  function string.非空(s)
    -- By: QQ32552732
    return not string.为空(s)
  end
  function string.替换(s,t,r)
    -- By: QQ32552732
    return string.gsub(s,模式匹配转义(t),r)
  end
  function string.查找(s,t)
    -- By: QQ32552732
    return string.find(s,模式匹配转义(t))
  end
  function string.捕获(s,t)
    -- By: QQ32552732
    return string.match(s,模式匹配转义(t))
  end
  function string.全局捕获(s,t)
    -- By: QQ32552732
    return string.gmatch(s,模式匹配转义(t))
  end
  function string.写入文件(s,f)
    -- By: QQ32552732
    输入输出.写入(f,s)
  end
  function string.追加文件(s,f)
    -- By: QQ32552732
    输入输出.追加(f,s)
  end
  表=table
  table.插入=table.insert
  table.移除=table.remove
  table.排序=table.sort
  table.连接=table.concat
  table.最大值=table.maxn
  table.迭代=table.foreach
  table.整数迭代=table.foreachi
  table.列出键=列出表键
  table.列出值=列出表值
  table.复制=复制表
  table.查找=从表中查找
  table.查找键=从表中查找键
  table.删除值=从表中删除值
  table.遍历=遍历表
  table.去重=表去重
  table.随机取值=表随机取值
  数学=math
  math.取绝对值=math.abs
  math.向上取整=math.ceil
  math.向下取整=math.floor
  math.取最大值=math.max
  math.取最小值=math.min
  math.圆周率=math.pi
  math.幂运算=math.pow
  math.开平方=math.sqrt
  math.取模=math.fmod
  math.取整数小数=math.modf
  math.随机数种子=math.randomseed
  math.随机数=math.random
  math.角度转弧度=math.rad
  math.弧度转角度=math.deg
  math.次方运算=math.exp
  math.自然对数运算=math.log
  math.正弦=math.sin
  math.余弦=math.cos
  math.正切=math.tan
  math.反正弦=math.asin
  math.反余弦=math.acos
  math.反正切=math.atan
  math.最大数=math.huge
  function math.取随机数(...)
    math.randomseed(tonumber(os.time()+(os.clock()*math.floor(0.0307193879*32552732))))
    return math.random(...)
  end
end

