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)
        }
    }
}
相关推荐
火山上的企鹅几秒前
Codex实战:APP远程升级服务搭建(三)后台管理页面(APK 上传、版本管理、多应用页签)
服务器·网络·数据库·oracle·qgc
小啊曼13 分钟前
CIO实战方法论_11_组织变革打破部门墙
运维
❀搜不到36 分钟前
远程服务器codex使用本地cc-switch的deepseek api
运维·服务器
阿狸猿42 分钟前
论 NoSQL 数据库技术及其应用
数据库·nosql
FBI HackerHarry浩1 小时前
DataGrip2023.2.3默认保存的数据库和.sql文件在哪里?怎么修改默认路径?
数据库
袁小皮皮不皮1 小时前
3.HCIP OSPF补充知识(优化版)
服务器·网络·数据库·网络协议·智能路由器
运筹vivo@1 小时前
Python ContextVar 底层机制与内存模型拆解
前端·数据库·python
虾壳云官方1 小时前
OpenClaw 2.7.9 Windows 一键部署教程:零基础也能搭建 AI 自动化助手
运维·人工智能·windows·自动化·openclaw·openclaw一键部署
江南风月1 小时前
WGCLOUD保姆级教程最新版整理
运维·zabbix·运维开发·prometheus·日志审计
志栋智能2 小时前
超自动化巡检:知识沉淀与团队协作的新载体
大数据·运维·网络·数据库·人工智能·自动化