使用带有 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 时处理网络错误

做自己生活的导演:华为CameraKit为你加持大师光环

无法在带有 Kotlin 的 Android 中使用 Autodispose

带有多个参数的 Kotlin 补全

带有 Kotlin 的 Android 中的 HTTP 请求

带有 Spring Boot 2.0 @ConfigurationProperties 的 Kotlin 无法正常工作