调用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权限相关的内容,无法理清所需信息。
解决方法
错误核心原因:
getOriginalFileName方法需要传入的是Context的实例对象,而你直接传了Context类本身,这就导致了编译错误。在Compose中获取Context实例:在@Composable函数里,通过
LocalContext.current可以获取当前有效的Context对象,先在AppNotice函数内声明:
val context = LocalContext.current
修正URI获取逻辑:你在回调里用
intent.getData()是错误的,选中文件的URI应该从activityResult.data?.data中获取,原intent只是启动选择器的载体,不会携带返回的结果。修正后的完整代码:
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
相关产品推荐
相关产品推荐

