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

从Flask服务器获取SVG图片时Android端出现空指针异常求助

问题解决:Android Jetpack Compose加载Flask返回SVG时出现白屏与NPE异常

问题背景

开发Android应用时,通过Jetpack Compose从Flask服务器获取SVG图片,直接访问Flask URL可正常显示SVG,但Android端使用rememberImagePainter配合SvgDecoder加载时出现白屏,并抛出以下NPE异常:

E/studio.deploy: Exception
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.android.tools.deploy.instrument.ResourceOverlays.getPackageName(ResourceOverlays.java:94)
...(省略后续栈信息)

可能的解决方案

1. 修复Flask端SVG生成与返回逻辑

Matplotlib生成的SVG可能包含额外非SVG内容,导致Android端解码器解析失败。修改generate_svg函数,确保输出纯SVG内容:

from flask import Flask, send_file
import matplotlib.pyplot as plt
from io import BytesIO

app = Flask(__name__)

def generate_svg():
    x = [1, 2, 3, 4, 5]
    y = [10, 15, 13, 18, 16]

    # 使用Agg后端避免GUI相关问题
    plt.switch_backend('Agg')
    fig, ax = plt.subplots()
    ax.plot(x, y)

    svg_output = BytesIO()
    fig.savefig(svg_output, format='svg', bbox_inches='tight')
    plt.close(fig)

    svg_output.seek(0)
    return svg_output

@app.route('/get_svg', methods=['GET'])
def get_svg(): 
    svg_file = generate_svg()
    # 明确设置响应头,确保MIME类型正确
    return send_file(
        svg_file,
        mimetype='image/svg+xml',
        headers={'Content-Disposition': 'inline; filename="plot.svg"'}
    )

if __name__ == '__main__':
    # 允许外部设备访问,关闭调试模式避免响应格式异常
    app.run(host='0.0.0.0', debug=False)

2. 解决Android Studio部署工具异常

栈信息显示异常来自Android Studio的部署工具(studio.deploy),可尝试以下操作:

  • 禁用Apply Changes功能:打开Android Studio设置 → Build, Execution, Deployment → Deploy → 取消勾选"Enable Apply Changes"
  • 清理项目缓存:点击菜单栏File → Invalidate Caches...,选择"Invalidate and Restart"
  • 卸载当前应用后重新安装:在设备上卸载应用,再点击Android Studio的"Run"按钮重新部署

3. 检查Android端依赖与加载逻辑

确保Coil相关依赖版本匹配,且加载逻辑正确:

  • 确认build.gradle中依赖版本一致(以最新稳定版为例):
dependencies {
    implementation("io.coil-kt:coil-compose:2.5.0")
    implementation("io.coil-kt:coil-svg:2.5.0")
}
  • 修改Compose加载逻辑,添加错误回调排查问题:
@Composable
fun SvgUrlFetch() {
    val imageUrl by remember { mutableStateOf("http://your-ip:5000/get_svg") }
    val context = LocalContext.current

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        val painter = rememberImagePainter(
            data = imageUrl,
            builder = {
                decoder(SvgDecoder(context))
                listener(
                    onError = { request, throwable ->
                        Log.e("SvgLoadError", "加载失败: ${throwable.message}")
                    }
                )
            }
        )

        Image(
            painter = painter,
            contentDescription = "动态SVG图表",
            modifier = Modifier.size(200.dp)
        )
    }
}

4. 测试本地SVG文件验证解码器

将Flask返回的SVG内容保存为本地文件,放在res/drawable目录下,测试是否能正常加载:

Image(
    painter = painterResource(id = R.drawable.local_svg),
    contentDescription = "本地SVG测试"
)

如果本地SVG能正常显示,说明问题出在网络请求或Flask响应格式上;如果仍无法显示,需检查SvgDecoder的配置或依赖。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:39