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

如何在Flutter应用中获取Google Lens搜索结果

在Flutter中调用Google Lens并获取结果的实现方案

可以在Flutter中调用Google Lens并获取搜索结果,但你当前的代码仅实现了单向启动Lens的逻辑,没有处理结果返回。以下是具体的实现方案:

问题分析

你当前使用的AndroidIntent通过SEND action启动Lens,只是将图片传递给Lens应用,属于单向跳转,没有请求返回结果的机制,因此无法获取Lens的搜索结果。

实现步骤(Android端)

由于Google Lens的交互目前仅在Android上支持返回结果,我们需要通过Flutter Platform Channel与原生Android代码通信,使用startActivityForResult机制启动Lens并接收返回数据。

1. Flutter端代码

创建MethodChannel来调用原生方法,并等待结果返回:

import 'package:flutter/services.dart';

class GoogleLensHelper {
  static const _methodChannel = MethodChannel('your_app_channel/lens');

  /// 打开Google Lens并传入图片路径,返回搜索结果
  static Future<Map<String, dynamic>?> launchLensWithImage(String imagePath) async {
    try {
      final result = await _methodChannel.invokeMethod(
        'launchGoogleLens',
        {'imagePath': imagePath},
      );
      return result != null ? Map<String, dynamic>.from(result) : null;
    } on PlatformException catch (e) {
      print('Lens调用失败: ${e.message}');
      return null;
    }
  }
}

// 使用示例
// final lensResult = await GoogleLensHelper.launchLensWithImage('/storage/emulated/0/test.jpg');
// if (lensResult != null) {
//   // 处理返回的结果数据
// }

2. Android原生端代码

在MainActivity中注册MethodChannel,处理Lens启动请求并返回结果:

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import java.io.File

class MainActivity : FlutterActivity() {
    private val CHANNEL = "your_app_channel/lens"
    private val REQUEST_CODE_LENS = 1001
    private var lensResultCallback: MethodChannel.Result? = null

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "launchGoogleLens" -> {
                    val imagePath = call.argument<String>("imagePath")
                    if (imagePath.isNullOrEmpty()) {
                        result.error("INVALID_PARAM", "图片路径不能为空", null)
                        return@setMethodCallHandler
                    }
                    lensResultCallback = result
                    launchLens(Uri.fromFile(File(imagePath)))
                }
                else -> result.notImplemented()
            }
        }
    }

    private fun launchLens(imageUri: Uri) {
        val lensIntent = Intent().apply {
            action = "com.google.ar.lens.action.SEARCH"
            package = "com.google.ar.lens"
            data = imageUri
            type = "image/*"
            putExtra("com.google.ar.lens.extra.START_MODE", "image_search")
        }

        if (packageManager.resolveActivity(lensIntent, 0) != null) {
            startActivityForResult(lensIntent, REQUEST_CODE_LENS)
        } else {
            lensResultCallback?.error("LENS_NOT_FOUND", "未安装Google Lens应用", null)
            lensResultCallback = null
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_LENS && lensResultCallback != null) {
            when (resultCode) {
                RESULT_OK -> {
                    val resultMap = mutableMapOf<String, Any?>()
                    data?.extras?.let { extras ->
                        extras.keySet().forEach { key ->
                            resultMap[key] = extras[key]
                        }
                    }
                    lensResultCallback?.success(resultMap)
                }
                RESULT_CANCELED -> {
                    lensResultCallback?.error("USER_CANCELED", "用户取消了操作", null)
                }
                else -> {
                    lensResultCallback?.error("UNKNOWN_ERROR", "获取结果失败", null)
                }
            }
            lensResultCallback = null
        }
    }
}

注意事项

  • Google Lens版本兼容性:由于Google并未公开Lens的Intent API,上述代码可能随Lens版本更新失效,需要在目标设备上测试验证。
  • 权限配置:需要在AndroidManifest.xml中添加存储权限(读取本地图片时):
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
  • iOS限制:Google Lens在iOS上仅支持通过URL Scheme打开,无法返回搜索结果,因此iOS端暂时无法实现结果获取功能。

内容的提问来源于stack exchange,提问作者Haya Hesham Abdel-azim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:28:17