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)
        }
    }
}
相关推荐
ai小陈12 小时前
GPU服务器租用存储验收:检查点写入与磁盘吞吐实战
运维·服务器·人工智能·ai·ssh·gpu算力
PaperData12 小时前
1985-2025年全国区县专利申请与授权面板数据
数据库
snpgroupcn12 小时前
大数据量SAP迁移方案:系统越大,越不能硬搬
数据库·sap
Flynt13 小时前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
笃行35013 小时前
KingbaseES 数据加密全解:从 SSL 到全密态
数据库
Ivanqhz13 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
FPGA小徐14 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
有毒的教程14 小时前
VMware仅主机模式:物理机 ↔ 虚拟机 文件共享
运维
java1234_小锋15 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据类型简介
数据库·mysql
知行EDI15 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库