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

在Java Android项目中如何调用Kotlin库FotoApparat的whenAvailable方法?

在Java中调用FotoApparat的异步回调逻辑

刚好我之前处理过类似的跨Kotlin/Java调用的场景,其实核心是理解Kotlin高阶函数在Java中的兼容方式。FotoApparat的whenAvailable方法在Kotlin里接收一个函数类型参数,到了Java里会被转换成带有invoke方法的函数接口(比如Function1<BitmapPhoto, Unit>),我们只需要实现这个接口就能处理异步回调了。

下面直接给你两种Java实现方式:

1. 匿名内部类写法(兼容Java 7及以下)

这种写法不需要Java 8的lambda支持,兼容性更好:

// 先获取拍照结果
PhotoResult photoResult = fotoapparat.takePicture();

// 异步保存到文件的Java写法和Kotlin逻辑一致
photoResult.saveToFile(someFile);

// 转换为Bitmap并处理异步回调
photoResult.toBitmap()
           .whenAvailable(new Function1<BitmapPhoto, Unit>() {
               @Override
               public Unit invoke(BitmapPhoto bitmapPhoto) {
                   // 在这里处理获取到的BitmapPhoto
                   ImageView imageView = findViewById(R.id.your_image_view_id);
                   if (bitmapPhoto != null) {
                       imageView.setImageBitmap(bitmapPhoto.bitmap());
                   }
                   // Kotlin的Unit对应Java的void,这里必须返回Unit.INSTANCE
                   return Unit.INSTANCE;
               }
           });

2. Lambda写法(Java 8+推荐)

如果你的项目已经支持Java 8,用lambda会更简洁:

PhotoResult photoResult = fotoapparat.takePicture();

photoResult.saveToFile(someFile);

photoResult.toBitmap()
           .whenAvailable(bitmapPhoto -> {
               ImageView imageView = findViewById(R.id.your_image_view_id);
               if (bitmapPhoto != null) {
                   imageView.setImageBitmap(bitmapPhoto.bitmap());
               }
               return Unit.INSTANCE;
           });

注意事项

要确保你的Android项目配置了Java 8支持,否则lambda和部分函数接口会报错,在模块的build.gradle里添加以下配置:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:08:36