如何在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
相关产品推荐
相关产品推荐

