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)
        }
    }
}
相关推荐
wangqiaowq1 天前
windows下nginx的安装
linux·服务器·前端
星星也在雾里1 天前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
charlie1145141911 天前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
Agent手记1 天前
异常考勤智能预警与处理与流程优化方案 | 基于企业级Agent的超自动化实战教程
运维·人工智能·ai·自动化
cen__y1 天前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
雨辰AI1 天前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20241 天前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有1 天前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao1 天前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839491 天前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库