MENU

AutoJS 选择手机内文件并获取文件路径

March 5, 2023 • Read: 736 • 默认分类,脚本

有时候脚本需要读文件数据,手写路径比较麻烦,写死又不太灵活,可以通过如下方式实现自定义选择文件

  1. 首先在 ui 线程创建一个简单的按钮用于触发选择文件事件
ui.layout(
    <frame>
        <vertical h="auto" align="center">
            <horizontal>
                <button w="auto" id="selectFile" text="选择文件" />
                <text w="*" id="path" text="请选择文件!" />
            </horizontal>
            <horizontal layout_width="match_parent">
                <button id="start" gravity="center" layout_weight="1" text="开始运行" />
                <button id="stop" layout_width="100" text="退出" />
            </horizontal>
        </vertical>
    </frame>
);
  1. 创建选择文件按钮点击事件, 在这之前需要导入所需要的 Class,建议放置顶部,即 "ui"; 下方
importClass(android.content.Intent)
importClass(android.graphics.BitmapFactory)
importClass(android.provider.MediaStore)
importClass(android.webkit.MimeTypeMap)
  1. 下面是选择文件按钮监听事件,我这里是通过 intent.setType("text/plain") 限制了文件类型为 txt,如果不限制类型将 text/plain 设置为 * 即可
ui.selectFile.click(() => {
    let intent = new Intent()
    intent.setType("text/plain")
    intent.setAction(Intent.ACTION_GET_CONTENT)
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    activity.startActivityForResult(intent, 1)
})
  1. 监听选择文件后事件
ui.emitter.on("activity_result", (requestCode, resultCode, data) => {
    if (resultCode !== -1) {
        toastLog("没有选择文件!")
        return false
    }
    let uri = data.getData()
    let path = uri.getPath()
    if (!path.endsWith(".txt")) {
        toastLog("该文件不可用或文件类型错误!")
        return false
    }
    
    // 适配路径
    let resultPath = replacePath(path)
    if(!files.exists(resultPath)) {
        toastLog(`当前路径未兼容,请联系开发人员处理!(${path})`)
        return false
    }
    console.log(`已选择文件:${resultPath}`)
    // 将路径展示到ui界面
    ui.path.setText(resultPath)
})
  1. 我这里获取到的文件路径直接用过 files.exists() 无法识别到,所以做了一个适配处理,如下函数
function replacePath(path) {
    let rules = [
        {prefix: "/document/primary:", length: 18},
        {prefix: "/external_files/", length: 16},
        {prefix: "/sdcard/", length: 8}
    ]
    // 获取外部存储器的根目录路径
    // let rootDir = Environment.getExternalStorageDirectory().getAbsolutePath()
    let resultPath = "/sdcard/"
    // 直接拼接并判断是否存在
    if(files.exists(resultPath + path)) {
        return resultPath + path
    }
    // 否则按规则替换拼接
    for (let i = 0; i < rules.length; i++) {
        let rule = rules[i];
        if(path.startsWith(rule.prefix)) {
            resultPath += path.substring(rule.length)
            break;
        }
    }

    return resultPath;
}

原作者的 AutoJS Pro 目前对于无障碍这块没有什么可玩性了,推荐 AutoJS6 由 SuperMonster003 维护,基于原 AutoJS.v4.1 仓库版本,无任何限制!

Last Modified: December 25, 2023