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)
        }
    }
}
相关推荐
牛奶咖啡131 小时前
关系数据库MySQL的常用基础命令详解实战
数据库·mysql·本地远程连接到mysql·创建mysql用户和密码·修改mysql用户的密码·设置mysql密码的使用期限·设置和移除mysql用户的权限
ANYOLY2 小时前
Redis 面试宝典
数据库·redis·面试
鲲志说2 小时前
数据洪流时代,如何挑选一款面向未来的时序数据库?IoTDB 的答案
大数据·数据库·apache·时序数据库·iotdb
没有bug.的程序员2 小时前
MVCC(多版本并发控制):InnoDB 高并发的核心技术
java·大数据·数据库·mysql·mvcc
tritone4 小时前
我在阿贝云免费服务器上搭建RustDesk自建服务器(Self-Hosting)的真实体验【推荐】
运维·服务器
2301_800050994 小时前
DNS 服务器
linux·运维·笔记
慌糖4 小时前
自动化接口框架搭建分享-pytest第二部分
运维·自动化·pytest
Lin_Aries_04214 小时前
容器化简单的 Java 应用程序
java·linux·运维·开发语言·docker·容器·rpc
脑花儿4 小时前
ABAP SMW0下载Excel模板并填充&&剪切板方式粘贴
java·前端·数据库
SELSL4 小时前
SQLite3的API调用实战例子
linux·数据库·c++·sqlite3·sqlite实战