You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用getOriginalFileName传入Context类报错,如何获取正确Context实例?

问题与解决:分类器‘Context’没有伴生对象错误

错误信息

分类器‘Context’没有伴生对象,因此必须在此处初始化

用户代码

fun Uri.getOriginalFileName(context: Context): String? {
    return context.contentResolver.query(this, null, null, null, null)?.use {
        val nameColumnIndex = it.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        it.moveToFirst()
        it.getString(nameColumnIndex)
    }
}


@Composable
fun AppNotice() {
    
            val intent = Intent(Intent.ACTION_GET_CONTENT)
            intent.type = "*/*";
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
                activityResult ->   if (activityResult.resultCode == RESULT_OK)
            {
                Log.d("appDebug", "oky")
                var uri = intent.getData()
                val name: String? = uri?.getOriginalFileName(Context)
                Log.d("seeFile", "$name")
                 }

            else {
                Log.d("appDebug", "Denied")
            }
Button(onClick={launcher.launch(intent)})
{Text("Button")}
            }

用户疑问

Context是一个类,我该如何确定在val name: String? = uri?.getOriginalFileName(Context)这行代码中需要使用什么方法?我访问了android.dev文档,但页面内容繁杂,仅找到少量与URI权限相关的内容,无法理清所需信息。


解决方法

  1. 错误核心原因:getOriginalFileName方法需要传入的是Context的实例对象,而你直接传了Context类本身,这就导致了编译错误。

  2. 在Compose中获取Context实例:在@Composable函数里,通过LocalContext.current可以获取当前有效的Context对象,先在AppNotice函数内声明:

val context = LocalContext.current
  1. 修正URI获取逻辑:你在回调里用intent.getData()是错误的,选中文件的URI应该从activityResult.data?.data中获取,原intent只是启动选择器的载体,不会携带返回的结果。

  2. 修正后的完整代码:

import android.content.Intent
import android.net.Uri
import android.provider.OpenableColumns
import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext

fun Uri.getOriginalFileName(context: Context): String? {
    return context.contentResolver.query(this, null, null, null, null)?.use { cursor ->
        val nameColumnIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
        cursor.moveToFirst()
        cursor.getString(nameColumnIndex)
    }
}

@Composable
fun AppNotice() {
    val context = LocalContext.current
    val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
        type = "*/*"
        addCategory(Intent.CATEGORY_OPENABLE)
    }
    
    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
        if (activityResult.resultCode == android.app.Activity.RESULT_OK) {
            Log.d("appDebug", "oky")
            val uri = activityResult.data?.data
            val name: String? = uri?.getOriginalFileName(context)
            Log.d("seeFile", "$name")
        } else {
            Log.d("appDebug", "Denied")
        }
    }

    Button(onClick = { launcher.launch(intent) }) {
        Text("选择文件")
    }
}

内容的提问来源于stack exchange,提问作者Abx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:48:26