林军
林军
  • 发布:2025-03-04 15:48
  • 更新:2025-03-04 15:48
  • 阅读:82

uniapp在安卓13系统软件无法执行uni.navigateTo

分类:uni-app

在安卓13,通过android:sharedUserId="android.uid.system"获取系统权限。
显示出现白屏。可以通过集成 DCloudApplication。编写一个hookwebview方法来绕过。

@SuppressLint("SoonBlockedPrivateApi")  
    public static void hookWebView() {  
        int sdkInt = Build.VERSION.SDK_INT;  
        try {  
            Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");  
            Field field = factoryClass.getDeclaredField("sProviderInstance");  
            field.setAccessible(true);  
            Object sProviderInstance = field.get(null);  
            if (sProviderInstance != null) {  
                Log.i(TAG, "sProviderInstance isn't null");  
                return;  
            }  

            Method getProviderClassMethod;  
            if (sdkInt > 22) {  
                getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");  
            } else if (sdkInt == 22) {  
                getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");  
            } else {  
                Log.i(TAG, "Don't need to Hook WebView");  
                return;  
            }  
            getProviderClassMethod.setAccessible(true);  
            Class<?> factoryProviderClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);  
            Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");  
            Constructor<?> delegateConstructor = delegateClass.getDeclaredConstructor();  
            delegateConstructor.setAccessible(true);  
            if (sdkInt < 26) {// 低于Android O版本  
                Constructor<?> providerConstructor = factoryProviderClass.getConstructor(delegateClass);  
                if (providerConstructor != null) {  
                    providerConstructor.setAccessible(true);  
                    sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance());  
                }  
            } else {  
                Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD");  
                chromiumMethodName.setAccessible(true);  
                String chromiumMethodNameStr = (String) chromiumMethodName.get(null);  
                if (chromiumMethodNameStr == null) {  
                    chromiumMethodNameStr = "create";  
                }  
                Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass);  
                if (staticFactory != null) {  
                    sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance());  
                }  
            }  

            if (sProviderInstance != null) {  
                field.set("sProviderInstance", sProviderInstance);  
                Log.i(TAG, "Hook success!");  
            } else {  
                Log.i(TAG, "Hook failed!");  
            }  
        } catch (Throwable e) {  
            Log.w(TAG, e);  
        }  
    }

绕过之后进入app,无法跳转页面。

多次点击会提示

[ERROR]Waiting to navigate to: /pages/component/image/image, do not operate continuously: /pages/component/video/video.

在安卓11上是没有问题的。
uni开头的api都不能执行。
例如

uni.showToast({
title: '标题',
duration: 2000
});

2025-03-04 15:48 负责人:无 分享
已邀请:

要回复问题请先登录注册