问题描述
@Composable
fun CameraPreviewScreen() {
val context = ContextAmbient.current
if (ActivityCompat.checkSelfPermission(
context,Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,MainActivity.required_PERMISSIONS,MainActivity.REQUEST_CODE_PERMISSIONS // get activity for `this`
)
return
}
}
解决方法
虽然上一个答案(def resource_path(relative_path: str) -> str:
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.dirname(__file__)
return os.path.join(base_path,relative_path)
browser = webdriver.Chrome(resource_path('drivers/chromedriver'))
browser.get(link)
-aware)确实是正确的,
我想提供一个更惯用的实现来复制粘贴。
ContextWrapper
由于 fun Context.getActivity(): AppCompatActivity? = when (this) {
is AppCompatActivity -> this
is ContextWrapper -> baseContext.getActivity()
else -> null
}
不可能将彼此包裹显着 次,因此递归在这里很好。
获取上下文
val context = LocalContext.current
然后使用上下文获取活动。创建一个扩展函数,并使用您的上下文调用此扩展函数,例如 context.getActivity()。
fun Context.getActivity(): AppCompatActivity? {
var currentContext = this
while (currentContext is ContextWrapper) {
if (currentContext is AppCompatActivity) {
return currentContext
}
currentContext = currentContext.baseContext
}
return null
}
,
您可以从投射上下文的可组合对象中获取活动(我还没有找到一种情况,即上下文不是活动)。但是,吉姆已经提到,这样做不是一个好习惯。
val activity = AmbientContext.context as Activity
当我只是在玩一些需要活动的代码(权限是一个很好的例子)时,我个人使用它,但是一旦使它起作用,我就将其移至活动并使用参数/回调。 / p>
,从Composable函数中获取活动被认为是不好的做法,因为您的composable不应与应用程序的其余部分紧密结合。除其他外,紧密的耦合将阻止您对组合物进行单元测试,并通常使重用变得更加困难。
查看您的代码,看起来您正在从可组合体内请求权限。再一次,这不是您想要在可组合对象内部执行的操作,因为可组合函数可以在每个框架中运行的频率相同,这意味着您将在每个框架中不断调用该函数。
相反,请在活动中设置相机权限,并通过参数传递(通过参数)可合成对象所需的任何信息以渲染像素。