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

Android中使用Clarifai gRPC客户端遇TLS ALPN Provider缺失异常求助

解决Clarifai gRPC客户端在Android上的TLS ALPN Provider缺失问题

这个错误的核心原因是gRPC需要TLS ALPN协议支持来建立HTTPS连接,但Android默认环境缺少对应的实现库,以下是几种可行的解决方法:

方法一:添加Conscrypt依赖

Conscrypt是Google官方维护的SSL/TLS实现库,能完美解决ALPN支持问题:

  1. 在Module级别的build.gradle中添加依赖:
dependencies {
    implementation 'org.conscrypt:conscrypt-android:2.5.2'
}
  1. 在自定义Application类中初始化Conscrypt(如果没有Application类需要先创建):
import org.conscrypt.Conscrypt;
import javax.net.ssl.SSLContext;
import android.app.Application;

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        try {
            SSLContext sslContext = SSLContext.getInstance("TLS", Conscrypt.newProvider());
            sslContext.init(null, null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 在AndroidManifest.xml中指定该Application类:
<application
    android:name=".MyApp"
    ...>
    <!-- 其他配置 -->
</application>

方法二:添加netty-tcnative依赖

netty-tcnative提供了预编译的BoringSSL静态库,也能提供ALPN支持:
在Module级别的build.gradle中添加依赖:

dependencies {
    implementation 'io.netty:netty-tcnative-boringssl-static:2.0.56.Final'
}

注意:需确保该版本与Clarifai客户端依赖的gRPC版本兼容。

方法三:自定义gRPC通道

如果默认的ClarifaiChannel无法自动适配,可以手动创建通道并指定SSL上下文:
修改doInBackground中的通道创建代码:

protected Boolean doInBackground(File... images) {
    // 手动构建gRPC通道
    ManagedChannel channel = NettyChannelBuilder.forAddress("api.clarifai.com", 443)
            .sslContext(GrpcSslContexts.forClient().build())
            .build();
            
    V2Grpc.V2BlockingStub stub = V2Grpc.newBlockingStub(channel)
            .withCallCredentials(new ClarifaiCallCredentials(API_KEY));

    // 后续请求代码保持不变
    MultiOutputResponse response = stub.postModelOutputs(PostModelOutputsRequest.newBuilder()
            .setModelId(MODEL_ID)
            .addInputs(Input.newBuilder()
                    .setData(Data.newBuilder()
                            .setImage(Image.newBuilder().setUrl(IMG_URL))))
            .build());

    if (response.getStatus().getCode() != StatusCode.SUCCESS) {
        throw new RuntimeException("Request failed, status: " + response.getStatus());
    }

    for (Concept c : response.getOutputs(0).getData().getConceptsList()) {
        System.out.println(String.format("%12s: %,.2f", c.getName(), c.getValue()));
    }
    
    // 记得关闭通道
    channel.shutdown();
    return true;
}

使用此方法需确保已添加Conscrypt或netty-tcnative依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:45