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

如何在Fyne开发的安卓应用中获取深度链接携带的参数值

解决方案

方案1:使用Fyne官方内置深度链接处理API(推荐)

Fyne 2.4及以上版本已经内置了跨平台的深度链接回调能力,不需要手动处理安卓Intent逻辑,直接调用SetOnOpenURL方法即可获取传入的完整链接:

package main

import (
	"net/url"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/widget"
)

func main() {
	myApp := app.New()
	win := myApp.NewWindow("OAuth2认证")
	codeDisplay := widget.NewLabel("等待授权码返回...")

	// 注册深度链接触发回调
	myApp.SetOnOpenURL(func(link *url.URL) {
		// 直接解析URL参数获取授权码
		authCode := link.Query().Get("code")
		if authCode != "" {
			codeDisplay.SetText("获取到授权码:" + authCode)
		}
	})

	win.SetContent(codeDisplay)
	win.ShowAndRun()
}

你已配置的AndroidManifest.xml不需要额外修改,正常使用fyne package -os android命令打包即可生效。

方案2:低版本Fyne手动通过JNI获取Intent数据

如果使用的Fyne版本低于2.4,可以通过GoMobile的JNI调用直接读取安卓Activity的Intent数据:

// #include <jni.h>
import "C"
import (
	"net/url"
	"unsafe"
	"golang.org/x/mobile/app"
)

func getDeepLinkData() (*url.URL, error) {
	var linkStr string
	app.RunOnJVM(func(envPtr, activityPtr uintptr) {
		// 获取当前Activity的Intent
		getIntentMethod := C.GetMethodID(
			(*C.jclass)(unsafe.Pointer(C.GetObjectClass((*C.jobject)(unsafe.Pointer(activityPtr))))),
			C.CString("getIntent"),
			C.CString("()Landroid/content/Intent;"),
		)
		intent := uintptr(C.CallObjectMethodV((*C.jobject)(unsafe.Pointer(activityPtr)), C.jmethodID(getIntentMethod), nil))
		if intent == 0 {
			return
		}

		// 获取Intent的Uri数据
		getDataMethod := C.GetMethodID(
			(*C.jclass)(unsafe.Pointer(C.GetObjectClass((*C.jobject)(unsafe.Pointer(intent))))),
			C.CString("getData"),
			C.CString("()Landroid/net/Uri;"),
		)
		uri := uintptr(C.CallObjectMethodV((*C.jobject)(unsafe.Pointer(intent)), C.jmethodID(getDataMethod), nil))
		if uri == 0 {
			return
		}

		// 把Uri转成字符串
		toStringMethod := C.GetMethodID(
			(*C.jclass)(unsafe.Pointer(C.GetObjectClass((*C.jobject)(unsafe.Pointer(uri))))),
			C.CString("toString"),
			C.CString("()Ljava/lang/String;"),
		)
		strObj := uintptr(C.CallObjectMethodV((*C.jobject)(unsafe.Pointer(uri)), C.jmethodID(toStringMethod), nil))
		if strObj == 0 {
			return
		}

		// 转成Go字符串
		cStr := C.GetStringUTFChars((*C.jstring)(unsafe.Pointer(strObj)), nil)
		linkStr = C.GoString(cStr)
		C.ReleaseStringUTFChars((*C.jstring)(unsafe.Pointer(strObj)), cStr)
	})

	if linkStr == "" {
		return nil, nil
	}
	return url.Parse(linkStr)
}

调用该方法即可拿到完整的深度链接对象,直接解析参数即可。

补充说明

你提到的Kotlin示例中读取的是Intent的Extra参数,但深度链接的URI是存储在Intent的Data字段中,不需要读取Extra,直接解析Data字段即可获取code参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:48:03