android13为账号密码做文件存储功能

注册获取外存权限

xml 复制代码
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

申请文件存入外存权限

kotlin 复制代码
// Activity中
// 1. 申请PackageManager
// 自己在onCreate调用这个initPermission
  private fun initPermission() {
        val REQUEST_STORAGE_PERMISSION = 1
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
            PackageManager.PERMISSION_GRANTED
        ) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_STORAGE_PERMISSION
            )
        } else {
            // 权限已授予,可以直接保存文件
//            saveEmailAndPassword("user@example.com", "password123")
            //LocalStorage.saveEmailAndPasswordExternal(this, "user@example.com", "password123")

        }
    }
// 2. 回调
 override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        val REQUEST_STORAGE_PERMISSION = 1
        if (requestCode == REQUEST_STORAGE_PERMISSION) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限请求成功
//                saveEmailAndPassword("user@example.com", "password123")

                //LocalStorage.saveEmailAndPasswordExternal(this, "user@example.com", "password123")
            } else {
                // 权限请求失败
                Toast.makeText(this, "Storage permission denied", Toast.LENGTH_SHORT).show()
            }
        }
    }

LocalStorage

kotlin 复制代码
object LocalStorage {
    private const val FILE_NAME = "user_data.txt"


    /**
     * 保存邮箱和密码到公共路径(Documents 目录)
     */
    fun saveEmailAndPasswordExternal(context: Context, email: String, password: String) {
        try {
            val documentsDir =
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
            // /storage/emulated/0/Documents
            Log.d("注册", documentsDir.absolutePath)
            val file = File(documentsDir, FILE_NAME)

            FileOutputStream(file).use { outputStream ->
                outputStream.write("$email\n$password".toByteArray())
            }

            // 打印文件路径
            println("File saved to: ${file.absolutePath}")
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    /**
     * 从公共路径(Documents 目录)读取邮箱和密码
     */
    fun getEmailAndPasswordExternal(context: Context): Pair<String, String?> {
        return try {
            val documentsDir =
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
            Log.d("注册", documentsDir.absolutePath)
            val file = File(documentsDir, FILE_NAME)

            if (!file.exists()) {
                return Pair("", null)
            }

            val data = file.readText()
            val lines = data.split("\n")
            Pair(lines[0], lines.getOrNull(1))
        } catch (e: IOException) {
            e.printStackTrace()
            Pair("", null)
        }
    }

    /**
     * 保存邮箱和密码到本地文件
     * 使用示例
     * LocalStorage.saveEmailAndPassword(context, "user@example.com", "password123")
     */
    fun saveEmailAndPassword(context: Context, email: String, password: String) {
        try {
            val fileDir = context.getFilesDir().absolutePath
            Log.d("注册", "File storage path: $fileDir")
            // /data/user/0/com.example.advanced_signin/files

            context.openFileOutput(FILE_NAME, Context.MODE_PRIVATE).use { outputStream ->
                outputStream.write("$email\n$password".toByteArray())
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     * 从本地文件获取邮箱和密码
     * 使用示例
     * val (email, password) = LocalStorage.getEmailAndPassword(context)
     * println("Email: $email, Password: $password")
     * @return Pair<String, String?>,第一个元素是邮箱,第二个元素是密码
     */
    fun getEmailAndPassword(context: Context): Pair<String, String?> {
        return try {
            val fileDir = context.getFilesDir().absolutePath
            Log.d("注册", "File storage path: $fileDir")

            context.openFileInput(FILE_NAME).use { inputStream ->
                val data = inputStream.bufferedReader().useLines { it.joinToString("\n") }
                val lines = data.split("\n")
                Pair(lines[0], lines.getOrNull(1))
            }
        } catch (e: Exception) {
            e.printStackTrace()
            Pair("", null)
        }
    }
}
相关推荐
云计算-Security7 分钟前
同(异)主机 Linux NAT 最佳实践
linux·服务器·网络
章老师说2 小时前
BFE v1.8.3 正式发布:AI网关能力再升级,企业级七层负载均衡持续进化
运维·人工智能·负载均衡
星释9 小时前
鸿蒙智能体开发实战:23.常见问题
服务器·华为·ai·harmonyos·鸿蒙·智能体
tiancaijiben9 小时前
阿里云SSL证书自动续签与部署完全指南:从托管服务到开源工具全方案解析
数据库
全堆鸿蒙9 小时前
25 数据库设计与表结构规划:5 张表的设计思路
数据库·华为·cocoa·harmonyos
笃行3509 小时前
【金仓数据库产品体验官】_坏得起_实测:备份恢复、PITR 时间穿越与主备切换——KingbaseES V9R3C18 深度体验(三)
数据库
小张成长计划..10 小时前
【Linux】10:冯·诺依曼体系结构和操作系统
linux·运维·服务器
笃行35011 小时前
从兼容到进阶:驱动直连、窗口函数与动态 SQL 实测——KingbaseES V9R3C18 深度体验(二)
数据库
笃行35012 小时前
MySQL 的 JSON 字段迁到金仓还能用吗?——KingbaseES V9R3C18 JSON 操作符与函数兼容实测
数据库
IpdataCloud13 小时前
跨境AI金融风险怎么防?IP风险画像的实战应用指南
数据库·tcp/ip·金融·ip