Android studio 如何从活动结果API获取请求代码
我对Android Kotlin编程非常陌生。我正在制作一个应用程序,使用Storage Access Framework创建、读取和删除文件。我通过实现不推荐的startActivityForResult意图来执行文件读取、创建和删除任务。我试图使用ActivityResultAPI实现它,但我被困在请求代码中,找不到它。 在新的实现中,有resultCode,但没有requestCode 我的意思如下。如何使用活动结果API实现以下内容Android studio 如何从活动结果API获取请求代码,android-studio,kotlin,android-intent,activity-result-api,Android Studio,Kotlin,Android Intent,Activity Result Api,我对Android Kotlin编程非常陌生。我正在制作一个应用程序,使用Storage Access Framework创建、读取和删除文件。我通过实现不推荐的startActivityForResult意图来执行文件读取、创建和删除任务。我试图使用ActivityResultAPI实现它,但我被困在请求代码中,找不到它。 在新的实现中,有resultCode,但没有requestCode 我的意思如下。如何使用活动结果API实现以下内容 fun createFile() { val
fun createFile()
{
val filename: String = etFileName.text.toString()
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/*"
addCategory(Intent.CATEGORY_OPENABLE)
putExtra(Intent.EXTRA_TITLE, filename)
}
startActivityForResult(intent, WRITE_REQUEST_CODE)
}
fun readFile(){
etFileName.setText("")
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/*"
}
startActivityForResult(intent, READ_REQUEST_CODE)
}
fun deleteFile(uri: Uri){
val filename = queryName(contentResolver, uri)
DocumentsContract.deleteDocument(contentResolver, uri)
Toast.makeText(applicationContext, "Done deleting $filename", Toast.LENGTH_SHORT).show()
}
fun writeText(uri: Uri) : String{
//var writetext: String = "typing high speed"
var writeStream = contentResolver.openFileDescriptor(uri, "w")
val filename: String = queryName(contentResolver, uri)
etFileName.setText(filename)
var fileOutputStream = FileOutputStream(writeStream?.fileDescriptor)
fileOutputStream.write(filename.toByteArray())
fileOutputStream.close()
return filename.toString()
}
fun openFileContent(uri: Uri): String{
val inputStream = contentResolver.openInputStream(uri)
val reader = BufferedReader(InputStreamReader(inputStream))
val stringBuilder = StringBuilder()
val filename = queryName(contentResolver, uri)
etFileName.setText(filename)
var currentline = reader.readLine()
while (currentline != null) {
stringBuilder.append(currentline + "\n")
currentline = reader.readLine()
}
inputStream?.close()
val str = stringBuilder.toString()
Log.d("Uri Read", ": $str")
return str
}
private fun queryName(resolver: ContentResolver, uri: Uri): String {
val returnCursor: Cursor = resolver.query(uri, null, null, null, null)!!
val nameIndex: Int = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
returnCursor.moveToFirst()
val name: String = returnCursor.getString(nameIndex)
returnCursor.close()
return name
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Read", "$uri")
if (uri != null) {
val readfile: String = openFileContent(uri)
etContent.setText(readfile)
}
} else if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
resultData?.data?.also { uri ->
Log.i("Uri Write", "Uri: $uri") // 1
val write = writeText(uri) // 2
etContent.setText(write)
}
} else if (requestCode == DELETE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Delete", "$uri")
if (uri != null) {
deleteFile(uri)
}
}
}
如何从活动结果API获取请求代码
fun createFile()
{
val filename: String = etFileName.text.toString()
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = "text/*"
addCategory(Intent.CATEGORY_OPENABLE)
putExtra(Intent.EXTRA_TITLE, filename)
}
startActivityForResult(intent, WRITE_REQUEST_CODE)
}
fun readFile(){
etFileName.setText("")
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "text/*"
}
startActivityForResult(intent, READ_REQUEST_CODE)
}
fun deleteFile(uri: Uri){
val filename = queryName(contentResolver, uri)
DocumentsContract.deleteDocument(contentResolver, uri)
Toast.makeText(applicationContext, "Done deleting $filename", Toast.LENGTH_SHORT).show()
}
fun writeText(uri: Uri) : String{
//var writetext: String = "typing high speed"
var writeStream = contentResolver.openFileDescriptor(uri, "w")
val filename: String = queryName(contentResolver, uri)
etFileName.setText(filename)
var fileOutputStream = FileOutputStream(writeStream?.fileDescriptor)
fileOutputStream.write(filename.toByteArray())
fileOutputStream.close()
return filename.toString()
}
fun openFileContent(uri: Uri): String{
val inputStream = contentResolver.openInputStream(uri)
val reader = BufferedReader(InputStreamReader(inputStream))
val stringBuilder = StringBuilder()
val filename = queryName(contentResolver, uri)
etFileName.setText(filename)
var currentline = reader.readLine()
while (currentline != null) {
stringBuilder.append(currentline + "\n")
currentline = reader.readLine()
}
inputStream?.close()
val str = stringBuilder.toString()
Log.d("Uri Read", ": $str")
return str
}
private fun queryName(resolver: ContentResolver, uri: Uri): String {
val returnCursor: Cursor = resolver.query(uri, null, null, null, null)!!
val nameIndex: Int = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
returnCursor.moveToFirst()
val name: String = returnCursor.getString(nameIndex)
returnCursor.close()
return name
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Read", "$uri")
if (uri != null) {
val readfile: String = openFileContent(uri)
etContent.setText(readfile)
}
} else if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
resultData?.data?.also { uri ->
Log.i("Uri Write", "Uri: $uri") // 1
val write = writeText(uri) // 2
etContent.setText(write)
}
} else if (requestCode == DELETE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Delete", "$uri")
if (uri != null) {
deleteFile(uri)
}
}
}
由于上面的方法已被弃用,我尝试使用Intent launcher来实现它,但是任何地方都没有对requestCode的引用,所以我被困在这里。如下图所示:
val startforFile: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
result: ActivityResult ->
// could not find reference to requestCode here
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Read", "$uri")
if (uri != null) {
val readfile: String = openFileContent(uri)
etContent.setText(readfile)
}
} else if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
resultData?.data?.also { uri ->
Log.i("Uri Write", "Uri: $uri") // 1
val write = writeText(uri) // 2
etContent.setText(write)
}
} else if (requestCode == DELETE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val uri =resultData?.data
Log.d("Uri Delete", "$uri")
if (uri != null) {
deleteFile(uri)
}
}
}
val startforFile:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
//在此处找不到对requestCode的引用
if(requestCode==READ\u REQUEST\u CODE&&resultCode==Activity.RESULT\u OK){
val uri=resultData?.data
Log.d(“Uri读取”,“$Uri”)
if(uri!=null){
val readfile:String=openFileContent(uri)
etContent.setText(readfile)
}
}else if(requestCode==WRITE\u REQUEST\u CODE&&resultCode==Activity.RESULT\u OK){
结果数据?数据?也{uri->
Log.i(“Uri写入”,“Uri:$Uri”)//1
val write=writeText(uri)//2
etContent.setText(写入)
}
}else if(requestCode==DELETE\u REQUEST\u CODE&&resultCode==Activity.RESULT\u OK){
val uri=resultData?.data
Log.d(“Uri删除”,“$Uri”)
if(uri!=null){
删除文件(uri)
}
}
}
有人能告诉我如何正确执行吗?使用ActivityResultContracts.StartActivityForResult有两种方法
val startforFileRead:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
val uri=resultData?.data
Log.d(“Uri读取”,“$Uri”)
if(uri!=null){
val readfile:String=openFileContent(uri)
etContent.setText(readfile)
}
}
}
val startforFileWrite:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
结果数据?数据?也{uri->
Log.i(“Uri写入”,“Uri:$Uri”)//1
val write=writeText(uri)//2
etContent.setText(写入)
}
}
}
val startforFileDelete:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
val uri=resultData?.data
Log.d(“Uri删除”,“$Uri”)
if(uri!=null){
删除文件(uri)
}
}
}
const val REQUEST\u code=“REQUEST\u code”
//...
val startforFile:ActivityResultLauncher=
registerForActivityResult(ActivityResultContracts.StartActivityForResult()){result->
val requestCode=result.data?.extras?.getInt(请求代码)
if(requestCode==null){
Log.e(“FileResultLauncher”,“在数据意图中未返回任何请求代码。”)
return@registerForActivityResult
}
val uri=结果.data?.data
if(uri==null | | result.resultCode!=result|u OK){
Log.i(“FileResultLauncher”,“未返回Uri或结果不正常”。)
return@registerForActivityResult
}
何时(请求代码){
读取请求代码->运行{
Log.d(“Uri读取”,“$Uri”)
val readfile:String=openFileContent(uri)
etContent.setText(readfile)
}
写入请求代码->运行{
Log.i(“Uri写入”,“Uri:$Uri”)//1
val write=writeText(uri)//2
etContent.setText(写入)
}
删除请求代码->运行{
Log.d(“Uri删除”,“$Uri”)
删除文件(uri)
}
}
}
使用ActivityResultContracts有两种方法。StartActivityForResult
val startforFileRead:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
val uri=resultData?.data
Log.d(“Uri读取”,“$Uri”)
if(uri!=null){
val readfile:String=openFileContent(uri)
etContent.setText(readfile)
}
}
}
val startforFileWrite:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
结果数据?数据?也{uri->
Log.i(“Uri写入”,“Uri:$Uri”)//1
val write=writeText(uri)//2
etContent.setText(写入)
}
}
}
val startforFileDelete:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
结果:ActivityResult->
if(resultCode==Activity.RESULT\u确定){
val uri=resultData?.data
Log.d(“Uri删除”,“$Uri”)
if(uri!=null){
删除文件(uri)
}
}
}
const val REQUEST\u code=“REQUEST\u code”
//...
val startforFile:ActivityResultLauncher=
ActivityResult注册表(ActivityResultContracts.StartActiv
const val REQUEST_CODE = "REQUEST_CODE"
//...
val startforFile: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val requestCode = result.data?.extras?.getInt(REQUEST_CODE)
if (requestCode == null) {
Log.e("FileResultLauncher", "No REQUEST_CODE was returned in data intent.")
return@registerForActivityResult
}
val uri = result.data?.data
if (uri == null || result.resultCode != RESULT_OK) {
Log.i("FileResultLauncher", "No Uri returned or result wasn't OK.")
return@registerForActivityResult
}
when (requestCode) {
READ_REQUEST_CODE -> run {
Log.d("Uri Read", "$uri")
val readfile: String = openFileContent(uri)
etContent.setText(readfile)
}
WRITE_REQUEST_CODE -> run {
Log.i("Uri Write", "Uri: $uri") // 1
val write = writeText(uri) // 2
etContent.setText(write)
}
DELETE_REQUEST_CODE -> run {
Log.d("Uri Delete", "$uri")
deleteFile(uri)
}
}
}