Android studio 如何从活动结果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

我对Android Kotlin编程非常陌生。我正在制作一个应用程序,使用Storage Access Framework创建、读取和删除文件。我通过实现不推荐的startActivityForResult意图来执行文件读取、创建和删除任务。我试图使用ActivityResultAPI实现它,但我被困在请求代码中,找不到它。 在新的实现中,有resultCode,但没有requestCode

我的意思如下。如何使用活动结果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)
        }
    }
}
如何从活动结果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)
            }
        }
    }