注册获取外存权限
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)
}
}
}