使用带有 Kotlin 的 CameraKit 时应用程序崩溃
Posted
技术标签:
【中文标题】使用带有 Kotlin 的 CameraKit 时应用程序崩溃【英文标题】:App crashing while using CameraKit with Kotlin 【发布时间】:2019-11-08 13:03:08 【问题描述】:我一直在尝试使用 Kotlin 在我的应用中实现 CameraKit。我正在关注this 教程。它是用 Java 编写的,所以我将它转换为 Kotlin。
这是教程中的 main_activity.java:
import com.camerakit.CameraKitView;
public class MainActivity extends AppCompatActivity
private CameraKitView cameraKitView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraKitView = findViewById(R.id.camera);
@Override
protected void onResume()
super.onResume();
cameraKitView.onResume();
@Override
protected void onPause()
cameraKitView.onPause();
super.onPause();
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults);
这是我的 cameraScreen.kt 文件,相当于上面代码的 Kotlin:
package com.example.testapp
import com.camerakit.CameraKitView
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class cameraScreen : AppCompatActivity()
private var cameraKitView:CameraKitView
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera_screen)
cameraKitView = findViewById(R.id.camera)
override fun onResume()
super.onResume()
cameraKitView.onResume()
override fun onPause()
super.onPause()
cameraKitView.onPause()
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults)
我在private var cameraKitView:CameraKitView
行上收到此错误
属性必须被初始化或者是抽象的
这是我目前尝试过的
尝试使用lateinit
- 应用程序崩溃
尝试使用 abstract
- 应用崩溃
尝试将该行放入init...
块中。那么下层函数就看不到了。
请记住,所有这些相机内容都在另一个活动中,我使用一个按钮链接到我的主要活动。如果我删除 cameraScreen.kt 文件中的所有内容,则活动切换正常,所以我认为问题不存在。
我该如何解决这个问题?
【问题讨论】:
activity_main
长什么样子?
@Zun 没什么,只是一个链接指向 cameraScreen 活动的按钮
【参考方案1】:
你错过了
cameraKitView = findViewById(R.id.camera);
部分代码。您应该这样做或使用合成材料。
您还需要将var cameraKitView
更改为lateinit var cameraKitView
【讨论】:
我确实把线放在那里了。仍然遇到同样的错误 还需要声明为lateinit var
。
结合答案尝试了@tynn。我现在黑屏。我也授予该应用使用相机的权限【参考方案2】:
您需要初始化相机套件视图。
在 kotlin 中这样做:
var string : String
我不是在初始化一个字符串,它只是强输入或定义变量。
你需要告诉你的 cameraKitView 它指的是什么。
例如,如果您的 XML 如下所示:
<com.camerakit.CameraKitView
android:id="@+id/cv_cameraview"
android:keepScreenOn="true"
app:camera_facing="back"
app:camera_flash="auto"
app:camera_focus="continuous"
app:camera_permissions="camera">
</com.camerakit.CameraKitView>
在您的班级中,您需要在 oncreate 中执行此操作:
根据我的个人经验,不要忘记生命周期的其余部分:
private lateinit var cameraKitView: CameraKitView
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_punch)
cameraKitView = cv_camerkit
override fun onStart()
super.onStart()
cameraKitView.onStart()
override fun onResume()
super.onResume()
cameraKitView.onResume()
public override fun onPause()
cameraKitView.onPause()
super.onPause()
override fun onStop()
cameraKitView.onStop()
super.onStop()
【讨论】:
我不明白var cameraKitView: CameraKitView = cv_camerkit
部分。 = 之后是什么?另外,是否有必要包括生命周期的其余部分?
是的,对于这个库,否则当您恢复视图时它会给您一个黑屏。我编辑了我的答案,因为我不是要第二次添加 var。
另外我正在使用 androidx,所以我不必在课堂上初始化我的视图,例如:findViewById(R.id.camera);我可以参考视图名称
正如您所建议的,包括相机工作的整个生命周期。但是,如果我按下后退按钮返回主活动,然后再次进入相机活动,我会得到一个黑屏。请注意,我没有包含 cameraKitView = cv_camerkit
行,因为我不知道在 =
符号后面放什么。我的 XML 读取 android:id="@+id/camera"
可能将 cameraKitView.stop() 添加到您的 onbackpressed 函数中。也可以代替 cv_camerakit 使用相机以上是关于使用带有 Kotlin 的 CameraKit 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误
无法在带有 Kotlin 的 Android 中使用 Autodispose